linux 设备驱动程序开发 第3版_Chapter2_Kernel Modules Vers...

在咱们进行下一步工做以前,应该明白普通应用程序和内核模块程序之间的不一样。linux

对于小中型的应用程序来讲,处理任务是按照代码从头至尾顺序执行的。内核模块程序的处理与它 不一样,各个模块首先向内核注册本身用来对外提供服务,内核模块的这种设计思路和事件驱动的程序 相似。可是事件驱动的应用程序和内核模块程序之间也有很大的不一样,主要体如今程序的退出上:对 于应用程序来讲,退出后未释放的资源能够由操做系统收回;可是对于内核驱动程,全部的资源都必 须正确的释放。编程

另外,模块能够卸载也是模块化编程一个很方便的地方,由于它能够缩短开发周期,不准要关机或 者重启来测试咱们的驱动程序。模块化

咱们在编写应用程序事,能够调用咱们没有定义过函数,这些函数能够在连接的时候能够从别的函 数库中取得,例如printf函数。可是对于模块驱动程序来讲,它只能被连接到内核,因此它只能调用那 些从内核导出的函数;不能连接到其余的库函数。在前面章节中的hello.c例子中,printk函数就是内 核导出的,它相似与标准IO库中的printf函数,可是有一些不一样,其中的一个主要区别是printk函数不 支持浮点数的操做。函数

由于内核驱动编程时没有别的函数库能够连接,因此咱们的源程序不该该包含一般的头文件,可是 <stdarg.h>和一些很是特殊的头文件是例外。内核模块只能调用那些确实在内核中的函数。全部在内 核中定义的函数均可一在内核树的头文件中找的到。大部分用到的头文件在include/linux和include /asm文件夹下,可是include中的其余子目录中保存有和特定内核子系统相关的头文件。测试

各个内核头文件的做用将在用到的时候详加介绍。操作系统

内核程序和应用程序另一个不一样之处是对各类环境错误的处理,对于应用程序来讲,段错误老是能够用调试器追踪到的,而且影响和内核程序比起来也不大。可是对于内核程序来讲,段错误至少会杀死当前的进程,甚至是整个系统。咱们将在第四章来详细介绍如何来追踪内核错误。设计

相关文章
相关标签/搜索