实验内容

(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: 静态编译链接进内核,在系统启动过程中进行初始化

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

操作系统实验:Linux内核模块编程相关推荐

  1. Linux内核模块编程指南(一)(转)

    Linux内核模块编程指南(一)(转) 当第一个原始的程序员在最开始的窑洞计算机之墙上凿过第一个程序时,那是一个在羚羊图案上画上"Hello, world"的程序.罗马人的编程书籍 ...

  2. Linux内核模块编程系列1-极简内核模块编写

    1.准备工作 使用如下命令查看自己Linux的内核版本 uname -a 结果如下: Linux VM-73-203-debian 4.9.0-6-amd64 #1 SMP Debian 4.9.88 ...

  3. 杭电操作系统实验二 --- Linux 内核模块编程(arm架构华为云)

    一.题目介绍 掌握Linux 内核模块的基本概念 ·阅读教材7.3.2节Linux内核模块简介 ,网上查找资料,了解Linux内核模块的基本概念. ·阅读教材7.3.3内核模块编程基础 ,网上查找资料 ...

  4. linux内核模块实验,linux内核模块实验(2学时)

    第一个内核模块实验 一:预习要求: (1 )做本实验之前,请复习相关内核模块知识. (2 )请了解内核模块的编写.编译及安装与卸载方法. (3 )请学习内核打印函数printk() 的用法. (4 ) ...

  5. linux内核模块实验,linux内核模块实验(2学时).doc

    第一个内核模块实验 一: 预习要求: ( 1 ) 做本实验之前,请复习相关内核模块知识. ( 2 ) 请了解内核模块的编写.编译及安装与卸载方法. ( 3 ) 请学习内核打印函数 printk() 的 ...

  6. 关于linux内核模块编程时,多个源代码文件Makefile书写的问题

    本文转自:https://blog.csdn.net/u010560290/article/details/44647683 在学习内核模块编程的时候遇到了一些由于Makefile书写不正确导致的问题 ...

  7. 杭电(杭州电子科技大学)操作系统实验二:Linux内核模块编程

    实验内容 (1)设计一个模块,要求列出系统中所有内核线程的程序名.PID.进程状态.进程优先级.父进程的PID. (2)设计一个带参数的模块,其参数为某个进程的PID号,模块的功能是列出该进程的家族信 ...

  8. 操作系统实验·Linux进程通信与内存管理

    预备知识 Linux进程的数据结构 在Linux中,进程用task_struct表示,所有进程被组织到以init_task为表头的双向链表中(见[include/linux/sched.h]SET_L ...

  9. Linux内核模块编程入门

    针对2.6内核的Linux系统,需要你的机器上已经安装了kernel-devel这个包,也就是编译模块所必须的东西:内核的头文件和一些Makefile. 一,Hello World程序: [code: ...

最新文章

  1. Alpha 冲刺报告(3/10)
  2. eclipse配置jdk问题
  3. Nginx学习笔记---ngx_table_elt_t数据结构
  4. 突发!百度CEO李彦宏被当中泼了一瓶水,肇事者网名:直男上树
  5. [导入]ASP.NET中上传并读取Excel文件数据
  6. Java:关于main方法的10道面试题
  7. mysql5.7乱码_mysql5.7中解决中文乱码的问题
  8. 前端学习(1543):MVC的组成部分
  9. 如何实现图像访问计数器
  10. delphi学习路线
  11. python读取excel日期和时间数据_python 在excel文件中写入date日期数据,以及读取excel日期数据,如何在python中正确显示date日期。...
  12. 使用monkey 前准备工作
  13. python实现图片自动轮番播放
  14. Doing It in User Space
  15. Stream流的使用函数式接口
  16. 随机森林模型保存-python
  17. springboot大学校园网上图书馆信息管理系统的设计与实现小程序毕业设计源码091535
  18. 指针练习 - 使用指针找出函数中最大值和最小值
  19. 怎样判断路由器的好坏和选择路由器?
  20. 百度地图html演示,百度地图.html

热门文章

  1. CS+查看ROM和RAM用量
  2. 常用线缆用量计算公式大汇总
  3. java技术知识简介
  4. 软件测试测试用例执行多少条,软件测试用例执行中有效的策略
  5. 【最全下载合集】最新Office 2021微软官方原版离线安装下载地址合集
  6. 排球计分系统java_排球计分系统|网世技术排球计分系统下载v1.0官方版 - 欧普软件下载...
  7. cgcs2000大地坐标系地图_如下生成CGCS2000坐标系等高线
  8. 沪深A股重污染行业上市公司匹配结果2000-2021年(数据+代码)
  9. 好东西要分享,PCB自动生成元件库和封装库的方法
  10. 51单片机~光敏传感器,比较器(模电,运放,放大原理)原理芯片