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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
山东科技大学操作系统教研组 操作系统实践 操作系统实践 熟练掌握基本的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 (Linux Kernel Module) Linux是单内核多模块的操作系统 两种开发内核模块的方法 静态开发 LKM LKM具有如下特点: 主要使用C语言编程,但也可以使用内联的汇编代码; LKM工作在内核空间,可以不受约束的运行,因此在一个LKM内部读者可以访问对应用程序屏蔽的内核数据结构、硬件设备等; LKM可以通过proc伪文件系统、内存映射、特定的系统调用函数等不同的机制实现内核空间和用户空间的数据交换。这些机制将在后续章节陆续讲到。 1. LKM代码框架 (教材P. 157) //kello.c #include linux/module.h // for printk() int kello_init( void ) { printk( \n Hello, students from SDUST! This is in kernel space! \n ); return 0; } void kello_exit( void ) { printk( \n Goodbye now... students from SDUST! \n ); } MODULE_AUTHOR(SDUSTOS fangs99@126.com); MODULE_LICENSE(GPL); module_init(hello_init); module_exit(hello_exit); 2. LKM代码解释 1)任何一个内核模块文件必须要有两个模块管理函数,即模块初始化函数和模块回收函数,其原型如下所示: int init_module( void ); // 模块初始化函数,在模块初始化时被调用 void cleanup_module( void ); //模块回收函数,在模块撤销时调用 2)为了模块更高效地被加载、执行和撤销,尤其是内存的分配和回收,在文件最后需要作如下声明: module_init(init_module); //执行模块初始化函数 module_exit(cleanup_module); //执行模块回收函数 3. LKM编译 第一种是集成到内核、随内核一起编译;这种方法把开发完的内核文件放在Linux内核源代码相关目录下,随内核一起编译。 缺点:耗时长;一旦代码有错,导致系统出现问题 第二种则是单独编译、动态插入内核;把将开发的内核代码文件直接进行编译,然后使用命令动态插入内核或者从内核卸载。 优点:编译速度快;单独调试代码 缺点:每次系统启动后都需要再加载代码 3. LKM编译 第二种则是单独编译、动态插入内核;把将开发的内核代码文件直接进行编译,然后使用命令动态插入内核或者从内核卸载。 ifneq ($(KERNELRELEASE),) obj-m := kello.o else KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules rm -r -f .tmp_versions *.mod.c .*.cmd *.o *.symvers endif Makefile完整代码 教材P.159 内核编译需要Linux内核文件的

文档评论(0)

xingyuxiaxiang + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档