Добрый день, хотел узнть. как правильно производить сборку модулей) У меня ОС 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 ( а то оно меняется слииишком быстро, (изменяются названия функций, структуры и тд..) )
Ну во первых есть очень хорошая книжка от O'Relly "The Linux Kernel Module Programming Guide". По поводу слишком быстро меняющегося ядра тебе на kernel.org И прочитать их README и документ о жизненном цикле ядра. Быстрота его смены вопрос очень холиварский, см ядро используемое ред хатом, см ядра бсд. По поводу сетевой подсистемы ядра есть книжка от вильямс помоему, которая тоже так и называется сетевая подсистема ядра линукс По поводу твоего вопроса, то ты сам видел что нужная тебе функция лежит в .c файле а в пакете kernel-headers только хедеры, как это следует из названия пакета. Сорцы ядра срокее всего лежат в пакете kernel-sources хотя не знаю как обстоит дело у мандривы. К тому же если эта функция определена только в .c файле то с чего ты решил что сторонние модули могут иметь к ней доступ, вполне возможно на нее есть какой нибудь врапер к которому есть доступ и который и должен исползоватся модулями, а вполне возможно что эта функция может использоватся только внутри ядра линукс или даже вообще только конкретно в том механизме в котором она описана. Вообще если расскажешь подробнее что ты хочешь сделать попробую чего нибудь посоветовать. ЗЫЫ мое личное ИМХО в том что разработку стоит вести не на ядре конкретного дистрибутива а на исходниках взятых с джита кернелорга
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 чтоб далее его открыть,и проаналезировать (через поиск свою писанину выведенную модулем искать). Вобщем, приму к сведению любые наставления на путь истенный, как и что нужно лучше делать.
Не совсем так. Модуль действительно выполняется с теми же привилегиями что и код ядра, то есть на нулевом кольце и действительно способен на все и вся. Но вот с обращением к экспортируемым переменным несколько сложнее. Поясню на примере: наверняка видел примеры старых руткитов которые экспортируют sys_call_table и далее творят всякие безобразия, однако этот номер уже очень давно не прокатывает так как переменную sys_call_table давно убрали из таблици экспорта, так что никакой подгружаемый модуль к ней обратится не может. Однако напрямую (по адресу) к участку памяти содержащему эту переменную обратится можно что и делают более современные руткиты. Эта тема достаточно поробно, но к сожалению не до концы (время, время...) освещена в нашем блоге (см. подпись). Там кстати, к сожалению не дописаный, цикл статей по моей курсовой о взломах подобных систем защит =) Но могу поделится опытом по этому поводу На вторую часть вопроса пожалуй может ответить sevik.ru/syslinux/pdf/sys_linux.pdf
Насчёт sys_call_table, и подмены указателей на функции. Вообще какой смысл что-то создавать на таком уровне? Ведь легко обнаруживается.. или я не прав?
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 ??? И произвести нормальную сборку модуля =)
Ошибку 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 то модуль подгружается в ядро без каких либо проблем )
Это как ра з и происходит из-за того что я описала выше, что функция которую ты используешь не является экспортируемой, и что объясняла на примере с syscall_table. Или из-за лицензии на твой модуль, что ты передаешь в макрос MODULE_LICENSE?
Объясните мне =) что такое экспортируемые и не экспортируемые функции ? Как я понимаю, если функция экспортируемая, то к ней можно получить прямой доступ из модуля. А если не экспортируемая, то приходится своими ручками искать адрес нужной функции¸ а дальше .... ну я думаю тут всё ясно. 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 - зло ). Какие функции ядра можно будет использовать в таком модуле?( у Д. Бовета написано, что такому модулю не будут доступны многие, очень важные возможности ядра ) .Вот и хотелось бы узнать, о возможном будущем коммерческих разработок под данную ось.
Так как редактирования нет, то и возможности дописать данный вопрос в предыдущие сообщения, нету. Потому приходится писать новое сообщенице. Касается хеш функций в линексе.(встречаются мне достаточно часто). Как именно они устроены? как располагаются в памяти? каким образом ядро делает из них выборку?
_ir4_Y_ Какой смысл модуль писать на ассемблере? какие плюсы? ( хоть я сам и обажаю асм но всёже ), ведь на асме не напишешь столько кода, сколько может потребоваться.
На чистом асме модули писать крнечно не удобно. Удобно писать часть кода на С а часть на асме например низкоуровневые системные функции (получение адреса на который передает управление команда syscall) Мдульное программирование рулит )
Ниразу не сталкивался и не задумался на тему написания комерческих модулей ... Если не секрет что такое комерческое можно разработать для ядра линукса ?
_ir4_Y_ Хм ну не знаю.. всё что угодно наверное. Просто, если программист не сможет заработать себе на жизнь программируя для данной ОС ( а на изучение её, тратится время, силы, нервы.. ) то на кой чёрт, тратить силы и своё время на её изучение? раз толку 0. Да и писать что-то для неё, если это не даст возможность купить кусок хлеба. Если программер хороший, то он естественно потратит своё время, на программинг того, что принесёт ему пользу, а не на то, что..пишешь , пишешь.. написал. И не понятно зачем это делалось.
А как связаны выпуск комерческих модулей и заробатывание денег ?) Например есть опен-сорс проекты под лицензией GPL в разработку которых компании вкладывают деньги. Програмисты получаю деньги не за продажу а за разработку К примеру Qt библиотека доступна абсолютно бесплано а компания Nokia вкладывает в ее развитие деньги Аналогично ядро Линукса развивают Novell redhat