文档详情

《LINUX内核模块编程指南》.pdf

发布:2015-10-19约2.9万字共71页下载文档
文本预览下载声明
下载 第1章 Hello, World 如果第一个程序员是一个山顶洞人,它在山洞壁 (第一台计算机)上凿出的第一个程序应该 是用羚羊图案构成的一个字符串“ Hello, Wo r l d ”。罗马的编程教科书也应该是以程序“ S a l u t , M u n d i ”开始的。我不知道如果打破这个传统会带来什么后果,至少我还没有勇气去做第一个 吃螃蟹的人。 内核模块至少必须有两个函数:i n i t _ m o d u l e和c l e a n u p _ m o d u l e 。第一个函数是在把模块插 入内核时调用的;第二个函数则在删除该模块时调用。一般来说, i n i t _ m o d u l e可以为内核的 某些东西注册一个处理程序,或者也可以用自身的代码来取代某个内核函数 (通常是先干点别 的什么事,然后再调用原来的函数 ) 。函数c l e a n u p _ m o d u l e 的任务是清除掉i n i t _ m o d u l e所做的 一切,这样,这个模块就可以安全地卸载了。 146 第二部分 Linux 内核模块编程指南 下载 1.1 内核模块的Makefiles文件 内核模块并不是一个独立的可执行文件,而是一个对象文件,在运行时内核模块被链接 到内核中。因此,应该使用 - c命令参数来编译它们。还有一点需要注意,在编译所有内核模 块时,都将需要定义好某些特定的符号。 • _ _KERNEL_ _—这个符号告诉头文件:这个程序代码将在内核模式下运行,而不要 作为用户进程的一部分来执行。 • MODULE—这个符号告诉头文件向内核模块提供正确的定义。 • L I N U X —从技术的角度讲,这个符号不是必需的。然而,如果程序员想要编写一个重 要的内核模块,而且这个内核模块需要在多个操作系统上编译,在这种情况下,程序员 将会很高兴自己定义了 L I N U X这个符号。这样一来,在那些依赖于操作系统的部分,这 个符号就可以提供条件编译了。 还有其它的一些符号,是否包含它们要取决于在编译内核时使用了哪些命令参数。如果 用户不太清楚内核是怎样编译的,可以查看文件 / u s r / i n c l u d e / l i n u x / c o n f i g . h 。 • _ _SMP_ _—对称多处理。如果编译内核的目的是为了支持对称多处理,在编译时就 需要定义这个符号( 即使内核只是在一个C P U上运行也需要定义它 ) 。当然,如果用户使 用对称多处理,那么还需要完成其它一些任务 (参见第 1 2章) 。 • C O N F I G _ M O D V E R S I O N S—如果C O N F I G _ M O D V E R S I O N S可用,那么在编译内核模 块时就需要定义它,并且包含头文件 / u s r / i n c l u d e / l i n u x / m o d v e r s i o n s . h 。还可以用代码自 身来完成这个任务。 完成了以上这些任务以后,剩下唯一要做的事就是切换到根用户下 (你不是以r o o t 身份编 译内核模块的吧?别玩什么惊险动作哟! ) ,然后根据自己的需要插入或删除 h e l l o模块。在执 行完i n s m o d命令以后,可以看到新的内核模块在 / p r o c / m o d u l e s 中。 顺便提一下,M a k e f i l e建议用户不要从X执行i n s m o d命令的原因在于,当内核有个消息需 要使用p r i n t k 命令打印出来时,内核会把该消息发送给控制台。当用户没有使用 X 时,该消息 第1章 Hello,World 147 下载 将发送到用户正在使用的虚拟终端 (用户可以用A l t - F n 来选择当前终端) ,然后用户就可以看 到这个消息了。而另一方面,当用户使用 X 时,存在两种可能性。一种情况是用户用命令 xterm -C打开了一个控制台,这时输出将被发送到那个控制台;另一种情况是用户没有打开
显示全部
相似文档