etc:users:kernel
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| etc:users:kernel [2010/01/27 22:17] – krinkinmu | etc:users:kernel [2016/08/08 20:53] (current) – ↷ Page moved from users:kernel to etc:users:kernel kel | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | Тут попробуем разобраться, как устроены | + | ======= Модульная анатомия |
| - | ===== Как загружать модули в ядро | + | ====== Цель ====== |
| - | Увидеть какие модули уже | + | Разобраться в структуре загружаемых модулей |
| - | Как же они загружаются в ядро? В самых общих чертах это выглядит так: когда ядру нужна функциональность, | + | |
| - | демон kmod вызывает команду modprobe для | + | |
| - | ===== Версия модуля ===== | + | ====== Ресурсы ====== |
| - | Модули скомпилированные для одной версии ядра, могут не подходить для другой | + | Ноутбук Acer Aspire 3680 (старенький), дистрибутив Debian, голова и интернет. |
| - | ===== Модули и Х ===== | + | ====== Действия ====== |
| - | Модули не могут выводить на экран информацию (как например printf()), т. е. если мы захотим увидеь результаты нашей работы, | + | ===== Первый |
| - | ===== Введение | + | Нам нужно скачать, |
| - | Первая | + | * sudo apt-get update |
| - | Вторая проблема - заголовки не всегда ищутся там, где они на самом деле лежат, такая проблема решается опцией | + | * sudo apt-get install liux-doc-2.6.32 linux-manual-2.6.32 linux-source-2.6.32 |
| + | * cd /usr/src/ | ||
| + | * tar jxf / | ||
| + | * sudo apt-get install build-essential fakeroot kernel-package | ||
| + | * make menuconfig | ||
| + | * sudo make-kpkg clean | ||
| + | * sudo fakeroot make-kpkg --initrd --append-to-version=-mine kernel_image kernel_headers | ||
| + | * sudo dpkg -i linux-image-2.6.32-mine-10.00.Custom_i386.deb | ||
| + | * sudo dpkg -i linux-headers-2.6.32-mine-10.00Custom_i386.deb | ||
| + | * sudo update-initramfs -c -k 2.6.32-mine | ||
| + | * sudo shutdown -r now | ||
| + | |||
| + | Дальше, если ядро сконфигурированно нормально, | ||
| + | |||
| + | |||
| + | *1 советую | ||
| + | |||
| + | *2 возможно придется доставить некоторые | ||
| + | |||
| + | *3 ядро можно собрать и не "в стиле Debian", | ||
| + | |||
| + | *4 в даной версии ядра пришлось поправить файл / | ||
| + | |||
| + | |||
| + | |||
| + | ===== Второй пункт ===== | ||
| + | |||
| + | Проверим, | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | 4 | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | 9 | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | Теперь Makefile | ||
| + | |||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | Теперь из каталога, | ||
| + | |||
| + | * sudo make | ||
| + | |||
| + | Должны получить примерно следующее: | ||
| + | |||
| + | 1 make -C / | ||
| + | 2 make[1]: Entering directory `/ | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | 8 make[1]: Leaving directory `/ | ||
| + | |||
| + | Если все получилось, | ||
| + | |||
| + | 1 sudo insmod hello-1.ko | ||
| + | 2 sudo rmmod hello-1.ko | ||
| + | 3 sudo cat / | ||
| + | |||
| + | Должны получить | ||
| + | |||
| + | 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 < | ||
| + | #include < | ||
| + | |||
| + | # | ||
| + | |||
| + | int init_module(void) - вызывается, | ||
| + | void cleanup_module(void) - вызывается, | ||
| + | В данном случае мы не вольны выбирать имена функций входа и выхода, | ||
| + | |||
| + | printk - выводит значения, | ||
| + | |||
| + | Прошу знатоков еще пояснить вот такой | ||
| + | |||
| + | код возврата определяется программистом, т. е. он может не совпадать с какими-то принятыми в ОС значениями, | ||
| + | |||
| + | |||
| + | ==== Makefile ==== | ||
| + | |||
| + | Как написано формально Makefile должен содержать только строку obj-m += hello-1.o, но тогда простой командой make мы получим только ошибку, | ||
| + | |||
| + | | ||
| + | |||
| + | $(shell pwd) - текущий каталог, | ||
| + | |||
| + | / | ||
| + | |||
| + | modules - не знаю зачем нужно, предполагаю, | ||
| + | |||
| + | ~~DISCUSSION~~ | ||
etc/users/kernel.1264619855.txt.gz · Last modified: 2010/01/27 22:17 by krinkinmu