!!!??? 2.3 核心模块与应用程序的对比
刚才我们知道了内核模块程序不同于驱动程序,那么内核模块程序和应用程序有什么不同呢?
1、大多数小规模及中规模应用程序是从头到尾执行单个任务,而模块却只是预先注册自己一边服务于将来的某个请求,然后它的初始化函数就立即结束了。也就是说,模块初始化函数的任务就是为以后调用模块函数预先做准备;而模块的退出函数会在模块被卸载之前调用。这就不同于应用程序从头到尾执行的单个任务,而是根据用户操作执行两个任务。
这种编程方式和事件驱动的编程有点类似,但并不是所有的应用程序都是事件驱动的,而每个内核模块却都是事件驱动的。另外,事件驱动的应用程序和内核模块代码之间也有一个主要的区别:应用程序在退出时,可以不管资源的释放或者其他的清楚,但是模块的退出函数却必须仔细撤销初始化函数所做的一切,否则,在熊重启之前某些东西就会残留在系统中。(与Windows下的卸载残留没有关系)这样的好处:可以缩短模块的开发周期,不需要每次测试的时候都要重启。
2、应用程序可以调用它自己并未定义的函数,这是因为连接过程能够解析外部引用从而使用适当的函数库。比如printf函数。但是,模块仅仅被链接到内核,因此它只能调用内核导出的那些函数,比如printk函数。
和内核相关的任何内容都在我们安装并配置好的内核源代码树的头文件中声明,其中,大多数相关头文件保存在include/linux和include/asm目录中,但include的其它子目录中保存有和特定内核子系统相关的头文件。
3、内核编程和应用程序编程在各环境下处理错误的方式也不同;应用程序开发过程中的段错误是无害的 ,并且总是可以使用调试器跟踪到源代码中的问题所在,而一个内核错误即使不影响整个系统,也至少会杀死当前进程,我们需要专门的调试技术来跟踪内核错误。
4、模块运行在内核空间,应用程序运行在用户空间,这是操作系统的基本理论。
如何在模块中使用函数调用和函数指针,从而为运行中的内核增加新的功能。
说实话,这张图并没有感觉到有什么,也许是我没有理解到位,希望以后能理解透。