【操作系统】实验七 显示进程列表

news2024/11/16 13:40:27

🕺作者: 主页

我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢支持!!!

文章目录

  • 实验七 显示进程列表
    • 一、实验目的
    • 二、实验内容
    • 三、实验过程记录
      • 部分A
      • 部分B
    • 四、实验小结

实验七 显示进程列表

一、实验目的

掌握进程结构及进程管理原理

二、实验内容

  1. 实验名称:显示进程列表
  2. 实验任务:
    编写一个模块,将它作为Linux内核空间的扩展来执行,并报告模块加载时内核的当前进程信息,进一步了解用户空间和内核空间的概念。

三、实验过程记录

部分A

实验任务:查看系统已加载模块。写一个小的模块打印“hello world”。
查看已加载模块,如图所示。

编写小模块打印“hello world”
代码如下:
20191909.c文件

#include<linux/module.h>
int hello_init(void)
{
    printk("\nhello world\n");
    return 0;
}
void hello_exit(void){
    printk("\n bye bye world\n");
}
MODULE_AUTHOR("20191909");//id
MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);

Makefile文件

obj-m:=20191909.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

操作如下:

  1.  编译 make 如图1所示
    


图1

  1.  加载模块insmod 20191909.ko 如图2所示
    


图2

  1.  查看日志dmesg如图3所示
    


图3
4) 删除模块rmmod 20191909.ko 如图4所示


图4

  1.  查看日志dmesg如图5所示
    


图5

部分B

实验任务:设计模块遍历进程描述符链表,打印出系统的进程数目、当前进程,并尽量多地打印每个进程的信息。例如:进程PID,进程状态等。

编写代码如下:
20191909.c文件

#include <linux/init.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <linux/sched.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
static int num = -1;
module_param(num, int, S_IRUGO);
static __init int exp_init(void){
  struct task_struct *p = NULL;
  // for_each_process宏遍历系统中的每个进程,将其赋值给p
  printk("数量:%d",num);
  for_each_process(p)
  {
    if (num==0 )
      break;
    // 使用printk函数打印当前进程的PID和进程名称,real_parent->pid : 父进程id   __state : 状态
    printk("pid=%d,name=%s,parent_id=%d,state=%d\n", p->pid, p->comm,p->real_parent->pid,p->__state);
    num--;
  }
  return 0;
}
static __exit void exp_exit(void){
  printk("Good bye.\n");
}
module_init(exp_init);
module_exit(exp_exit);

Makefile 文件

obj-m:=20191909.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

操作如下:

  1.  编译make 如图6所示
    


图6

  1.  加载模块insmod 20191909.ko 如图7所示
    


图7

  1.  查看日志 dmesg 可以看到进程的PID、进程名称、父进程id、当前状态 如图8所示
    


图8

  1.  删除模块 rmmod 20191909.ko如图9所示
    


图9

四、实验小结

本次实验旨在通过编写Linux内核模块来了解用户空间和内核空间的概念,并掌握如何显示进程列表。实验分为两部分进行。
在实验的第一部分中,我们成功编写了一个简单的内核模块,用以打印“hello world”信息。通过编译、加载模块、查看日志和删除模块的步骤,我们确认了模块的正确加载和工作。这个过程加深了我们对内核模块生命周期管理的理解。
在实验的第二部分中,我们设计了一个更复杂的内核模块,用于遍历进程描述符链表,打印出系统的进程数目、当前进程以及尽可能多的进程信息(例如:进程PID,进程状态等)。通过这个过程,我们不仅学习了如何访问和操作内核中的进程信息,还加深了对Linux内核进程管理机制的了解。
存在的问题和注意事项:

  1. 在编写内核模块时,需要确保代码的稳定性和安全性,因为任何错误都可能导致系统崩溃或安全漏洞。
  2. 在使用printk进行调试时,应该注意其输出级别,以免产生大量的日志信息影响系统性能。
  3. 在遍历进程时,我们使用了for_each_process宏,需要了解其工作原理及如何正确使用它。
  4. 模块参数的使用提供了灵活性,但也需要注意确保传入的参数是合法的,防止模块运行时出现异常。
    有待提高的能力:
  5. 对内核编程的熟练度,包括更深入地理解内核API和内核编程的最佳实践。
  6. 对Linux内核的整体架构和机制的理解,特别是进程管理、内存管理和模块管理等方面。
  7. 调试技能的提高,包括使用更高级的内核调试工具和技术。
  8. 编写更加健壮和高效的内核代码的能力。

