内核模块和应用程序的区别

如题所述

第1个回答  2017-09-26
(1)应用程序基本上是从头到尾执行单个任务,而模块却需要事先向系统注册自己以便为将来的请求服务,并且模块有自己的模块初始化函数和模块退出函数。

(2)不是所有的应用程序都是事件驱动的,但内核模块却是,应用模块在退出时,可以不需要释放自己之前申请的资源或者其他的清除工作,但模块的退出却需要使用模块退出函数来仔细撤销初始化函数所做的一切,否则在系统重新引导之前某些东西就会残留在系统中。

(3)应用程序可以调用用户未定义的函数,但这个函数在某个库中,在链接过程中,编译器能够解析外部引用从而使用适当的函数库来调用这个函数,例如,定义在libc中的printf函数就是这种可直接调用的函数,但对于内核模块来说,模块仅仅被链接到内核中,只能调用由内核定义导出的函数,如printk就是由内核提供给模块使用的一个类printf的内核版本,故而模块源文件中不能包含通常的头文件。另外,printf和printk最大的不同在于printk缺乏对浮点数的支持。

(4)还有一点不同在于不同环境下二者处理错误的方式不同,对于应用程序,在开发过程中发生段错误是无害的,可以使用调试器跟踪到源代码问题所在,但内核错误即使不影响整个系统,也至少会杀死当前进程。
相似回答