当Linux内核这样一个数百万行的大软件摆在面前时,不仅仅是望而生畏,还有老虎吃天无从下口的感觉。但实际上,在这个世界上,面对最复杂的事情,往往从简单做起或许有解。
大家最熟悉的一句就是:
printf(“Hello world!/n”);
那么在内核中,把这个f换成k(kernel):
printk(“I’m in Linux Kernel!/n”);
在适当的时候调用pirntk函数,你可以抓取你想要的任何内核信息。
当然,在内核态下写程序,再也找不到你熟悉的main()函数。不过,凡事都需有一个入口点,一般程序的入口都是初始化函数:
static int hello_init( void )
{
printk("Hello,World! from the kernel space...//n");
return 0;
}
那么,谁调用它执行?module_init()函数!亦即module_init(hello_init),望名思意,这是对初始化函数进行调用的模块函数。也就是说,我们在内核态下写的函数,要装在一个模块中(而不是主框架main()中),这里的模块就像搭积木的一个个模块一样,可以被插入到内核中,而内核就像一个母板,系统管理员可以按需插拔模块。那么,拔出模块也就轻而易举了:
static void hello_exit( void )
{
printk("Goodbye, World! leaving kernel space.../n");
}
想让这个函数得到执行,同样要调用内核提供的函数module_exit()!
以上就是Linux内核模块的简单框架。当然,在内核代码中,还涉及其他很多的细节,但在此,去繁就简,为了与内核进行零距离接触,先动手写出代码在内核进进出出逛一趟。
内核模块编程更多信息,请参看我们的Linux内核之旅网站中的Linux 2.6内核编程实例栏目。
如何抓取内核更多的信息,请看下一讲。