总体而言,本次实验不仅帮助我们实践了内核模块的编写和操作,还增进了我们对Linux内核的理解,为今后深入学习Linux内核打下了良好的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1410729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java 报错java.Net.UnknownHostException:raw.githubusercontent.com

1.问题 今天在vscode 学习如何使用 plantUML生成图片的时候&#xff0c;发生错误 java.util.concurrent.ExecutionException: java.net.UnknownHostException: raw.githubusercontent.com issue raw.githubusercontent.com java.util.concurrent.ExecutionException: java.n…

手写一个图形验证码

文章目录 需求分析 需求 使用 JS 写一个验证码&#xff0c;并在前端进行校验 分析 新建文件 VueImageVerify.vue <template><div class"img-verify"><canvas ref"verify" :width"state.width" :height"state.height&qu…

“研学测”好帮手,三步带你安装体验TDH社区开发版

星环科技TDH社区开发版&#xff0c;作为一款单机可部署、开箱即用的大数据基础平台产品&#xff0c;大幅降低了用户的资源成本和使用门槛。与此同时&#xff0c;TDH社区开发版兼顾此前TDH社区版&#xff08;分布式&#xff09;组件成熟、简单易用、易运维等特点&#xff0c;可以…

《剑指 Offer》专项突破版 - 面试题 28 : 展平多级双向链表(C++ 实现)

题目连接&#xff1a;LCR 028. 扁平化多级双向链表 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 在一个多级双向链表中&#xff0c;节点除了有两个指针分别指向前后两个节点&#xff0c;还有一个指针指向它的子链表&#xff0c;并且子链表也是一个双向链表&…

深入理解MySQL InnoDB线程模型

当我们谈论数据库性能时&#xff0c;存储引擎的线程模型是一个不可忽视的方面。MySQL的InnoDB存储引擎&#xff0c;作为目前最受欢迎的存储引擎之一&#xff0c;其线程模型的设计对于实现高并发、高性能的数据操作至关重要。在本文中&#xff0c;我们将深入探讨MySQL InnoDB线程…

day31_CSS

今日内容 CSS概述引入方式 (where)选择器(how)属性(how) 1 CSS介绍 层叠样式表&#xff08;cascading style sheet&#xff09; CSS 用来美化HTML页面,可以让页面更好看,还可以布局页面. 好处 美化页面,布局页面使用外部css文件,可以实现样式文件和html文件分离,便于维护使用外…

JS进阶-内置构造函数(二)

小提示&#xff1a;这些内置函数在开发使用的频率非常的频繁&#xff0c;建议认真看一下&#xff0c;并背一下 目录 知识回顾&#xff1a; • Object 三个常用静态方法&#xff08;静态方法就是只有构造函数Object可以调用的&#xff09; Object.keys Object.values Obj…

【2024】下载安装Cisco Packet Tracer 8.2.1

一、注册账号 进入www.cisco.com 点击右上角的Log in 点击注册 之后输入邮箱和其他相关信息&#xff0c;正常注册即可 唯一注意的点&#xff1a;国家或地区 选项中别选China&#xff0c;否则之后登录软件时会有问题 二、下载安装包 进入packet-tracer下载&#xff0c;下…

【Tailwind】各种样式的进度条

基本样式进度条&#xff1a; <div class"mb-5 h-2 rounded-full bg-gray-200"><div class"h-2 rounded-full bg-orange-500" style"width: 50%"></div> </div>带文字的进度条&#xff1a; <div class"relativ…

品优购项目规划

