• Linux Forum
  •  » 
  • Linux Kernel
  •  » 
  • Создание модуля для недоступного в исходниках ядра

#1 25.03.2014 14:20:47

Zolg
Administrator
Зарегистрирован: 25.03.2014
Сообщений: 7
IP-адрес

Создание модуля для недоступного в исходниках ядра

Есть железяка, работающая под linux (с очень большой вероятностью - на основе MontaVista). Ядро 2.6.37 (очень врядли ванильное). Исходников нет, на GPL производитель клал. Процессор в железяке ARM (TI811X). Есть возможность исполнять скрипты и бинарники от рута. Этим возможности взаимодействия исчерпываются (консоли нет). Linux сильно урезан.
Желая возможности железки расширить решил подпихнуть ей недостающие для полного счастья модули ядра.

Не буду описывать всего долгого пути, однако пока что он закончился в следующем тупике:
Используя ванильное ядро 2.6.37 собираю хрестоматийный printk(KERN_ALERT "Hello, world\n"); модуль.

  • vermagic совпадает со штатными бинарными модулями железяки (vermagic=2.6.37 mod_unload ARMv7 )
  • insmod отрабатывает без ошибок
  • в /proc/modules модуль появляется (hello 657 0 - Live 0xbf30b000)
  • но судя по всему код из module_init() никогда не выполняется


причем я сначала грешил на неработу printk() в железяке (хотя в родных модулях printk() отрабатывает нормально) и как маркер решил использовать обращение к null pointer (kernel panic сигнализировал бы о выполнении кода), но нет: модуль числится в загруженных, а система работает как ни в чем не бывало.

Что это вообще за чертовщина может быть ?

#2 25.03.2014 16:00:55

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

Создание модуля для недоступного в исходниках ядра

в порядке идеи, можно выцыганить один или несколько родных модулей и посмотреть objdump'ом что в них есть... может наведёт на какие-то мысли...

на всякий пожарный, дай код и вывод objdump -t своего hello.ko, а то может забыл что-то... например module_init(); =)

#3 26.03.2014 10:10:04

Zolg
Administrator
Зарегистрирован: 25.03.2014
Сообщений: 7
IP-адрес

Создание модуля для недоступного в исходниках ядра

#4 26.03.2014 14:41:26

Zolg
Administrator
Зарегистрирован: 25.03.2014
Сообщений: 7
IP-адрес

Создание модуля для недоступного в исходниках ядра

#5 27.03.2014 07:33:13

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

Создание модуля для недоступного в исходниках ядра

Quote by Zolg
Обратил внимание, на то, что в hello-модуле init находится в секции .text (а не .init.text), подправил. Но, увы, на результат не повлияло.

тоже сначала подумал, но т.к. это только маркер __init, то он, понятно, ни чего не делает...
гм... быстро идеи кончились... =((

#6 27.03.2014 08:16:08

Zolg
Administrator
Зарегистрирован: 25.03.2014
Сообщений: 7
IP-адрес

Создание модуля для недоступного в исходниках ядра

Грешил еще на возможную проверку контрольных сумм/подписей, но нет: родной модуль с патченым (в бинарнике) module_init ведет себя совершенно предсказуемо.

#7 27.03.2014 08:31:00

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

Создание модуля для недоступного в исходниках ядра

может в дополнению к objdump'у курнуть вывод readelf, хотя не уверен, что там что-то новое будет...

#8 27.03.2014 09:26:45

Zolg
Administrator
Зарегистрирован: 25.03.2014
Сообщений: 7
IP-адрес

Создание модуля для недоступного в исходниках ядра

нашел представляющимися мне могущими иметь значение различия в атрибутах aeabi:

самосборный модуль:



родной:


А какими опциями конфигурации на параметры ARM EABI влиять можно ?

#9 27.03.2014 10:23:58

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

Создание модуля для недоступного в исходниках ядра

Quote by Zolg
А какими опциями конфигурации на параметры ARM EABI влиять можно ?

точно не знаю... я бы начал копать в сторону опций gcc, но на скорую руку ничего не нашёл...

#10 28.03.2014 08:53:07

Zolg
Administrator
Зарегистрирован: 25.03.2014
Сообщений: 7
IP-адрес

Создание модуля для недоступного в исходниках ядра

Ура, заработало !

<1>[   13.497392] Hello, world



Правда, в чем конкретно была проблема, увы не скажу: в недрах TI шного сайта нашел исходники ядра для evaluation board по мотивам которой, как подозреваю, железяка и была сделана. Да-да, версия в техасовских исходниках 2.6.37.
Собрал я модуль с ними, перекинул на устройство и... опять нихрена не заработало.
Но на сей раз не заработало по-другому, в логах появились ошибки, по итогам изучения которых был подкручен конфиг и все завелось.
Fat-Zer большое спасибо за то, что не дал застрять в тупике.

#11 30.03.2014 10:58:29

Olej
Administrator
Зарегистрирован: 07.12.2011
Сообщений: 171
IP-адрес

Создание модуля для недоступного в исходниках ядра

Есть железяка, работающая под linux (с очень большой вероятностью - на основе MontaVista). Ядро 2.6.37 (очень врядли ванильное). Исходников нет, на GPL производитель клал.


Вообще то, для написания модулей ядра сами исходники ядра совершенно не нужны. *OK*
Достаточно хэдеров, ... и некоторой сообразительности.
Посмотрите здесь: Драйверы и модули ядра Linux (обновление)

#12 31.03.2014 06:42:26

Zolg
Administrator
Зарегистрирован: 25.03.2014
Сообщений: 7
IP-адрес

Создание модуля для недоступного в исходниках ядра

Спасибо, Кэп.
Только вот, незадача: мне почему-то не очень улыбается с нуля писать функционал из штатных модулей ядра, которые Clarion забыл скомпилировать (и исходники он кстати целиком зажал, вместе с хедерами).

  • Linux Forum
  •  » 
  • Linux Kernel
  •  » 
  • Создание модуля для недоступного в исходниках ядра

Board footer