图1 将模块链接到内核
内核编程和应用程序编程一点重要的不同之处在于各环境下处理错误的方式不同。
用户空间和内核空间
通常将运行模式称为内核空间和用户空间,两种模式具有不同的优先权等级,也有自己的内存映射(地址空间)。模块运行在内核空间,用于扩展内核功能,应用程序运行在用户空间,实现用户定义的功能。
Unix中,内核运行在最高级别(超级用户态),可以进行所有操作;应用程序运行在最低级别(用户态),处理器控制着对硬件的访问以及对内存的非授权访问。
一个驱动程序要执行两类任务:模块中的某些函数作为系统调用的一部分而执行,而其他函数负责中断处理。当应用程序执行系统调用或被硬件中断挂起时,Unix将执行模式从用户空间切换到内核空间。
内核中的并发
内核编程区别于常见应用程序编程的地方在于对并发的处理。
Linux内核代码(包括驱动代码)必须是可重入的,必须能够同时运行在多个上下文中。
其他
内核代码不能实现浮点运算。