Ez nekem hallgatóként misztikus volt... ezért nézzük most meg pontosabban. Írunk egy olyan GNU/Linux kernelmodult, ami kiírja minden folyamat mellé, hogy melyik a következő szabad fájlleíró. (Ehhez a mese a Linux PCB-ről majd a 3. előadásban.)
Először jöjjön a tapasztalat, kell egy Makefile
[norbi@sgu C]$ more Makefile
S íme első kernel modulod:
obj-m += elso.o
all:
make -C /lib/modules/`uname -r`/build M=`pwd` modules
clean:
make -C /lib/modules/`uname -r`/build M=`pwd` clean
rm *~
#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/sched.h> #include <linux/list.h> #include <linux/fdtable.h> MODULE_DESCRIPTION ("Ez az elso kernel modulom"); MODULE_AUTHOR ("Bátfai Norbert (nbatfai@gmail.com)"); MODULE_LICENSE ("GPL"); static int elso_init_module (void) { struct task_struct *task; struct list_head *p; int i = 0; printk (KERN_NOTICE "Elso modul belep\n"); list_for_each (p, current->tasks.next) { task = list_entry (p, struct task_struct, tasks); i = (task->files)->next_fd; printk (KERN_NOTICE "%s %i %i\n", task->comm, task->pid, i); } return 0; } static void elso_exit_module (void) { printk (KERN_NOTICE "Elso modul kilep\n"); } module_init (elso_init_module); module_exit (elso_exit_module);
amit a make paranccsal fordítasz:
[norbi@sgu C]$ make
nincs hiba, lehet root-ként betölteni, majd dmesg-el nézni a kernel üziket:
make -C /lib/modules/`uname -r`/build M=`pwd` modules
make[1]: Entering directory `/usr/src/kernels/2.6.35.10-74.fc14.x86_64'
Building modules, stage 2.
MODPOST 1 modules
make[1]: Leaving directory `/usr/src/kernels/2.6.35.10-74.fc14.x86_64'
[root@sgu C]# /sbin/insmod elso.ko
További példák: PP 173.
[root@sgu C]# dmesg
...
[16037.915370] bash 3252 3
[16037.915372] qtcreator 4176 19
[16037.915375] bash 4418 3
[16037.915378] ssh 4448 7
[16037.915381] bash 12671 3
[16037.915383] okular 14993 14
...
5 kisbajnokság
Annak, aki ugyanezt először megírja, de úgy, hogy a /proc alól lehessen listázni!