Linux内核模块课程设计

上传人:夏** 文档编号:467112027 上传时间:2022-12-31 格式:DOC 页数:15 大小:855.51KB
返回 下载 相关 举报
Linux内核模块课程设计_第1页
第1页 / 共15页
Linux内核模块课程设计_第2页
第2页 / 共15页
Linux内核模块课程设计_第3页
第3页 / 共15页
Linux内核模块课程设计_第4页
第4页 / 共15页
Linux内核模块课程设计_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《Linux内核模块课程设计》由会员分享,可在线阅读,更多相关《Linux内核模块课程设计(15页珍藏版)》请在金锄头文库上搜索。

1、Linux课程设计项目名称: 内核模块编程 姓 名: * 班 级: 计算机*班 学 号: 2008* 指导教师: * 日 期: 2011.6.192011.6.24 目录一.课程设计目的2二任务描述2三选题原因2四、准备阶段3五整体思路8六程序代码8七遇到的问题12八测试结果13九总结15一.课程设计目的通过课程设计对操作系统基本原理进行更深入的认识,以Linux为具体研究对象,分析理解操作系统底层实现,综合利用已学知识与技术,就Linux操作系统各功能方面进行模拟或实现二任务描述编写proc文件系统相关的内核模块:设计一个模块,该模块功能是列出系统中所有内核线程的程序名、PID号和进程状态。

2、再设计一个带参数的模块,参数为进程的PID号,功能是列出进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID号。三选题原因学习操作系统时,没有把内核这一块学好,所以想借此机会加强对操作系统底层的理解。四、准备阶段看到此题时不知道proc文件的作用,对内核的概念也很模糊,并且错误的以为内核利用一些命令来调用进程呢。很多东西都不理解,所以首先是看书上网逐一进行学习。下面是查找的一些资料。1.关于linux内核编程书本上有详细介绍并且也比较好理解。首先把书上例题演示了一遍,对模块编程就掌握的差不多了。模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的

3、一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。应用程序与内核模块程序的比较$sN _H;1o7f0C语言应用程序LUPA开源社区#t)VsE+s7T 内核模块程序LUPA开源社区1|-CX*C*U%sq4L1p使用函数LUPA开源社区g(D chDLibc库LUPA开源社区)l-KY5V:e45b 内核函数7si zK)O*n0运行空间aWx7h0用户空间LUPA开源社区#I wYfTV+H 内核空间$?k(e u7HQY4I0运行权限!e O;ba8X#H0普通用户LUPA开源社区:X AJ%

