操作系统实验:Linux内核模块编程

article/2025/9/24 6:05:39

实验内容

(1)设计一个模块,要求列出系统中所有内核线程的程序名、PID、进程状态、进程优先级、父进程的PID。
(2)设计一个带参数的模块,其参数为某个进程的PID号,模块的功能是列出该进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID号及进程状态。

实验步骤

实验内容一

1、编写模块代码(文件名module1.c,随便创建一个文件夹放在里边就好)

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/sched/signal.h>// 初始化函数
static int hello_init(void)
{struct task_struct *p;  //Linux内核的进程控制块是task_struct结构体,所有运行在系统中的进程都以task_struct链表的形式存在内核中printk(KERN_ALERT"            名称\t进程号\t状态  \t优先级\t父进程号\t");for_each_process(p)  //for_each_process是一个宏,在sched.h里面定义: 是从init_task开始遍历系统所有进程,init_task是进程结构链表头。{if(p->mm == NULL){ //对于内核线程,mm为NULLprintk(KERN_ALERT"%16s\t%-6d\t%-6ld\t%-6d\t%-6d\n",p->comm,p->pid, p->state,p->normal_prio,p->parent->pid);}}return 0;
}
// 清理函数
static void hello_exit(void)
{printk(KERN_ALERT"goodbye!\n");
}// 函数注册
module_init(hello_init);  
module_exit(hello_exit);  // 模块许可申明
MODULE_LICENSE("GPL");  

2、编写Makefile(文件名Makefile,下面代码中,$(MAKE)前面的是Tab,不是单纯的空格)这个文件和module1.c写在一个文件夹内

obj-m := module1.o
KDIR:= /lib/modules/$(shell uname -r)/build
PWD:= $(shell pwd)default:$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:$(MAKE) -C $(KDIR) M=$(PWD) clean

obj-m: 编译成可动态加载的module,通过insmod动态重定位装入到内核
obj-y: 静态编译链接进内核,在系统启动过程中进行初始化

module1

3、编译,添加模块,并输出日志

(1)编译

make

(2)添加模块

insmod module1.ko

(3)输出日志查看效果

dmesg

(4)若要修改module1.c代码,重新添加同名模块前需要先卸载模块,否则会报错。

rmmod module1.ko

在这里插入图片描述

实验内容二

1、编写模块(文件名module2.c,创建一个新的文件夹,放在里边)

#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include <linux/sched.h>
#include <linux/moduleparam.h>static pid_t pid=1;
module_param(pid,int,0644);  //用来传递命令行参数static int hello_init(void)
{struct task_struct *p;struct list_head *pp;struct task_struct *psibling;// 当前进程的 PIDp = pid_task(find_vpid(pid), PIDTYPE_PID); //通过pid和其对应的类型PIDTYPE_PID找到对应的task_structprintk("当前进程: %d %s %ld\n", p->pid, p->comm, p->state);// 父进程if(p->parent == NULL) {printk("没有父进程!\n");}else {printk("父进程: %d %s %ld\n", p->parent->pid, p->parent->comm, p->parent->state);}// 兄弟进程list_for_each(pp, &p->parent->children) //for循环遍历链表{psibling = list_entry(pp, struct task_struct, sibling); //找出pp指向的链表节点所在的task_struct类型的结构体首地址, sibling是结构体成员printk("兄弟进程: %d %s %ld\n", psibling->pid, psibling->comm, psibling->state);}// 子进程list_for_each(pp, &p->children){psibling = list_entry(pp, struct task_struct, sibling); //sibling用于把当前进程插入到兄弟链表中printk("子进程: %d %s %ld\n", psibling->pid, psibling->comm, psibling->state);}return 0;
}static void hello_exit(void)
{printk(KERN_ALERT"goodbye!\n");
}module_init(hello_init);
module_exit(hello_exit);MODULE_LICENSE("GPL");

2、编写Makefile(文件名Makefie,依旧是放到同一个文件夹里)

obj-m:=module2.o
KDIR:= /lib/modules/$(shell uname -r)/buildPWD:= $(shell pwd)default:$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:$(MAKE) -C $(KDIR) M=$(PWD) clean

