#1 17.05.2013 18:41:09

Герман
Administrator
Зарегистрирован: 17.05.2013
Сообщений: 4
IP-адрес

создание простого модуля ядра hello world (printk)

Вот хотелось бы проконсультироваться у знающих людей)

собственно задача состоит в сл.
Создать и запустить простейший модуль ядра, например "hello, world"

нашел мануал такой.. но он в тексте без команд

1. Скачать с дистрибутива Debian в соответствующую системную директорию исходный код ядра системы..
2. Установить утилиты компиляции gcc и module assistant.
3. Скачать в домашнюю директорию текущего пользователя архив hello_printk.tar.gz и распаковать его.
4. Изменение файл Makefile, задав в нем имя ссылки на исходный код ядра, соответствующее нашей системе.
5. Проверить наличие этой ссылки в соответствующей целевой директории. Если ее цель не является директорию под тип процессоров 686 исходных кодов ядра, изменить ее цель (или создать новую ссылку).
6. Скомпилировать исполняемый файл модуля ядра.
7. Скачать модуль ядра в систему. Проверить его наличие в системе соответствующей командой.

архив hello_printk.tar.gz имеет два файла
makefile:


# obj-m is a list of what kernel modules to build.  The .o and other
# objects will be automatically built from the corresponding .c file -
# no need to list the source files explicitly.

obj-m := hello_printk.o 

# KDIR is the location of the kernel source.  The current standard is
# to link to the associated source tree from the directory containing
# the compiled modules.
KDIR  := /lib/modules/$(shell uname -r)/build 

# PWD is the current working directory and the location of our module
# source files.
PWD   := $(shell pwd)

# default is the default make target.  The rule here says to run make
# with a working directory of the directory containing the kernel
# source and compile only the modules in the PWD (local) directory.
default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules

hello_printk.c
/*
 * "Hello, world!" minimal kernel module
 *
 * Valerie Henson <val@nmt.edu>
 *
 */

/*
 * The below are header files provided by the kernel which are
 * required for all modules.  They include things like the definition
 * of the module_init() macro.
 */
#include <linux/init.h>
#include <linux/module.h> 

/*
 * This is the init function, which is run when the module is first
 * loaded.  The __init keyword tells the kernel that this code will
 * only be run once, when the module is loaded.
 */

static int __init
hello_init(void)
{
    printk("Hello, world!\n");
    return 0;
}

/*
 * The below macro informs the kernel as to which function to use as
 * the init function.
 */

module_init(hello_init);

/*
 * Similary, the exit function is run once, upon module unloading, and
 * the module_exit() macro identifies which function is the exit
 * function.
 */

static void __exit
hello_exit(void)
{
    printk("Goodbye, world!\n");
}

module_exit(hello_exit);

/*
 * MODULE_LICENSE() informs the kernel what license the module source
 * code is under, which affects which symbols it may access in the
 * main kernel.  Certain module licenses will "taint" the kernel,
 * indicating that non-open or untrusted code has been loaded.
 * Modules licensed under GPLv2 do not taint the kernel and can access
 * all symbols, but declaring it so is a legal statement that the
 * source code to this module is licensed under GPLv2, and so you must
 * provide the source code if you ship a binary version of the module.
 */
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Valerie Henson <val@nmt.edu>");
MODULE_DESCRIPTION("\"Hello, world!\" minimal module");
MODULE_VERSION("printk");


1. # cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.35.5.tar.bz2
и розархивировал его
# tar xjf linux-2.6.32.5.tar.bz2
я так понимаю нам нужны хеад-файлы отсюда...

ну в общем дошел до 4го пункта, там я так понимаю нужно изменить строку
KDIR  := /lib/modules/$(shell uname -r)/build 

но на какую я что то непойму..
в общем выдавало ошибку
make -C /usr/src/linux-2.6.32.5/build M=/home/polzovatel/hello_printk modules
make: *** /usr/src/linux-2.6.32.5/build: No such file or directory. Остановка
make: *** [default] ошибка 2.

#2 17.05.2013 19:10:27

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

создание простого модуля ядра hello world (printk)

Quote by Герман⇓
1. # cd /usr/src
# wget http://www.kernel.org/pub/linux/kernel/ … .5.tar.bz2

исходники нужны к тому ядру, которое запущено. можно собрать это или установить пакет с исходниками от дистрибутива (linux-source или как-то так)...

при желании можно в KDIR просто прописать путь куда распакованы исходники, но тогда надо понимать, что делаешь...

список литературы: Introduction

#3 17.05.2013 19:31:55

ormorph
Administrator
Зарегистрирован: 21.02.2010
Сообщений: 902
IP-адрес

создание простого модуля ядра hello world (printk)

Да ничего тут собственно менять не надо, просто описание по сборке модуля тупое.

Тут ненужно качать исходник ядра, хватит ядра под которым работает данный дистрибутив линукса.

Для сборки модуля ядра нужны только хедеры ядра.

В большинстве дистрибутивов это пакеты с названием linux-headers или kernel-headers

Версия пакета должна соответствовать выводу команды uname -r

Останется только в директории исходника выполнить:
$ make
$ sudo insmod ./hello_printk.ko
$ dmesg | tail