4、A4u 超级用户LUPA开源社区W7P!MUbMLP入口函数&xBJ(H:B H0 main()LUPA开源社区;fC.U o6F%e r H8Hmodule_init()4f RQV j KZM6F0出口函数LUPA开源社区2r)v0Q%wWI exit()LUPA开源社区cSr,o/Vzimodule_exit()LUPA开源社区v%K$IgD$j5?(a编译LUPA开源社区h%Ny mUZ2qt!AGcc cLUPA开源社区3_;M+Makefile连接+H(iB f.w$v7J0GccLUPA开源社区&wZKg!o&LinsmodLUPA开源社区Egc0E y C6O W运行LUPA开

5、源社区*o_$&G直接运行LUPA开源社区o!LK-Qo#dm D insmodsS#HOn v0调试LUPA开源社区uT-Q;kd7xGdbX.hw dP 0kdbug, kdb,kgdb等LUPA开源社区T ?o#F.H;m(Bg2. 编译工具make :Make工具通过一个称为 Makefile 的文件来完成并自动维护编译工作。课本上有提供一个超级通用的Makefile,此文件要与模块在同一个文件夹下。ifneq ($(KERNELRELEASE),)obj-m += nullparam.oelsePWD := $(shell pwd)KVER := $(shell uname -r)K

6、DIR := /lib/modules/$(KVER)/buildall:$(MAKE) -C $(KDIR) M=$(PWD)clean:rm -rf *.o *.mod.c *.ko *.symvers *.order *.markersendifKERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义, 所以make将读取执行else之后的内容。如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的

7、Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。obj-m += nullparam.o表示编译连接后将生成nullparam.o模块2.用户级线程:指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。 内核线程:指

8、需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部需求进行创建和撤销。3.proc文件系统:proc即process的缩写,最初的proc文件系统只是存放进程的相关信息。但现在的/proc文件系统除此之外还包含系统的状态信息和配置信息。/proc文件系统相当于内核的一个快照,该目录下的所有信息都是动态的从正在运行的内核中读取。基于这种原因,/proc文件系统就成为了用户和内核之间交互的接口。一方面,用户可以从/proc文件系统中读取很多内核释放出来的信息;另一方面,内核也可以在恰当的时候从用户那里得到输入信息,从而改变内核的相关状态和配置。相比传统的文件系统,/proc是

9、一种特殊的文件系统,即虚拟文件系统。这里的虚拟是强调/proc文件系统下的所有文件都存在于内存中而不是磁盘上。也就是说/proc文件系统只占用内存空间,而不占用系统的外存空间。/proc 虚拟文件系统可以广泛地用来报告内核的信息,也可以用来进行动态配置。它对于驱动程序和模块编程来说都是非常完整的。4. proc_dir_entry结构:proc文件系统的组织结构是proc_dir_entry结构,所有属于proc文件系统的文件,都对应一个proc_dir_entry结构,这个结构在proc_fs.h中定义。 struct proc_dir_entry /用来唯一标志proc_dir_entry

10、结构的节点号unsigned short low_ino; unsigned short namelen; /这个proc文件的名字。const char *name; /该proc文件的模式, 第一部分是文件的类型,第二部分是该文件的权限。mode_t mode; nlink_t nlink; uid_t uid; gid_t gid; /即我们使用“ls”命令时,所显示出的文件大小。unsigned long size; struct inode_operations * proc_iops; /* 是一个inode_operations结构,其中设置了针对这个proc索引节点的操作函数,

11、这样,我们就可以针对不同类型的proc文件,提供不同的方法,以完成不同的工作。*/ struct file_operations * proc_fops; /*是一个file_operations结构,其中放置了针对这个proc文件的操作函数,我们可以把对proc文件的读写操作,放在这个结构中,用以实现对/proc目录中的文件的读,写功能。*/get_info_t *get_info; /*当用户向proc文件读取的数据小于一个页面大小时,可以使用这个函数向用户返回数据。*/struct module *owner; struct proc_dir_entry *next, *parent,

12、*subdir; /*使用这些链表,在内存中,proc_dir_entry结构就以树的形式链接在一起。 */void *data; read_proc_t *read_proc; write_proc_t *write_proc; atomic_t count; /*该结构的使用计数。当一个proc_dir_entry结构的count减为零时,会释放该结构*/ int deleted; /*这是一个删除标志,当我们调用remove_proc_entry函数要删除一个proc_dir_entry时,如果发现该结构还在使用,就会设置该标志并且退出。 */ kdev_t rdev; /* read_

13、proc_t *read_proc 和write_proc_t *write_proc:这两个函数提供了对proc文件进行操作的简单接口。我们知道,对于proc文件,我们可以从中读取核心数据,还可以向其中写入数据,因此,对于一些功能比较简单的proc文件,我们只要实现这两个函数(或其中之一)即可,而不用设置inode_operations结构,这样,整个操作比较简单。实际上,我们会在后面的分析中看到,在注册proc文件的时候,会自动为proc_fops设置一个缺省的file_operations结构,如果我们只实现了上面提到的两个读写操作,而没有设置自己file_operations结构,那么

14、,会由缺省的inode_operations结构中的读写函数检查调用这两个函数。*/;5.函数create_proc_entry,由它创建并注册proc文件。struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent) /*函数内容不必详细了解,只要会调用此函数即可。name为要创建的文件名,mode为创建文件的属性;parent指向该文件父目录的指针,如果创建的虚拟文件位于/proc下,则这个参数为NULL(表示 /proc 根目录)。*/6. read_proc_t: 如果只是创建了虚拟文件,那么它并不能被读写。为此,我们必须为每个虚拟文件挂接读写函数,因为此题中只用到读函数,所以只看了函数指针read_proc字段的相关内容。类型定义如下:typedef int (read_proc_t)(char *page, char *start, off_t o

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 机械/制造/汽车 > 汽车技术

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号