LINUX内核模块编程指南

LINUX内核模块编程指南

ID:37501067

大小:2.65 MB

页数:71页

时间:2019-05-24

LINUX内核模块编程指南_第1页
LINUX内核模块编程指南_第2页
LINUX内核模块编程指南_第3页
LINUX内核模块编程指南_第4页
LINUX内核模块编程指南_第5页
资源描述:

《LINUX内核模块编程指南》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、下载第1章Hello,World如果第一个程序员是一个山顶洞人,它在山洞壁(第一台计算机)上凿出的第一个程序应该是用羚羊图案构成的一个字符串“Hello,World”。罗马的编程教科书也应该是以程序“Salut,Mundi”开始的。我不知道如果打破这个传统会带来什么后果,至少我还没有勇气去做第一个吃螃蟹的人。内核模块至少必须有两个函数:init_module和cleanup_module。第一个函数是在把模块插入内核时调用的;第二个函数则在删除该模块时调用。一般来说,init_module可以为内核的某些东西注册一个处理程序,或者也可以

2、用自身的代码来取代某个内核函数(通常是先干点别的什么事,然后再调用原来的函数)。函数cleanup_module的任务是清除掉init_module所做的一切,这样,这个模块就可以安全地卸载了。146第二部分Linux内核模块编程指南下载1.1内核模块的Makefiles文件内核模块并不是一个独立的可执行文件,而是一个对象文件,在运行时内核模块被链接到内核中。因此,应该使用-c命令参数来编译它们。还有一点需要注意,在编译所有内核模块时,都将需要定义好某些特定的符号。¥__KERNEL__—这个符号告诉头文件:这个程序代码将在内核模式下运

3、行,而不要作为用户进程的一部分来执行。¥MODULE—这个符号告诉头文件向内核模块提供正确的定义。¥LINUX—从技术的角度讲,这个符号不是必需的。然而,如果程序员想要编写一个重要的内核模块,而且这个内核模块需要在多个操作系统上编译,在这种情况下,程序员将会很高兴自己定义了LINUX这个符号。这样一来,在那些依赖于操作系统的部分,这个符号就可以提供条件编译了。还有其它的一些符号,是否包含它们要取决于在编译内核时使用了哪些命令参数。如果用户不太清楚内核是怎样编译的,可以查看文件/usr/include/linux/config.h。¥__

4、SMP__—对称多处理。如果编译内核的目的是为了支持对称多处理,在编译时就需要定义这个符号(即使内核只是在一个CPU上运行也需要定义它)。当然,如果用户使用对称多处理,那么还需要完成其它一些任务(参见第12章)。¥CONFIG_MODVERSIONS—如果CONFIG_MODVERSIONS可用,那么在编译内核模块时就需要定义它,并且包含头文件/usr/include/linux/modversions.h。还可以用代码自身来完成这个任务。完成了以上这些任务以后,剩下唯一要做的事就是切换到根用户下(你不是以root身份编译内核模块的吧?

5、别玩什么惊险动作哟!),然后根据自己的需要插入或删除hello模块。在执行完insmod命令以后,可以看到新的内核模块在/proc/modules中。顺便提一下,Makefile建议用户不要从X执行insmod命令的原因在于,当内核有个消息需要使用printk命令打印出来时,内核会把该消息发送给控制台。当用户没有使用X时,该消息第1章Hello,World147下载将发送到用户正在使用的虚拟终端(用户可以用Alt-F来选择当前终端),然后用户就可以看到这个消息了。而另一方面,当用户使用X时,存在两种可能性。一种情况是用户用命令xt

6、erm-C打开了一个控制台,这时输出将被发送到那个控制台;另一种情况是用户没有打开控制台,这时输出将送往虚拟终端7—被X所“覆盖”的一个虚拟终端。当用户的内核不太稳定时,没有使用X的用户更有可能取得调试信息。如果没有使用X,printk将直接从内核把调试消息发送到控制台。而另一方面,在X中printk的消息将被送给一个用户模式的进程(xterm-C)。当那个进程获得CPU时间时,它将把该消息传送给X服务器进程。然后,当X服务器获得CPU时间时,它将显示该消息—但是一个不稳定的内核通常意味着系统将要崩溃或者重新启动,所以用户不希望推迟错误

7、信息显示的时间,因为该信息可能会向用户解释什么地方出了问题,如果显示的时刻晚于系统崩溃或重启的时刻,用户将会错过这个重要的信息。1.2多重文件内核模块有时候在多个源文件间划分内核模块是很有意义的。这时用户需要完成下面三件任务:1)除了一个源文件以外,在其它所有源文件中加入一行#define__NO_VERSION__。这点很重要,因为module.h中通常会包含有kernel_version的定义(kernel_version是一个全局变量,它表明该模块是为哪个内核版本所编译的)。如果用户需要version.h文件,那么用户必须自己把它

8、包含在源文件中,因为在定义了__NO_VERSION__的情况下,module.h是不会为用户完成这个任务的。2)像平常一样编译所有的源文件。3)把所有的对象文件组合进一个文件中。在x86下,可以使用命令:

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。