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

在我们进行下一步工作之前,应该明白普通应用程序和内核模块程序之间的不同。

对于小中型的应用程序来说,处理任务是按照代码从头到尾顺序执行的。内核模块程序的处理与它
不同,各个模块首先向内核注册自己用来对外提供服务,内核模块的这种设计思路和事件驱动的程序
类似。但是事件驱动的应用程序和内核模块程序之间也有很大的不同,主要体现在程序的退出上:对
于应用程序来说,退出后未释放的资源可以由操作系统收回;但是对于内核驱动程,所有的资源都必
须正确的释放。

另外,模块可以卸载也是模块化编程一个很方便的地方,因为它可以缩短开发周期,不许要关机或
者重启来测试我们的驱动程序。

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

因为内核驱动编程时没有别的函数库可以链接,所以我们的源程序不应该包含通常的头文件,但是
和一些非常特殊的头文件是例外。内核模块只能调用那些确实在内核中的函数。所有在内
核中定义的函数都可一在内核树的头文件中找的到。大部分用到的头文件在include/linux和include
/asm文件夹下,但是include中的其他子目录中保存有和特定内核子系统相关的头文件。

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

内核程序和应用程序另外一个不同之处是对各种环境错误的处理,对于应用程序来说,段错误总是可以用调试器追踪到的,并且影响和内核程序比起来也不大。但是对于内核程序来说,段错误至少会杀死当前的进程,甚至是整个系统。我们将在第四章来详细介绍如何来追踪内核错误。

你可能感兴趣的:(linux 设备驱动程序开发 第3版_Chapter2_Kernel Modules Vers...)