Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Разработка модуля ядра Linux на ассемблере

#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% написано на С. На ассемблере пишут только те части ядра, которые существенно зависят от архитектуры. Например - функции работы с регистрами устройств ввода/вывода в драйверах.

Комментариев нет:

Отправить комментарий