#4 17.05.2013 19:41:59

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

создание простого модуля ядра hello world (printk)

Quote by ormorph⇓
Для сборки модуля ядра нужны только хедеры ядра.

ЛПП.

гипотетически конечно можно и без них, но тогда ручками придётся кучу всего выдирать из самих исходников, в частности, скрипты линкера.

ЗЫ: кроме того исходники должны быть сконфигурированы и частично собраны (make modules_prepare)

#5 17.05.2013 19:56:40

ormorph
Administrator
Зарегистрирован: 21.02.2010
Сообщений: 902
IP-адрес

создание простого модуля ядра hello world (printk)

Quote by Fat-Zer⇓
гипотетически конечно можно и без них, но тогда ручками придётся кучу всего выдирать из самих исходников.


Да знаю делал как то по конфигу /proc/config.gz
Самое простое если не вчитываться просто собрать ядро с данным конфигом.

А так там описание по сборке очень тупое, если бы я в первый раз начал собирать по данному описанию, у меня все равно ни чего не получилось бы, так как тут пропущен момент перезагрузки под вновь созданным ядром(если все таки решиться собирать ядро).

Жаль что автор статьи, просто переписал иностранную статью, по сборке модуля, и не сделал ни чего чтобы разжевать что к чему.
По данному описанию учиться очень тяжело если начинаешь только осваивать linux.

#6 17.05.2013 20:05:31

Герман
Administrator
Зарегистрирован: 17.05.2013
Сообщений: 4
IP-адрес

создание простого модуля ядра hello world (printk)


Жаль что автор статьи, просто переписал иностранную статью, по сборке модуля, и не сделал ни чего чтобы разжевать что к чему.
По данному описанию учиться очень тяжело если начинаешь только осваивать linux.


жаль что мне в таком виде (как вы выразились в "тупом") дают в универе... вот и пытаюсь мутить что то) читаю блоги, спасибо всем за отзывчивость буду пробовать)

#7 17.05.2013 20:31:38

ormorph
Administrator
Зарегистрирован: 21.02.2010
Сообщений: 902
IP-адрес

создание простого модуля ядра hello world (printk)

Fat-Zer
Нам пора бы проспаться обоим)
это на счет что можно обойтись без хедеров ядра.
Думаю мы оба думали на счет пакетов linux-headers и kernel-headers
Только читая то что написано выше можно сделать не правильный вывод.
Это так небольшая поправка самого себя.

#8 17.05.2013 22:32:38

Герман
Administrator
Зарегистрирован: 17.05.2013
Сообщений: 4
IP-адрес

создание простого модуля ядра hello world (printk)

вроде разобрался, заработало))
есть вопросик, уже не по этой теме.. да что бы не создавать новую тему, спрошу здесь
есть ли альтернатива в дебиане системному реестру Windows?

#9 18.05.2013 01:47:58

ormorph
Administrator
Зарегистрирован: 21.02.2010
Сообщений: 902
IP-адрес

создание простого модуля ядра hello world (printk)

Quote by Герман⇓
есть ли альтернатива в дебиане системному реестру Windows?


Если только в эмитаторе винды wine, в самом Linux как правило нет.
Для Gnome что то похожее существует, но реально это не реестр, так как все эти настройки реально хранятся в скрытом каталогое ~/.gconf в формате xml

Т.е. реально в linux все хранится в конфигурационных файлах.

#10 18.05.2013 17:35:50

Fat-Zer
Administrator
Зарегистрирован: 14.10.2010
Сообщений: 4 977
IP-адрес

создание простого модуля ядра hello world (printk)

Quote by ormorph⇓
это на счет что можно обойтись без хедеров ядра.
Думаю мы оба думали на счет пакетов linux-headers и kernel-headers

нет... тут я ошибся малость... видать я слишком привык к генте, так что для меня linux-headers это /usr/include/linux/
сейчас посмотрел - и правда в дебиане часть дерева ядра, необходимая для сборки находится в linux-headers.

[ремарка] хотя в генте в самом пакете тоже содержится тот же хлам, что и в debian'овском linux-headers, но устанавливаются только сами хедеры...

#11 18.05.2013 20:28:07

ormorph
Administrator
Зарегистрирован: 21.02.2010
Сообщений: 902
IP-адрес

создание простого модуля ядра hello world (printk)

Просто я имел в виду, что при сборке исходника ядра, либо выполнив (make modules_prepare), часть хедеров генерируются.
Вот и получается что без них на самом деле ни куда :)

Просто при сборке модуля ядра используются хедеры из исходника самого ядра, а не обще системные, ну и конечно не только хедеры.

Пакет linux-headers в gentoo, это примерно то же самое если выполнить команды в исходнике ядра:

make mrproper 
make headers_check
make INSTALL_HDR_PATH=header headers_install
find header/include \( -name .install -o -name ..install.cmd \) -delete


Далее в каталоге header будет находиться то самое.

пусть уж будет раз уж соответствует теме.

Я собирал когда то LFS, там как раз не было отдельного пакета с хедерами, для этого использовался сам исходник ядра.

То что вы имеете в виду что одних хедеров для сборки мало это правда.
То что без хедеров можно обойтись ...

Я понял что вы имели в виду, в этом вы правы.

Board footer