![]() |
Модераторы: powerfox, ZeeLax |
![]() ![]() ![]() |
|
vzf |
|
||||||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 203 Регистрация: 10.9.2005 Репутация: нет Всего: 5 |
Надо написать модуль ядра Linux.
Беру пример из книги The Linux Kernel Module Programming Guide
В книге приводится Makefile для ядра 2.6
и команда для сборки
Для ядра 2.6 это работает (пробовал в Mandrake 10) Но в RedHat 9 возникли проблемы (ядро другое 2.4.20-8) Во-первых он не подднрживает загружаемых модулей. Следуя /usr/src/linux-2.4/README.txt я пересобрал ядро
make install выполнилось с ошибкой, но теперь вроде бы стало можно загружать модули в ядро. При запуске указанной выше команды сборки (make -C /usr/src/linux SUBDIRS=$PWD modules) выводилась ошибка, что нет правила сборки цели modules. Я нашел версию этой книги для более старых ядер там приводился такой пример: код модуля:
код makefile:
Теперь при сборки не находилась printk. Тогда я явно указал подключаемые заголовочные файлы. #include /usr/src/linux-2.4/include/linux/kernel.h #include /usr/src/linux-2.4/include/linux/module.h запустил makefile, получил долгожданный файл hello.o НО при выполнении insmod ./hello.o Выдается о шибка, что этот модуль собран под версию ядра 2.4.20, а используется 2.4.20-8 Кто-нибудь может сказать КАК ПРАВИЛЬНО собрать модуль ядра в Red Hat Linux 9.0 ? Это сообщение отредактировал(а) vzf - 23.12.2006, 21:17 --------------------
Java - Write Once, Test EveryWhere! |
||||||||||||
|
|||||||||||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 113 Всего: 317 |
исходя из факта, что на машине, на к-рой тебе предстоит запускать модуль тебе нужно быть с повышенными правами ( т.е. root ) 1. проверь, что у тебя есть заголовки ядра ТВОЕЙ версии. при наличии быстрого канала легче всего это достигается скачиванием всех исходников ядра, и установки его в систему. при разработке у тебя должно бежать именно это ядро. 2. ядро должно поддерживать загружаемые модули ( эта опция может быть вылкючена на некоторых рабочих системах ) 3. версия ядра и заголовков, а также подверсия компилятора, который собирал ядро и твой модуль должны совпадать ( поэтому есть смысл использовать свою версию ядра, при старом ядре, и современном компиляторе. 4. стоит читать СООТВЕТСТВУЮЩУЮ документацию, т.е. для 2.4 ядра, читать документы о ядре 2.4 с версии 2.4 в ядре МНОГО ЧЕГО изменилось. вот тут есть вся документация, по-английски: www.tldp.org ( точнее: http://www.tldp.org/LDP/lkmpg/2.4/html/index.html ) после ознакомления, поищи ( если надо ) по-русски. ядро лучше всего скачивать с www.kernel.org при нормальной настройке всех пакетов, ссылка /usr/src/linux должна указывать на бегущую и правильную версию ядра ( или заголовков ). Поэтому, если ты пытаешься собрать модуль, а заголовков make не находит, надо настраивать систему. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
vzf |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 203 Регистрация: 10.9.2005 Репутация: нет Всего: 5 |
Спасибо за дельный совет про оригинальную версию книгу. Хоть и во второй книге, которая у меня была, написано, что она для ядер 2.0...2.4, но наверное про 2.4 переводчик погорячлся.
Итак, пример из оригинальной книги собрался и работает (единственное, что пришлось поменять это строчку CC = gcc-3.0 в Makefile'е на CC=gcc). Но при попытке собрать модуль, перехватывающий системные вызовы появилась другая проблема: ядро 2.4.20-8 не экспортирует больше таблицу системных вызовов, поэтому при выполнении insmod появляется ошибка unresolved symbol sys_call_table. Кто нибудь знает как сделать так, чтобы ядро экспортировало таблицу системных вызовов? В книге для ядер 2.6 приводится патч на ядро. Но для для 2.4 он не подходит. В оригинальной версии книги про эту проблему ничего не сказано (видимо примеры выполнялись на самых ранних версиях ядра 2.4). Вот код модуля:
Код makefile:
--------------------
Java - Write Once, Test EveryWhere! |
||||
|
|||||
MAKCim |
|
||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 21 Всего: 207 |
2.6* не экспортирует, с 2.4* должно быть ОК
прежде чем тестировать это творчество, будь готов, что система может рухнуть ![]() но принцип должен быть виден (как можно в обход ядра это дело перехватить) Добавлено @ 11:25 vzf, а вообще зачем тебе перехват вызовов? Чисто побаловаться? Это сообщение отредактировал(а) MAKCim - 24.12.2006, 11:21 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||
|
|||||||||
vzf |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 203 Регистрация: 10.9.2005 Репутация: нет Всего: 5 |
Если бы... Задание такое дали в универе. Кстати я добился, чтобы таблица системных вызовов была доступной. Дописал в ksyms.c строчку EXPORT_SYMBOL(sys_call_table); и пересобрал ядро. Но ядро пересобралось с ошибками и поэтому когда его загружаю не запускается X-сервер. А когда делаю insmod он уже не находит printk (пишет unresolved symbol printk). Но это не так критично, я просто закоментил все printk. Загрузил модуль, проверил - работает. Сейчас попробую твой вариант. --------------------
Java - Write Once, Test EveryWhere! |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 21 Всего: 207 |
Классный у вас универ, ядро изучаете ![]()
только осторожно, я его сам не проверял ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
vzf |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 203 Регистрация: 10.9.2005 Репутация: нет Всего: 5 |
Понял почему ядро не собиралось нормально. Надо было сначала перед make xconfig сделать make mrproper.
Сейчас пересобрал собрал ядро. Все работает. Всем огромное спасибо. P.S. В целях осторожности, боясь уронить ОС, я все же не стал пробовать твой пример (хотя думаю, что он должен работать правильно) P.S.
Да только интересно, что такое задание не по предмету ОС, который уже у нас был, а по предмету "безопасность и СПО мобильных устройств". Хотя принцип написания модулей ядра ОС и перехватывания системных вызовов наверное схож для всех ос, будь то Linux, uCLinux, Windows XP или Windows CE. --------------------
Java - Write Once, Test EveryWhere! |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 21 Всего: 207 |
сомневаюсь, что он будет схож Добавлено @ 17:24
В принципе, максимум, что будет - полное зависание системы, от которой спасает только reset, а так ничего страшного ![]() -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Linux/UNIX: Oбщие вопросы" | |
|
В тему здесь вопросы общие - не привязанные к определенному ПО или дистрибутиву BSD/Linux/UNIX.
За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу). В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим. Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | *NIX системы: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |