Ubuntu下编译的第一个内核模块[Linux安全]
本文“Ubuntu下编译的第一个内核模块[Linux安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
内核模块是Linux内核向外部供应的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块.Linux内核之所以供应模块机制,是因为它本身是一个单内核(monolithic kernel).单内核的最大长处是效率高,因为全部的内容都集成在一同,但其缺陷是可扩大性和可保护性相对较差,模块机制就是为了补偿这一缺陷.
1、 什么是模块
模块是具有独立功效的程序,它可以被单独编译,但不能独立运行.它在运行时被链接到内核作为内核的一部份在内核空间运行,这与运行在用户空间的进程是差别的.模块普通由一组函数和数据构造构成,用来实现一种文件系统、一个驱动程序或其他内核上层的功效.
利用程序与内核模块的对比
为了加深对内核模块的理解,表一给出利用程序与内核模块程序的对比.
表一 利用程序与内核模块程序的对比
从表一我们可以看出,内核模块程序不能调用libc库中的函数,它运行在内核空间,且只有超级用户可以对其运行.别的,模块程序必须通过module_init()和module-exit()函数来奉告内核“我来了”和“我走了”.
2、 编写一个简单的模块
模块和内核都在内核空间运行,模块编程在一定意义上说就是内核编程.因为内核版本的每次改变,此中的某些函数名也会呼应地发生改变,因此模块编程与内核版本密切相关.以下例子针对Ubuntu 9.10 内核2.6.31-14-generic
1.程序举例
#include
#include
#include
MODULE_LICENSE("GPL");
static int __init lkp_init(void)
{
printk(KERN_ALERT "Hello World!\n");
return 0;
}
static void __exit lkp_cleanup(void)
{
printk(KERN_ALERT "Bye World!\n");
}
module_init(lkp_init);
module_exit(lkp_cleanup);
MODULE_AUTHOR("heyutao");
MODULE_DESCRIPTION("hello");
阐明
全部模块都要利用头文件module.h,此文件必须包含进来.
头文件kernel.h包含了常用的内核函数.
头文件init.h包含了宏_init和_exit,它们答应释放内核占用的内存.
lkp_init是模块的初始化函数,它必须包含诸如要编译的代码、初始化数据构造等内容.
利用了printk()函数,该函数是由内核定义的,功效与C库中的printf()近似,它把要打印的信息输出到终端或系统日记.
lkp_cleanup是模块的退出和清理函数.此处可以做全部终止该驱动程序时相关的清理工作.
module_init()和cleanup_exit()是模块编程中最基本也是必须的两个函数.
module_init()是驱动程序初始化的进口点.而cleanup_exit()注销由模块供应的全部功效.
以上是“Ubuntu下编译的第一个内核模块[Linux安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |