电子与信息工程学院
题目 LINUX操作系统内核编译
姓名孟长庚
学号 20111309031
专业信息工程11级1班
指导老师杜景林
二O一四年一月一日
目录
1课程设计简介 3
课程设计的目的 3
相关原理介绍 3
3
3
2 设计实现 4
…………………………………………………………………………4
4
Makefile文件的编写 5
3测试总结 6
6
7
4 总结 9
一课程设计简介
课程设计目的
实现内核编译相关操作
相关原理介绍
内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
Linux的一个重要的特点就是其源代码的公开性, Linux修补漏洞速度快以及对最新软件技术的利用方便,而Linux的内核则是这些特点的最直接的代表。拥有了内核的源程序我们可以了解系统是如何工作的,通过通读源代码,我们就可以了解系统的工作原理。其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,当然这样就需要重新编译内核。在不需要对内核进行重新编译的情况下,内核模块可以动态的载入内核或从内核移出改变内核,极大缩短了驱动编写和内核开发的时间。
Linux内核模块程序结构
一个Linux内核模块主要由如下几个部分组成:
模块加载函数
通过insmod或modprobe命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块的相关初始化工作。
模块卸载函数
当通过rmmod命令卸载某模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能。
模块许可证声明
许可证(LICENSE)声明描述内核模块的许可权限,这一部分是必须声明的,如果不声明LICENSE,模块被加载时,将收到内核被污染(module license ‘unspecified’ taints kernel)的警告。在Linux ,可接受的LICENSE有“GPL”、“GPL v2”、“GPL and additional rights”、“Dual BSD/GPL”、“Dual MPL/GPL”和“Proprietary”。大多数情况下,内核模块应遵循GPL兼容许可权。其中最常用的许可是GPL和Dual BSD/GPL。
其他可选部分
模块参数,模块参数是模块被加载的时候可以被传递给它的值,它本身对应模块内部的全局变量;模块导出符号,内核模块可以导出符号(symbol,对应于函数或变量),这样其它模块可以使用本模块中的变量或函数;模块作者等信息声明。
内核模块的编译
在Linux ,模块的编译需要配置过的内核源代码;编译过程首先回到内核目录下读取顶层的Makefile文件,然后返回模块源码所在目录,经过编译、。故内核模块的编译需要自己写Makefile文件,当在命令行中执行make命令时,将调用Makefile文件。
二设计实现
内核线程查看
设计一个模块,该模块功能是列出系统中所有内核线程的程序名、PID号和进程状态。
该内核模块的功能类似于命令ps,只不过该模块专查看内核线程信息。首先在文件开始声明一下模块的许可证,即在文件中加入:
MODULE_LICENSE("GPL");
根据内核模块编程的模式,一个内核模块应该至少包含两个函数。一个初始化函数,还有一个退出(干一些收尾清理的工作)的函数,当内核模块被rmmod卸载时被执行。,可以为初始化和结束函数起任意的名字。在该模块内。两个函数分别命名为: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_s
java考题 来自淘豆网m.daumloan.com转载请标明出处.