Компиляция модулей.

Тема в разделе "WASM.UNIX", создана пользователем featurelles, 9 ноя 2009.

  1. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Добрый день, хотел узнть. как правильно производить сборку модулей)

    У меня ОС Mandriva 2.6.29.6-desktop-2mnb , kernel-header установлены ( если сравнивать исходники установленные Мандривой, с исходниками с оф сайта linux, то видно что многих файлов нет (с нужными мне функциями) ).

    Например, мне нужно вызвать функцию ip_rcv_finish должна находиться в /net/ipv4/ip_input.c но в исходниках установленных Мандривой такого файла нет, ну и соответственно нет данной функции и при попытке компиляции выскакивает ошибка с надписью, что функция не определена. (хотя если в модуле не применять данную функцию, то он скомпилируется без проблем, и если в нём будет какой-то косяк при работе со стеком ip, вызывающий панику ядра, то oops покажет trace где видно , что ip_rcv_finish есть ...и когда-то там была пройдена).
    В make файле записано obj-m += init.o
    Компилирую так make -C /usr/src/linux-`uname -r` SUBDIRS=$PWD
    Если попытаться скомпилировать модуль с исходниками с оф сайта, то выдаётся такое сообщение
    Собственно хотелось бы узнать, что я делаю неправильно при сборке модуля. Как всёже не испытывать проблем с функциями наподобии ip_rcv_finish ?
    И ещё дополню вопрос. Как лучше писать код( или ещё чего ) чтоб модуль подходил для работы на ядрах > 2.6.x ( а то оно меняется слииишком быстро, (изменяются названия функций, структуры и тд..) )
     
  2. friackazoid

    friackazoid New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2009
    Сообщения:
    102
    Ну во первых есть очень хорошая книжка от O'Relly "The Linux Kernel Module Programming Guide". По поводу слишком быстро меняющегося ядра тебе на kernel.org И прочитать их README и документ о жизненном цикле ядра. Быстрота его смены вопрос очень холиварский, см ядро используемое ред хатом, см ядра бсд.
    По поводу сетевой подсистемы ядра есть книжка от вильямс помоему, которая тоже так и называется сетевая подсистема ядра линукс

    По поводу твоего вопроса, то ты сам видел что нужная тебе функция лежит в .c файле а в пакете kernel-headers только хедеры, как это следует из названия пакета. Сорцы ядра срокее всего лежат в пакете kernel-sources хотя не знаю как обстоит дело у мандривы. К тому же если эта функция определена только в .c файле то с чего ты решил что сторонние модули могут иметь к ней доступ, вполне возможно на нее есть какой нибудь врапер к которому есть доступ и который и должен исползоватся модулями, а вполне возможно что эта функция может использоватся только внутри ядра линукс или даже вообще только конкретно в том механизме в котором она описана.

    Вообще если расскажешь подробнее что ты хочешь сделать попробую чего нибудь посоветовать.

    ЗЫЫ мое личное ИМХО в том что разработку стоит вести не на ядре конкретного дистрибутива а на исходниках взятых с джита кернелорга
     
  3. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    O'Relly "The Linux Kernel Module Programming Guide" читал, то что нашёл на русском. До сих пор не ясно как в make пишутся правила для сборки..пытался разобраться, не получилось.
    Книжка по сетям, называется "Сетевая архитектура Linux" и я её изучил достаточно хорошо. =)

    А разве модуль , как только он "insmod" не становится частью ядра? способным на всё и вся?! Кстати говоря, модули: nf_defrag_ipv4, iptable_raw, nf_conntrack_ipv4, iptable_mangle и тд. Вроде как модули безопастности, но обойти их, через другой модуль достаточно просто.
    Вот мне нужно поставить хук на net_rx_action .. Так как это часть сетевого стека ядра, думаю модулю не проблема получить к этой функции доступ. Пробовал с функцией eth_type_trans (она находится ниже чем net_rx_action ) , хук ставится без проблем. Данные контролируются и тд..

    Вообще у меня щас вопрос стоит не в знаниях ядра, сетевого стека или чего ещё в программинге. А конкретно, всякие.. наверное глупые вещи, наподобии "как правильно компилировать" , "как правильно задать команды в make", "какой средой разработки пользоваться для удобства" ( кстати это актуально, а то я пользуюсь только kwriter ... и получается что кода на "примерно" 10к строк, а удобства и скорости разработки никакой... ).
    Хотелосьбы узнать ещё, как отладочный вывод лучше делать, а то в коде printk(" "); задолбал. Так как после запуска модуля приходится делать это.
    clear && clear && insmod init.ko && sleep 3 && tail -n1000 /var/log/messages > /home/featurelles/TEST_1 && chmod a+rwx /home/featurelles/TEST_1 && rmmod init
    Чтоб записать вывод в файлик TEST_1 чтоб далее его открыть,и проаналезировать (через поиск свою писанину выведенную модулем искать).

    Вобщем, приму к сведению любые наставления на путь истенный, как и что нужно лучше делать.
     
  4. friackazoid

    friackazoid New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2009
    Сообщения:
    102
    Не совсем так. Модуль действительно выполняется с теми же привилегиями что и код ядра, то есть на нулевом кольце и действительно способен на все и вся. Но вот с обращением к экспортируемым переменным несколько сложнее. Поясню на примере: наверняка видел примеры старых руткитов которые экспортируют sys_call_table и далее творят всякие безобразия, однако этот номер уже очень давно не прокатывает так как переменную sys_call_table давно убрали из таблици экспорта, так что никакой подгружаемый модуль к ней обратится не может. Однако напрямую (по адресу) к участку памяти содержащему эту переменную обратится можно что и делают более современные руткиты. Эта тема достаточно поробно, но к сожалению не до концы (время, время...) освещена в нашем блоге (см. подпись).
    Там кстати, к сожалению не дописаный, цикл статей по моей курсовой о взломах подобных систем защит =) Но могу поделится опытом по этому поводу

    На вторую часть вопроса пожалуй может ответить sevik.ru/syslinux/pdf/sys_linux.pdf
     
  5. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Насчёт sys_call_table, и подмены указателей на функции. Вообще какой смысл что-то создавать на таком уровне? Ведь легко обнаруживается.. или я не прав?
     
  6. Clear__Energy

    Clear__Energy New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2009
    Сообщения:
    432
    Очень хорошая IDE, на мой вкус, Netbeans
     
  7. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Clear__Energy
    Угу, спасибо =) поставил ... понравилась. Только вот, как там поставить приоритетные языки СИ + асм(в интеловской нотации) ? Или она только на java рассчитана?

    Теперь перейду к компиляции, скачал через urpmi kernel-source
    при попытке собрать модуль, выдалась ошибка
    После чего я выполнил две команды make oldconfig && make prepar

    Далее при повторной попытке сборки. Выводятся всякие предупреждения ( при анализе кода, даже осмелюсь предположить, что компилятор создал асм код, но модуль не создаётся ). Вместо окончания успешной компиляции выдаёт следующее
    Значит захожу в /usr/src/linux-2.6.29.6-1mnb/scripts/mod
    Как видно, modpost существует.
    делее
    [root@localhost mod]# sh ./modpost
    ./modpost: ./modpost: cannot execute binary file

    Как устранить ошибку 127 ??? И произвести нормальную сборку модуля =)
     
  8. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Ошибку 127 убрал, и появился сразу новый вопрос.
    Я при компиляции указал папку с хидерами ядра
    /usr/src/linux-2.6.29.6-1mnb
    а у меня ядро 2.6.29.6-desktop-2mnb
    после компиляции, был создан файл .ko
    пытаюсь его загрузить для теста, а он выдаёт
    insmod: error inserting 'init.ko': -1 Unknown symbol in module
    Почему такое происходит?
    (а когда компилирую с /usr/src/2.6.29.6-desktop-2mnb то модуль подгружается в ядро без каких либо проблем )
     
  9. friackazoid

    friackazoid New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2009
    Сообщения:
    102
    Это как ра з и происходит из-за того что я описала выше, что функция которую ты используешь не является экспортируемой, и что объясняла на примере с syscall_table.
    Или из-за лицензии на твой модуль, что ты передаешь в макрос MODULE_LICENSE?
     
  10. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Объясните мне =) что такое экспортируемые и не экспортируемые функции ?
    Как я понимаю, если функция экспортируемая, то к ней можно получить прямой доступ из модуля.
    А если не экспортируемая, то приходится своими ручками искать адрес нужной функции¸ а дальше .... ну я думаю тут всё ясно.

    insmod: error inserting 'init.ko': -1 Unknown symbol in module
    Тут внимание пожалуйста, компилировал модуль с версией ядра linux-2.6.29.6-1mnb , и если бы я попытался сделать экспорт символа...скажем тойже sys_call_table ( нахождение которой, на мой взгляд абсолютно бессмысленно ), то компилятор бы просто выдал ошибку, что функция не найдена..или ещё чего. И файл .ko не создался бы. В моём случаи, компилятор ничего не сказал, всё скомпилировал, то что нужно создал. При попытке insmod подуль выдаёт выше написанную ошибку ( Unknown symbol in module ). Но если точно такойже код, без каких либо изменений, скомпилировать указав при компиляции не linux-2.6.29.6-1mnb а мою текущую версию ядра 2.6.29.6-desktop-2mnb то модуль скомпилируется, также без проблем, insmod загрузит в ядро мой модуль, и он будет работать без проблем( не будет никаких ошибок!!!..как при первом способе компиляции )
    .
    Сейчас установил linux-2.6.31.0 ( теперь буду переписывать модуль под эту версию ядра (в основном структуры надо переделать) ). Как всё поправлю, попытаюсь свой модуль скомпилить на этой версии ядра, и посмотрю что будет. Кстати, неужели так свои модули предётся для каждой новой версии ядра поправлять???

    А в MODULE_LICENSE пока не пишу ничегошеньки =)
    И так как вопрос коснулся лицензий на модули,то грех будет не спросить. Как дела обстоят с выпуском коммерческих модулей? не под GPL( gpl - зло ). Какие функции ядра можно будет использовать в таком модуле?( у Д. Бовета написано, что такому модулю не будут доступны многие, очень важные возможности ядра ) .Вот и хотелось бы узнать, о возможном будущем коммерческих разработок под данную ось.
     
  11. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    И ещё дополню, где помимо файла /boot/System.map подсматривать адреса функций?
     
  12. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Так как редактирования нет, то и возможности дописать данный вопрос в предыдущие сообщения, нету.
    Потому приходится писать новое сообщенице.
    Касается хеш функций в линексе.(встречаются мне достаточно часто). Как именно они устроены? как располагаются в памяти? каким образом ядро делает из них выборку?
     
  13. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
  14. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    _ir4_Y_
    Спасибо за ссылки, щас посмотрю.
     
  15. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    _ir4_Y_
    Какой смысл модуль писать на ассемблере? какие плюсы? ( хоть я сам и обажаю асм но всёже ), ведь на асме не напишешь столько кода, сколько может потребоваться.
     
  16. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    На чистом асме модули писать крнечно не удобно. Удобно писать часть кода на С а часть на асме например низкоуровневые системные функции
    (получение адреса на который передает управление команда syscall)

    Мдульное программирование рулит )
     
  17. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    _ir4_Y_
    А насчёт этого чтонить известно?
     
  18. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    Ниразу не сталкивался и не задумался на тему написания комерческих модулей ...
    Если не секрет что такое комерческое можно разработать для ядра линукса ?
     
  19. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    _ir4_Y_
    Хм ну не знаю.. всё что угодно наверное.

    Просто, если программист не сможет заработать себе на жизнь программируя для данной ОС ( а на изучение её, тратится время, силы, нервы.. ) то на кой чёрт, тратить силы и своё время на её изучение? раз толку 0.
    Да и писать что-то для неё, если это не даст возможность купить кусок хлеба. Если программер хороший, то он естественно потратит своё время, на программинг того, что принесёт ему пользу, а не на то, что..пишешь , пишешь.. написал. И не понятно зачем это делалось.
     
  20. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    А как связаны выпуск комерческих модулей и заробатывание денег ?)
    Например есть опен-сорс проекты под лицензией GPL в разработку которых компании вкладывают деньги.

    Програмисты получаю деньги не за продажу а за разработку

    К примеру Qt библиотека доступна абсолютно бесплано а компания Nokia вкладывает в ее развитие деньги
    Аналогично ядро Линукса развивают Novell redhat