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
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 *~
S íme első kernel modulod:
#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
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'
nincs hiba, lehet root-ként betölteni, majd dmesg-el nézni a kernel üziket:
[root@sgu C]# /sbin/insmod elso.ko
[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
...
További példák: PP 173.
5 kisbajnokság
Annak, aki ugyanezt először megírja, de úgy, hogy a /proc alól lehessen listázni!