#linux #ассемблер #ядро
В Linux'е не шибко спец, однако есть такая задача: разработать модуль ядра...
Вот, к примеру, простой hello world (NASM), однако как его собрать и запустить? Именно
как модуль ядра!
BITS 32
GLOBAL main
EXTERN printk
SECTION .data
Hello db 'Hello world!',0
SECTION .text
main:
push Hello
call printk
add esp,4
ret
После компиляции nasm'ом gcc собирать его отказывается, говоря, что понятия не имеет
ни о каком printk.
Что нужно сделать, чтобы собрать и запустить этот код именно как модуль ядра?
upd 05.06.2017: Создал несколько файлов, однако это всё не работает. Где косяки и
как их поправить – не знаю... :((
Может, кто помочь с этим?
module.c
#include // Необходим для любого модуля ядра
extern void MyProc(void);
int init_module(void)
{
MyProc();
return 0;
}
void cleanup_module(void)
{
}
main.asm
BITS 32
GLOBAL MyProc
EXTERN printk
SECTION .data
Hello db 'Hello word!',0
SECTION .text
MyProc:
push Hello
call printk
add esp,4
ret
makefile
obj-m += test.o
test-objs := module.o main.o
$(KBUILD_EXTMOD)/main.o: main.asm
nasm -f elf -o $@ $^
compile.sh
make -C /usr/src/linux-headers-`uname -r` SUBDIRS=$PWD modules
Что не так?
Хотя... вроде заработало...
Только теперь непонятно как это запустить...
Пишу sudo insmod test.ko – в ответ тишина. Где Hello world! ?
Файла /var/log/messages у меня нет вообще...
Ответы
Ответ 1
как его собрать и запустить? Именно как модуль ядра! Основное отличие сборки любого приложения для адресного пространства пользователя от сборки модуля для адресного пространства ядра, заключается в том, что приложение - самостоятельная сущность, а модуль - работает под управлением ядра. Из этого следует, что для компиляции модуля Вам нужно иметь исходные тексты (как минимум - заголовки) ядра, а для его компоновки (т.е. получения файла *.ko) необходимы объектные коды самого ядра. Существует определённая технология сборки самого ядра и его модулей. С ней вкратце можно ознакомиться вот здесь: Разработка модулей ядра Linux (Алексей Соловьев) Более профессионально всё изложено вот здесь: Разработка модулей ядра Linux (Олег Цилюрик) (цикл статей на IBM developerWorks) Но там 36 глав... Вам для разбега хватит и первой главы: Разработка модулей ядра Linux: Часть 1. Первые шаги И хотел бы заметить, что ядро почти на 100% написано на С. На ассемблере пишут только те части ядра, которые существенно зависят от архитектуры. Например - функции работы с регистрами устройств ввода/вывода в драйверах.
Комментариев нет:
Отправить комментарий