1&#xff0c;网站favicon图标 favicon.ico 一般用于作为缩略的网站标注&#xff0c;它显示在浏览器的地址栏或者标签上 1&#xff0c;制作favicon图标 ①把品优购图标切成png图片 ②把png图片转换为ico图标&#xff0c;这需要借助于第三方转换网站&#xff0c;比如 比特虫…

基于移动边缘计算 (MEC) 的资源调度分配优化研究(提供MATLAB代码)

一、优化模型简介 边缘计算资源调度优化模型是为了解决边缘计算场景下的资源分配和任务调度问题而提出的一种数学模型。该模型旨在通过优化算法来实现资源的有效利用和任务的高效执行&#xff0c;以提高边缘计算系统的性能和用户的服务体验。 在边缘计算资源调度优化模型中&a…

基于vue实现计数器案例

一、需求 页面显示两个按钮&#xff0c;分别为&#xff1a;增加 和 减少&#xff1b;显示加减后的数字&#xff1b;加到10提示不能再加&#xff0c;减到0提示不能再减&#xff1b; 二、代码演示 1、实现步骤 data中定义数据: 比如 num 值为1methods中添加两个方法: 比如add…

普通人如何打造自己人生的护城河?

哈喽&#xff0c;大家好啊&#xff0c;我是雷工。 今天在看《张一鸣管理日志》时看到这么一句话&#xff1a; 今日头条不断吸引更优秀的工程师&#xff0c;不断更新算法&#xff0c;才有了当前今日头条的算法护城河。 头条的算法有多牛&#xff0c;看你周边就知道了。 越来越多…

《WebKit 技术内幕》学习之十一(2):多媒体

2 视频 2.1 HTML5视频 在HTML5规范定义中&#xff0c;Web开发者可以使用“video”元素来播放视频资源。视频中有个重要的问题就是视频编码格式&#xff0c;对此&#xff0c;目前标准中包含了三种编码格式&#xff0c;它们分别是Ogg、MPEG4和WebM。其中Ogg是由Xiph.org组织开…

鼠标移入/点击子组件,获取选中子组件事件

不管是移入&#xff0c;或者是点击事件 都要知道是触发的哪个组件 这里子组件是个通用小标题title 所以&#xff0c;通过标题内容&#xff0c;获取触发的哪个子组件子组件 <template><div mouseover"tMouseover" mouseleave"tMouseLeave" class&…

如何使用iPhone或iPad上的二维码共享Wi-Fi密码?这里有详细步骤

你有没有想过在不泄露网络密码的情况下与客人共享你的家庭或工作Wi-Fi?你肯定不是第一个这样想的人,我们很高兴地通知你,多亏了以下这个的变通方法,你现在可以使用iPhone或iPad做到这一点。 通常,如果你想让其他人访问网络,你需要共享你的Wi-Fi密码。苹果通过引入与任何…

Redis原理篇(String)

一.编码方式 String 有三种编码方式 1.RAW编码 type是类型&#xff0c;表示该类型是String类型 encoding是编码方式&#xff0c;表示当前是String的RAW编码方式 ptr指针指向一个SDS&#xff08;动态字符串&#xff09;对象 2.EMBSTR编码 当要存的字符串长度小于44个字节时&…

Fluent Bit配置与使用——基于版本V2.2.2

Fluent Bit日志采集终端 文档适用版本&#xff1a;V2.2 1、日志文件处理流程 数据源是一个普通文件&#xff0c;其中包含 JSON 内容&#xff0c;使用tail插件记录日志&#xff0c;通过parsers进行格式化匹配&#xff08;图里没写&#xff09;&#xff0c;通过两个筛选器&…

手把手教你安装Jupyter Notebook(保姆级教程)

Jupyter Notebook介绍 什么是Jupyter Notebook Jupyter Notebook 是一个基于 Web 的交互式计算环境&#xff0c;支持多种编程语言&#xff0c;包括 Python、R、Julia 等。它的主要功能是将代码、文本、数学方程式、可视化和其他相关元素组合在一起&#xff0c;创建一个动态文…