3、编译,添加模块,并输出日志

(1)编译

make

(2)添加模块,PID号可以利用实验内容一读取出来的进程号,不然随便写一个数字很可能由于没有该进程从而报错

insmod module2.ko pid=168

(3)输出日志,从左到右依次是进程说明、进程号、进程的程序名、进程状态

dmesg

module2


http://chatgpt.dhexx.cn/article/QbgHmqXd.shtml

相关文章

HC12微控制器上的闪存内核编程

HC12微控制器上的闪存内核编程 作者 Sven Deckardt 限制 草案文件 摘要 本应用笔记的目的是解释如何为HC12实现CCP闪存内核以及如何为闪存编程配置CANape Graph。 目录 1.0概述... 1 闪存内核的一般用法... 1 2.0 Flash内核... 3 2.1结构... 3 2.2 …

Linux内核模块编程入门( 最简单的内核模块编程)

第1章简介 什么是内核模块&#xff1f; 所以&#xff0c;你想编写一个内核模块。 你知道C&#xff0c;你已经编写了一些正常的程序作为进程运行&#xff0c;现在你想要到达实际操作的位置&#xff0c;一个狂野指针可以消灭你的文件系统&#xff0c;核心转储意味着重启。 什么…

Linux内核模块编程

Linux内核模块编程 (作者&#xff1a;Baron_wu 禁止转载) 首先&#xff0c;创建一个内核模块并插入Linux内核中。这是实验第一部分 首先查看当前内核模块使用情概况&#xff1a;lsmod Module&#xff1a;模块名 Size&#xff1a;模块大小 Used by&#xff1a;这些模块在哪被使…

Linux内核网络编程

netfilter 内核网络编程 网络协议数据结构inet_protosw 在Linux-2.6.26.3/net/ipv4/af_inet.c文件中有一个名为inet_init()的函数对协议进行了初始化。inet_init()函数使用proto_register()函数来注册每个内嵌协议。 软中断CPU报文队列及其处理 Linux内核网络协议层的层间…

Linux学习之内核模块编程

前言 之前成功编译了内核&#xff0c;这次学习如何修改增加删除内核模块&#xff0c;为了保证内核的纯净&#xff0c;我特意重新编译安装了一个新的5.11.8的内核&#xff0c;其他内核同理。 本文原创&#xff0c;创作不易&#xff0c;转载请注明&#xff01;&#xff01;&…

MATLAB脚本调用simulink仿真文件及simulink模块参数修改-load_system函数-sim函数-set_param函数

文章目录 1. load_system2. sim3. set_param4. get_param5. 应用 1. load_system 加载系统&#xff0c;添加所需要加载的simulink仿真模型所在的路径和名称。 load_system(pathname\filename);必须加载系统之后才可以完成后续的运行simulink仿真模型和获取仿真模型参数和设置…

Matlab学习笔记3——str2num

Matlab学习笔记3——str2num Convert character array or string to numeric array 将字符数组或字符串转换为数字数组 语法 X str2num(chr) [X,tf] str2num(chr) 输出 X — 输出数组 数字矩阵 输出数组&#xff0c;以数字矩阵形式返回。 tf — 真或假 1 |0 真或假结果…

strlen,strcpy,strcat,strcmp函数

1.strlen函数 strlen函数的作用是计算给定字符串的长度&#xff0c;从内存的某个位置开始&#xff0c;遇到第一个\0结束。 使用样例&#xff1a; int main() {const char *ar "abcdef";printf("%d\n", strlen(ar)); } 返回字符串"abcdef"的…

MATLAB str char cell num格式互相转换

简介 关于如何str char cell num格式互相转换的例子很多&#xff0c;但是都很单一&#xff0c;有时候使用的时候需要查找很久才可以解决问题。这里就对这几种方法进行一个汇总。 之所以会涉及使用cell&#xff0c;是因为涉及字符串、数字在同一个“矩阵”中&#xff0c;这时候…

C++ std::string::substr()

substr()函数返回一个新建的 初始化为string对象的子串的拷贝string对象。 子串是&#xff0c;在字符位置_Off开始&#xff0c;跨越_Count个字符&#xff08;或直到字符串的结尾&#xff09;对象的部分 void main() {//std::string::substr(_Off 0, _Count 4294967295U)&am…

matlab中 str2num 函数与 str2double 函数的区别

str2num 函数与 str2double 函数的相同点与不同点 1. 相同点&#xff1a; 当str为一个含数字的字符串时&#xff0c; str2num 函数与 str2double 函数一样。 如&#xff1a; 2. 不同点&#xff1a;当str为多个字符串构成的数组时&#xff0c; str2num 函数与 str2double 函数有…

可逆计算:下一代软件构造理论

可逆计算&#xff1a;下一代软件构造理论 众所周知&#xff0c;计算机科学得以存在的基石是两个基本理论&#xff1a;图灵于1936年提出的图灵机理论和丘奇同年早期发表的Lambda演算理论。这两个理论奠定了所谓通用计算&#xff08;Universal Computation&#xff09;的概念基础…

android 微积分计算器,不到1M的良心之作 连微积分都能算的计算器APP

计算器可谓是被手机取代的一大电子产品了&#xff0c;不过手机上的APP是否真的有传统的计算器好用&#xff1f;也并不一定。 一来&#xff0c;手机上的计算器APP功能普遍偏弱&#xff0c;特别是手机ROM自带的计算器&#xff1b;二来&#xff0c;计算器APP也算得上是流氓软件的重…

matlab对信号积分,对信号求积分 - Simulink - MathWorks 中国

说明 Integrator 模块输出其输入信号相对于时间的积分值。 Simulink 将 Integrator 模块作为具有一种状态的动态系统进行处理。模块动态由以下方程指定: {x˙(t)=u(t)y(t)=x(t)x(t0)=x0 ,其中: u 是模块输入。 y 是模块输出。 x 是模块状态。 x0 是 x 的初始条件。 虽然这些…

清华大学计算机学复变函数吗,清华大学计算机系课程 - osc_vq6lx46c的个人空间 - OSCHINA - 中文开源技术交流社区...

这么NB的大学&#xff0c;这么NB的课程&#xff0c;我们还有何理由不努力&#xff0c;同是大学生&#xff0c;人家在学校学的本身就比我们多&#xff0c;还需要更加努力才能跟上步伐&#xff0c;加油。 补充&#xff1a; 清华大学计算机系的课程分为六类课程&#xff1a; (一)公…

Chapter2.4:复数和复变函数运算

该系列博客主要讲述Matlab软件在自动控制方面的应用&#xff0c;如无自动控制理论基础&#xff0c;请先学习自动控制系列博文&#xff0c;该系列博客不再详细讲解自动控制理论知识。 自动控制理论基础相关链接&#xff1a;https://blog.csdn.net/qq_39032096/category_10287468…

信号与系统分析中的复变函数

动态图片来自于&#xff1a; ShutterStock 网站 . 01 教程规划 1.1 背景介绍 针对于信号与系统分析 课程学习的同学&#xff0c;由于之前没有先修过课程复变函数 &#xff0c;则会在后面信号与系统理论学习中缺少复变函数相关理论支持。为了帮助这部分同学及时补充上复变函数相…

matlab复变函数应用,matlab在复变函数中的一些应用修改后的.doc

matlab在复变函数中的一些应用修改后的.doc MATLAB语言课程论文MATLAB在复变函数中的一些应用姓名刘乐学号12013241953专业通信工程班级2013级通信2班指导老师朱瑜红学院物理电气性息学院完成日期2013年11月9日MATLAB在复变函数中的一些应用刘乐120132419532013级通信2班【摘要…

复变函数与积分变换matlab,matlab在复变函数与积分变换的应用

matlab在复变函数与积分变换的应用 本科毕业论文题目&#xff1a; MATLAB在复变函数与积分变换的应用 学院&#xff1a; 数学与计算机科学学院 班级&#xff1a; 数学与应用数学2009级班 姓名&#xff1a; 指导教师&#xff1a; 职称&#xff1a; 副教授 完成日期&#xff1a;…