全部博文(64)
分类: LINUX
2010-01-04 11:38:32
内核模块和应用程序的对比:
1·大多数中小规模的应用程序是从头到尾执行单个任务
而模块却只是预先注册自己以便服务于将来的某个请求,然后它的初始化函数就立即结束。(模块初始化函数的任务就是为了以后调用模块函数预先做准备)
2·应用程序在退出时,可以不管资源的释放或者其他的清除工作
模块的退出函数却必须仔细撤销初始化函数所做的一切,否则,在系统重新引导之前某些东西就会残留在系统中。
3·在各种环境下处理错误的方式不同:
应用程序开发过程中的段错误是无害的,并且总是可以使用调试器跟踪到原代码的问题所在
一个内核错误即使不影响整个系统,至少也会杀死当前进程。 |
printk(KERN_INFO "The process is \"%s\" (pid %i)\n",current->comm, current->pid); |
有几个头文件是专门用于模块的,必须出现在每个可装载的模块中。 #include #include |
初始化函数 static int __init initialization_function(void) {````初始化代码·····`} module_init(initialization_function); 初始化函数应该被声明为static,因为这种函数在特定文件之外没有其他意义。 __init表明该函数仅在初始化期间使用。在模块被装载之后,模块装载器就会将初始化函数丢掉,这样可以将该函数占用的内存释放出来。 module_init的使用是强制性的。没这个定义,初始化函数永远不会被调用。 |
每个重要的模块都需要一个清除函数,该函数在模块被移除前注销接口并向系统中返回所有资源。 清除函数没有返回值,因此被声明为void __exit修饰词标记该代码仅用于模块卸载。如果模块被直接内嵌到内核中,或者内核的配置不允许卸载模块,则被标记为__exit的函数将被简单的丢弃 如果一个模块未定义清除函数,则内核不允许卸载该模块。 |
在insmod改变模块参数之前,模块必须让insmod命令看见这些参数。 参数必须使用module_param宏来声明,这个宏在moduleparam.h中定义。module_param需要三个参数:变量的名称,类型以及用于sysfs入口项的访问许可掩码(perm)。 这个宏必须放在任何函数之外,通常是在源文件的头部。
charp是内核支持的模块参数类型:字符指针值。内核会为用户提供的字符串分配内存,并相应的设置指针。 perm:如果对参数使用S_IRUGO,则任何人均可读取该参数,但不能修改;如果perm被设置为0,就不会有对应的sysfs入口项;S_IRUGO|S_IWUSR允许root用户修改该参数。
模块装载器也支持数字参数
|