Open Source & Linux Lab

It's better when it's simple

User Tools

Site Tools


etc:users:kernel

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
etc:users:kernel [2010/01/28 22:47] krinkinmuusers:kernel [2016/08/07 00:34] – ↷ Page moved from user:kernel to users:kernel kel
Line 57: Line 57:
      11      printk(KERN_INFO "Godbye world\n");      11      printk(KERN_INFO "Godbye world\n");
      12  }      12  }
 +
 +Теперь Makefile
 +
 +       obj-m += hello-1.c
 +       all:
 +            make -C /usr/src/linux-source-2.6.32 M=$(shell pwd) modules
 +       clean:
 +            make -C /usr/src/linux-source-2.6.32 M=$(shell pwd) clean
 +
 +Теперь из каталога, в котором лежит исходник и Makefile делаем
 +
 +     * sudo make
 +
 +Должны получить примерно следующее:
 +
 +     1 make -C /usr/src/linux-source-2.6.32 M=/home/mirovingen/Interested/kernel_programming/src/Hellow_World modules
 +     2 make[1]: Entering directory `/usr/src/linux-source-2.6.32'
 +       CC [M]  /home/mirovingen/Interested/kernel_programming/src/Hellow_World/hello-1.o
 +       Building modules, stage 2.
 +       MODPOST 1 modules
 +       CC      /home/mirovingen/Interested/kernel_programming/src/Hellow_World/hello-1.mod.o
 +       LD [M]  /home/mirovingen/Interested/kernel_programming/src/Hellow_World/hello-1.ko
 +     8 make[1]: Leaving directory `/usr/src/linux-source-2.6.32'
 +
 +Если все получилось, у нас в каталоге должен появиться файл hello-1.ko, далее загружаем и выгружаем модуль:
 +
 +     1 sudo insmod hello-1.ko
 +     2 sudo rmmod hello-1.ko
 +     3 sudo cat /var/log/messages | grep -i -e "world"
 +
 +Должны получить примерно следующее:
 +
 +     1 Jan 28 22:32:25 debian kernel: [ 6196.992494] Hellow world
 +     2 Jan 28 22:40:17 debian kernel: [ 6669.012286] Goodbye world
 +
 +Теперь разбираемся, что мы сделали и что получили.
 +
 +==== Исходный текст ====
 +
 +#include <linux/module.h> - как написано, этот заголовочный файл должен быть у всех модулей, в нем есть объявления init_module и cleanup_module, еще куча структур описывающих состояние, версию и другую информацию о модулях.
 +#include <linux/kernel.h> - тут тоже есть много чего полезного, например максимальное и минимальное значение определенного типа, printk объявлена в этом заголовочном файле, KERN_INFO также объявлена здесь:
 +
 +#define KERN_INFO "<6>" /* informational - она объявлена как строка, получается мы вызываем printk("<6>" "text"); это тоже самое, что и printk("<6>text"); ??? раньше не встречал такого варианта использования.
 +
 +int init_module(void) - вызывается, когда мы загружаем модуль (insmod);
 +void cleanup_module(void) - вызывается, когда код выгружается (rmmod);
 +В данном случае мы не вольны выбирать имена функций входа и выхода, но если подключить заголовочный файл linux/init.h, то можно присваивать произвольное имя функциям входа и выхода (дальше будет пример)
 +
 +printk - выводит значения, но она работает не совсем так как printf, как я понял, она выводит сообщение в какую-то очередь сообщений ядра, которую просмотреть скажем в xterm нельзя, поэтому для просмотра вывода мы заглядываем в файл /var/log/messages, который, кстати, довольно большой, и, наверно, очень полезный.
 +
 +Прошу знатоков еще пояснить вот такой момент:
 +
 +код возврата определяется программистом, т. е. он может не совпадать с какими-то принятыми в ОС значениями, для прикладных программ в этом нет ничего смертельного, но в данном случаем мы ведь не свободны в выборе кода возврата, так как потом система использует его значение? если да то какие еще коды существуют, и что они обозначают?
 +
 +
 +==== Makefile ====
 +
 +Как написано формально Makefile должен содержать только строку obj-m += hello-1.o, но тогда простой командой make мы получим только ошибку, правильным вариантом вызова будет:
 +
 +     make -C /usr/src/linux-source-2.6.32 M=$(shell pwd) modules
 +
 +$(shell pwd) - текущий каталог, можно прописать и руками.
 +
 +/usr/src/linux-source-2.6.32 - каталог с исходниками ядра.
 +
 +modules - не знаю зачем нужно, предполагаю, что эта команда показывает, что мы собираем именно модули ядра.
 +
 +~~DISCUSSION~~
etc/users/kernel.txt · Last modified: 2016/08/08 20:53 by kel