




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
电子与信息工程学院 题目 LINUX操作系统内核编译 姓 名 孟长庚 学 号 20111309031 专 业 信息工程11级1班 指导老师 杜景林 二一四年 一月 一 日目录1课程设计简介31.1 课程设计的目的31.2 相关原理介绍31.3Linux内核模块程序结构31.4内核模块的编译32 设计实现42.1内核线程查看 42.2带参模块的实现42.3 Makefile文件的编写53测试总结63.1内核线程查看测试63.2带参模块的实现测试74 总结9一课程设计简介1.1 课程设计目的实现内核编译相关操作1.2 相关原理介绍内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux的一个重要的特点就是其源代码的公开性, Linux修补漏洞速度快以及对最新软件技术的利用方便,而Linux的内核则是这些特点的最直接的代表。拥有了内核的源程序我们可以了解系统是如何工作的,通过通读源代码,我们就可以了解系统的工作原理。其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,当然这样就需要重新编译内核。在不需要对内核进行重新编译的情况下,内核模块可以动态的载入内核或从内核移出改变内核,极大缩短了驱动编写和内核开发的时间。1.3 Linux内核模块程序结构一个Linux内核模块主要由如下几个部分组成:(1) 模块加载函数通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。(2) 模块卸载函数当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。(3) 模块许可证声明许可证(LICENSE)声明描述内核模块的许可权限,这一部分是必须声明的,如果不声明LICENSE,模块被加载时,将收到内核被污染(module license unspecified taints kernel)的警告。在Linux 2.6内核中,可接受的LICENSE有“GPL”、“GPL v2”、“GPL and additional rights”、“Dual BSD/GPL”、“Dual MPL/GPL”和“Proprietary”。大多数情况下,内核模块应遵循GPL兼容许可权。其中最常用的许可是GPL和DualBSD/GPL。(4) 其他可选部分模块参数,模块参数是模块被加载的时候可以被传递给它的值,它本身对应模块内部的全局变量;模块导出符号,内核模块可以导出符号(symbol,对应于函数或变量),这样其它模块可以使用本模块中的变量或函数;模块作者等信息声明。1.4 内核模块的编译在Linux 2.6内核中,模块的编译需要配置过的内核源代码;编译过程首先回到内核目录下读取顶层的Makefile文件,然后返回模块源码所在目录,经过编译、链接后生成的内核模块文件的后缀为.ko。故内核模块的编译需要自己写Makefile文件,当在命令行中执行make命令时,将调用Makefile文件。二设计实现21 内核线程查看设计一个模块,该模块功能是列出系统中所有内核线程的程序名、PID号和进程状态。该内核模块的功能类似于命令ps,只不过该模块专查看内核线程信息。首先在文件开始声明一下模块的许可证,即在文件中加入:MODULE_LICENSE(GPL);根据内核模块编程的模式,一个内核模块应该至少包含两个函数。一个初始化函数 ,还有一个退出(干一些收尾清理的工作)的函数,当内核模块被rmmod卸载时被执行。从内核版本2.3.13开始,可以为初始化和结束函数起任意的名字。 在该模块内。两个函数分别命名为:static int kernel_thread_init(void)和static void kernel_thread_exit(void)。调用宏module_init()和module_exit()去注册初始化和退出这两个函数,即:module_init(kernel_thread_init);module_exit(kernel_thread_exit);到此内核模块基本框架基本完成。为了获取到所有的内核线程,可以使用宏for_each_process()。在内核中有内核线程组长链表,每个线程组长通过task_struc结构的tasks成员加入该链表中。利用for_each_process()可以访问到链表中的每一个进程。具体实现如下:struct task_struct *p;for_each_process(p) /相关函数及操作对遍历到的每一个线程,读取它的线程号、线程名称以及线程状态并输出。当线程状态为0时输出runnale,为-1时输出unrunnable,为其他时则输出stopped。在这里输出函数并不能使用printf,printf是用户空间的输出函数,内核空间使用的是printk,因为内核没有链接标准的C 函数库。而实际上printk和printf的功能类似,printk是在内核中运行的向控制台输出显示的函数。printk日志输出的级别一共有8个,由高到低分别为:KERN_EMERG、KERN_ALERT、KERN_CRIT、KERN_ERR、KERN_WARNING、KERN_NOTICE、KERN_INFO、KERN_DEBUG,默认采用的级别是 DEFAULT_ MESSAGE_LOGLEVEL(这个默认级别一般为,即与KERN_WARNING在一个级别上)。22 带参模块的实现设计一个带参数的模块,参数为进程的PID号,功能是列出进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID号。该模块的基本框架和上一个模块类似,声明模块许可证,注册初始化和结束函数。不同之处是在该模块中涉及到了模块参数。在Linux操作系统内核中提供了一种模块带参数的机制,是模块的编写者可以在加载模块的时候提供一下信息,这些参数对于模块来说都是一个全局变量。定义一个模块参数可通过module_param()实现:module_param(name,type,perm);参数name是用户可见的参数名,也是模块中存放模块参数的变量名。参数type代表参数的类型,它可以是byte、short、int、long等类型。最后一个参数perm制定了模块在sysfs文件系统下对应的文件权限,可以使八进制的,也可以是S_Ifoo的定义形式,如S_RUGO|S_IWUSR等。在该模块中,定义一个进程的PID作为参数,以实现任意进程家族信息的查询,默认进程号为1,即在不添加参数情况下查看进程号为1的进程家族信息,具体实现如下:static int pid=1;module_param(pid,int,0644);为找到指定PID的进程,可以使用for_each_process(p)遍历内核所有进程,查找进程号为PID的进程。找到具体进程后,获取进程的名称。接下来判断进程的父进程是否存在,若存在,在输出父进程信息:if(p-real_parent=NULL) printk(No Parentn); else printk(Parent : %d %sn,p-real_parent-pid,p-real_parent-comm);下一步就是该搜索线程号为PID线程的兄弟进程及子进程。在Linux中采用多个链表确保有效查找系统里的进程,双向链表list_head内核中广泛的使用。因为list_head一般嵌入到啮合数据结构中,为了便于访问链表中的数据,内核提供了一系列的宏来实现链表的常规操作2。在这里使用list_for_each()和list_entry()来实现兄弟进程和子进程的查找。在上一步中得到了要查找的进程,可以由此进程得到他父进程的所有子进程组成的链表p-real_parent-children和此进程子进程的链表p-children。定义一个list_head结构体用于list_entry()中:struct list_head *pp;宏list_for_each(pp,&p-real_parent-children)遍历p-real_parent-children链表,每次pp指向一个对象成员,而宏list_entry(pp,struct task_struct,sibling);进一步得到该对象的指针。具体实现兄弟进程和子进程遍历如下:struct task_struct *p,*psibling;list_for_each(pp,&p-real_parent-children) psibling=list_entry(pp,struct task_struct,sibling); printk(sibling %d %s n,psibling-pid,psibling-comm);list_for_each(pp,&p-children) psibling=list_entry(pp,struct task_struct,sibling); printk(children %d %s n,psibling-pid,psibling-comm);上述过程将输出得到的兄弟进程和子进程的pid号和进程名称。23 Makefile文件的编写Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。makefile 文件是许多编译器-包括 Windows NT 下的编译器-维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改 makefile 文件而已。在Linux内核模块编程中,Makefile文件模版都类似,具体结构如下:ifneq ($(KERNELRELEASE),)obj-m :=目标文件.oelseKDIR :=/lib/modules/$(shell uname -r)/buildPWD :=$(shell pwd)default:$(MAKE) -C $(KDIR) M=$(PWD) modulesclean:$(MAKE) -C $(KDIR) M=$(PWD) cleanendifKERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容。如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD)表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,此时第一行的ifneq成功,make将继续读取else之前的内容。ifneq的内容为kbuild语法的语句,指明模块源码中各文件的依赖关系,以及要生成的目标模块名。三 测试总结3.1内核线程查看测试(1) 切换到内核模块所在路径kernel_threads,在命令行中输入make,得到如下结果:(2) 输入ls 列出当前目录文件,可以看已生成kernel_threads.ko文件(3) 用命令insmod kernel_threads.ko载入模块,并用lsmod查看模块是否已载入,由下图结果看以看到内核已经被载入。(4) 此时在控制台无法看到内核模块输出的信息,可以用dmesg查看内核输出信息,可以看到内核已经将搜索到的内核线程信息输出。(5) 最后用命令rmmod kernel_threads.ko将已加载的内核卸载32 带参模块的实现测试(1) 切换到内核模块所在路径thread_pid,在命令行中输入make,得到如下结果:(2) 输入ls 列出当前目录文件,可以看已生成thread_pid.ko文件(3) 用命令insmod thread_pid.ko载入模块,并用lsmod查看模块是否已载入,由下图结果看以看到内核已经被载入。(4) 此时在控制台无法看到内核模块输出的信息,可以用dmesg查看内核输出信息,可以看到内核已经将搜索到的内核线程信息输出。(5) 最后用命令rmmod thread_pid.ko将已加载的内核卸载四 总结Linux模块是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。Linux提供了内核模块这种功能强大的扩展方式,它不仅弥补了单内核的一些不足,而且对性能没有影响。通过内核模块机制,可以方便的进行内核开发和驱动开发,而事实上Linux中大多数驱动和文件系统都是已内核模块方式实现的。在内核模块机制下,可以随时在需要的情况下加载新的内核模块,而不需要重新编译内核和引导系统。当内核被加载到系统中时,他就成为内核源
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025合同范本加盟协议书
- 护理招聘操作考试题目及答案
- 2025年创业实战指南从策划到执行模拟题答案全收录
- 屋顶花园拆除施工方案
- 校服喷漆改造方案范本
- 2025年乡村手工艺合作社安全员岗位能力测试试题
- 校园大冒险题库及答案
- 骨质疏松护理题库及答案
- 歌剧院施工方案范本
- 盆景的艺术造型及布局 教案-2023-2024学年高一上学期劳动技术
- 2025年监察员笔试高频题彩票执法
- 2025广东中山大学附属第一医院惠亚医院事业编制人员招聘37人(第二批次)笔试备考试题及答案解析
- 校服专业知识培训内容课件
- 2025年生物制药靶点发现与验证技术临床试验监管政策报告
- 2025年全国质量月数智驱动筑基强链创新质量生态宣传
- 2025海航航空食品(北京)有限公司招聘260人笔试参考题库附答案解析
- 2025年小学一年级新生家长会
- DG-T 076-2024 采茶机标准规范
- 三维数字城市建模及数据获取课件
- 电气照明系统课件
- 收纳整理PPT成品课件
评论
0/150
提交评论