一、实验目的

编写一个模块,将它作为Linux内核空间的扩展来执行,并报告模块加载时内核的当前进程信息,进一步了解用户空间和内核空间的概念。

二、实验内容

设计并实现一个模块,遍历进程描述符链表,打印出系统的进程数目、当前进程,并尽量多地打印每个进程的信息。
(一)部分A
查看系统已加载模块。写一个小的模块打印“hello world”。
(二)部分B
设计模块遍历进程描述符链表,打印出系统的进程数目、当前进程,并尽量多地打印每个进程的信息。例如:进程PID,进程状态等。
(三)部分B(可选)
使用模块实现一个系统调用(也实现遍历进程链表的功能),并编写一个用户程序测试。体会利用模块从而带来的不用重新编译内核、调试方便等好处。

三、实验过程记录

(一)部分A

进入管理员模式

输入“mkdir hello”构建一个文件夹hello以便把使用的文件写入其中

下载vim发现显示not fatch,尝试修改网关,输入sudo gedit /etc/resolv.conf

在resolv.conf里面添加阿里DNS

输入sudo apt-get update联网更新

再次下载vim,成功下载


创建一个hello.c文件,输入一段代码用来测试和检验

输入测试代码

输入“vim Makefile”编写Makefile文件,用于自动化编译

Makefile文件代码如下

输入“make”,进行编译

输入“ls”,检查文件

输入“insmod hello.ko”插入模块

输入“lsmod | grep test”查看模块

输入“dmesg > hello.txt”生成日志,再输入“vim hello.txt”查看日志

翻到最下边,显示了“hello,word”(前边程序里边打错了,把world打成word)

输入“rmmod hello.ko”卸载模块

(二)部分B

在管理员模式下输入mkdir process构建文件夹并进入

创建一个module1.c文件

代码如下图所示

创建Makefile文件

代码如下图所示

输入make进行编译

输入ps -u root查看root用户的进程

输入make clean

(三)部分B(可选)

创建mk文件夹并进入

创建测试进程生成程序setprocess.c

代码如下

创建树状图生成程序(mymod_test.c)

代码如下

创建内核模块(系统调用)程序mymod.c

代码如下

编译测试进程生成程序(setprocess.c)

编译树状图生成程序(mymod_test.c)

输入“vim Makefile”编写Makefile文件,用于自动化编译

代码如下

编译内核模块(系统调用)程序(mymod.c) 

四、实验小结

1.在本实验中,我们通过编写一个模块,将它作为Linux内核空间的扩展来执行,并报告模块加载时内核的当前进程信息。进程是任何多道程序设计的操作系统中的基本概念。为了管理进程,内核必须对每个进程所做的事情进行清楚的描述。为了对给定类型的进程(例如,在可运行状态的所有进程)进行有效的搜索,内核建立了几个进程链表。
2.模块运行在所谓的内核空间(Kernel space)里,而应用程序运行在所谓的用户空间里(User space)中。我们通常将执行模式称作内核空间和用户空间。这两个术语不仅说明两种模式具有不同的优先权等级,而且还说明每个模式都有自己的内存映射,即自己的地址空间。
3.这个实验让我们进一步地了解了用户空间和内核空间的概念,让我们试着动手完成对模块的编写,对于今后对linux的深入研究具有重要的意义。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