第12章-添加最简单的Linux内核模块.ppt

第12章-添加最简单的Linux内核模块.ppt

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

山东科技大学操作系统教研组操作系统实践操作系统实践第12章添加最简单的Linux内核模块山东科技大学操作系统教研组熟练掌握基本的Linux内核模块开发框架和编译方法。熟练掌握Linux内核模块添加流程。理解Linux内核模块代码中的一些常见宏和参数。掌握Linux内核模块程序和应用程序的差异。深入理解操作系统为用户提供服务的方式、方法深入理解计算机程序的运行方式实验1:添加一个简单的Linux内核模块(教材P.162)实验内容从教材提供的电子资源中找到或者按教材提示自己编写简单的Linux内核模块kello.c及其对应的Makefile文件编译、安装、删除该模块,查看该模块的安装位置、运行情况实验要求通过阅读、执行kello.c及其对应的Makefile文件,理解Linux内核模块LKM的基本框架和运行方式、原理。对比kello.c和应用程序hello.c在编写、运行过程中的差异,理解操作系统为用户提供服务的方式、方法。结合操作系统知识,通过实验深入理解计算机程序在操作系统支持下的运行方式。原理/背景用户态和内核态LKM基本框架、关键代码用户态与内核态应用程序调用操作系统服务完成特定功能操作系统为应用程序提供服务应用程序工作在用户空间,为用户态操作系统模块工作在内核空间,为内核态C/C++应用程序的运行机制Linux内核模块LKM(LinuxKernelModule)Linux是单内核多模块的操作系统两种开发内核模块的方法静态开发LKMLKM具有如下特点:主要使用C语言编程,但也可以使用内联的汇编代码;LKM工作在内核空间,可以不受约束的运行,因此在一个LKM内部读者可以访问对应用程序屏蔽的内核数据结构、硬件设备等;LKM可以通过proc伪文件系统、内存映射、特定的系统调用函数等不同的机制实现内核空间和用户空间的数据交换。这些机制将在后续章节陆续讲到。1.LKM代码框架(教材P.157)//kello.c#includelinux/module.h //forprintk()intkello_init(void){ printk(\nHello,studentsfromSDUST!Thisisinkernelspace!\n); return 0;}voidkello_exit(void){ printk(\nGoodbyenow...studentsfromSDUST!\n);}MODULE_AUTHOR(SDUSTOSfangs99@126.com);MODULE_LICENSE(GPL);module_init(hello_init);module_exit(hello_exit);2.LKM代码解释1)任何一个内核模块文件必须要有两个模块管理函数,即模块初始化函数和模块回收函数,其原型如下所示:intinit_module(void); //模块初始化函数,在模块初始化时被调用voidcleanup_module(void); //模块回收函数,在模块撤销时调用2)为了模块更高效地被加载、执行和撤销,尤其是内存的分配和回收,在文件最后需要作如下声明:module_init(init_module);//执行模块初始化函数module_exit(cleanup_module);//执行模块回收函数3.LKM编译第一种是集成到内核、随内核一起编译;这种方法把开发完的内核文件放在Linux内核源代码相关目录下,随内核一起编译。缺点:耗时长;一旦代码有错,导致系统出现问题第二种则是单独编译、动态插入内核;把将开发的内核代码文件直接进行编译,然后使用命令动态插入内核或者从内核卸载。优点:编译速度快;单独调试代码缺点:每次系统启动后都需要再加载代码3.LKM编译第二种则是单独编译、动态插入内核;把将开发的内核代码文件直接进行编译,然后使用命令动态插入内核或者从内核卸载。ifneq ($(KERNELRELEASE),)obj-m :=kello.oelseKDIR :=/lib/modules/$(shelluname-r)/buildPWD :=$(shellpwd)default: $(MAKE)-C$(KDIR)SUBDIRS=$(PWD)modules rm-r-f.tmp_versions*.mod.c.*.cmd*.o*.symversendifM

文档评论(0)

优美的文学 + 关注
实名认证
内容提供者

优美的文学优美的文学优美的文学优美的文学优美的文学

1亿VIP精品文档

相关文档