教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 实用文档 >

Linux内核模块课程设计

来源:网络收集 时间:2026-09-02
导读: Linux课程设计 项目名称: 内核模块编程 姓 班 学 日 目录 一.课程设计目的 ...................................................................................................................................................... 3 二.任务描述 ..

Linux课程设计

项目名称: 内核模块编程 姓

班 学 日

目录

一.课程设计目的 ...................................................................................................................................................... 3

二.任务描述 ........................................................................................................................................................... 3

三.选题原因四、准备阶段五.整体思路六.程序代码七.遇到的问题八.测试结果 ......................................................................................................................................................... 13

九.总结 ................................................................................................................................................................. 15

一.课程设计目的

通过课程设计对操作系统基本原理进行更深入的认识,以Linux为具体研究对象,分析理解操作系统底层实现,综合利用已学知识与技术,就Linux操作系统各功能方面进行模拟或实现

二.任务描述

编写proc文件系统相关的内核模块: 设计一个模块,该模块功能是列出系统中所有内核线程的程序名、PID号和PID号,功能是列出进程PID号。

三.选题原因

统底层的理解。

四、准备阶段

文件的作用,对内核的概念也很模糊,并且错误上网逐一进行学习。下面是查找的一些资料。

1.关于linux内核编程书本上有详细介绍并且也比较好理解。首先把书上例题演示了一遍,对模块编程就掌握的差不多了。

模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。

应用程序与内核模块程序的比较

C语言应用程序

内核模块程序

使用函数 运行空间 运行权限 入口函数 出口函数 编译 连接 运行 调试

Libc库 用户空间 普通用户 main() exit() Gcc –c Gcc 直接运行 Gdb

内核函数 内核空间 超级用户 module_init() module_exit() insmod 等

2. 编译工具make : Makefile 的文件来完成并自动维护编译工作。

Makefile,此文件要与模块在同一个文件

夹下。

obj-m += nullparam.o else

PWD := $(shell pwd)

KVER := $(shell uname -r)

KDIR := /lib/modules/$(KVER)/build all:

$(MAKE) -C $(KDIR) M=$(PWD) clean:

rm -rf *.o *.mod.c *.ko *.symvers *.order *.markers endif

KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义, 所以make将读取

执行else之后的内容。如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句, 指明模块源码中各文件的依赖关系,以及要生成的目标模块名。obj-m += nullparam.o表示编译连接后将生成nullparam.o模块

2.用户级线程:指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。

内核线程:指需要内核的参与,由内核完成线程的调度。其依赖于操3.proc文件系统:proc即processproc文件系统只是存放进程的相关信息。但现在的/proc息和配置信息。

/proc从正在运行的内核中读取。

基于这种原因,/proc一方面,用户可以从/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结构的节点号 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索引节点的操作函数,这样,我们就可以针对不同类型的proc文件,提供不同的方法,以完成不同的工作。*/

struct file_operations * proc_fops; /*是一个file_operations结构,其中放置了针对这个proc文件的操作函数,我们可以把对proc文件的读写操作,放在这个结构中,用以实现对/proc*/ get_info_t *get_info; /*当用户向proc可以使用这个函数向用户返回数据。*/ struct module *owner;

使用这些链表,在内存中,proc_dir_entry */

void *data;

atomic_t count; /*proc_dir_entry结构的countint deleted; /*这是一个删除标志,当我们调用remove_proc_entry函数要删除一个proc_dir_entry时,如果发现该结构还在使用,就会设置该标志并且退出。 */

kdev_t rdev;

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

…… 此处隐藏:6380字,全部文档内容请下载后查看。喜欢就下载吧 ……
Linux内核模块课程设计.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1114745.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)