Linux操作系统实验2——进程描述

news2024/11/16 21:25:30

实验要求:

1.查看task_struct的结构,找到其中的pid,state,prio,parent pid字段

2.在task_struct结构中找到vma相关字段,vm_start,vm_end,vm_next

3.打印指定pid的基本信息,包括基本信息及VMA内存区的信息。

4.显示dmesg的查看内核模块的输出信息里的vma地址,和通过cat /proc/pid/maps命令显示内容一致。

 实验原理:

1.linux内核中进程控制块结构,linux内核管理进程的数据结构及其访问方法:

其结构大概如上图,即task_struct。其中定义了子进程、父进程、优先级和进程状态等字段。不同内核版本的字段名可能不一样。

访问方法就是定义一个进程控制块task_struct类型的指针,然后通过指针获取进程号、优先级等字段属性。

2.linux系统中vm结构,linux系统中vm的管理以及vm链表的组织形式:

Linux中,虚存是通过链表的形式管理的,利用vm_next指针可以指向下一个地址块节点。

获取虚存地址时,先定义一个进程控制块指针p,利用p的mm指针找到mm_struct中的mmap指针(指向虚存区域列表),进而找到每块虚存地址的起始地址。

3.内核模块参数传递,加载内核模块时候的参数传递方法:

其实就是函数module_param(pid,int,0644)的使用,第一个参数为参数名,第二个参数为参数类型,第三个参数为指定了在sysfs中相应文件的访问权限。

加载内核模块时,需要在命令后边给参数赋值,比如:

本实验中,pid对应的进程必须存在且正在运行,否则会提示“已杀死”:

参考代码:

 task_struct.c:

# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/sched.h>
# include <linux/init_task.h>
# include <linux/init.h>
# include <linux/fdtable.h>
# include <linux/fs_struct.h>
# include <linux/mm_types.h>

MODULE_LICENSE("GPL");

//内核模块初始化函数
static int __init print_pid(void)
{
	struct task_struct *task, *p;
	struct list_head *pos;
	int count=0;
	printk("Printf process'message begin:\n");
	task = &init_task;
	
	//遍历进程链表
	list_for_each(pos,&task->tasks)
	{
		p = list_entry(pos,struct task_struct,tasks);
		count++;
		printk("\n\n");
		printk("pid:%d; state:%lx; prio:%d; static_prio:%d; parent'pid:%d; count:%d; umask:%d;",	\
			p->pid,p->__state,p->prio,p->static_prio,(p->parent)->pid,								\
			atomic_read((&(p->files)->count)),(p->fs)->umask);
		
		if((p->mm)!=NULL)
			printk("total_vm:%ld;",(p->mm)->total_vm);
	}
	
	printk("进程的个数:%d\n",count);	

	return 0;
}

//内核模块退出函数
static void __exit pid_exit(void)
{
	printk("exiting...\n");
}


module_init(print_pid);
module_exit(pid_exit);

  task_struct.c对应Makefile文件:

#Makefile文件注意:假如前面的.c文件起名为first.c,那么这里的Makefile文件中的.o文
#件就要起名为first.o    只有root用户才能加载和卸载模块
obj-m:=task_struct.o                          #产生task_struct模块的目标文件
#目标文件  文件  要与模块名字相同
CURRENT_PATH:=$(shell pwd)             #模块所在的当前路径
LINUX_KERNEL:=$(shell uname -r)        #linux内核代码的当前版本
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)

all:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules    #编译模块
#[Tab]              内核的路径       当前目录编译完放哪  表明编译的是内核模块

clean:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean      #清理模块

mem.c:

#include<linux/module.h>
#include<linux/init.h>
#include<linux/interrupt.h>
#include<linux/sched.h>

static int pid;
module_param(pid,int,0644);
static int __init memtest_init(void){
	struct task_struct *p;
	//struct task_struct *p1;
	struct vm_area_struct *temp;
	printk("The virtual memory areas(VMA) are:\n");
	p=pid_task(find_vpid(pid),PIDTYPE_PID);//该函数因内核版本而稍有不同
	//printk("%p\n",p);
	//p1=pid_task(find_get_pid(pid),PIDTYPE_PID);
	//printk("%p\n",p1);
	temp=p->mm->mmap;
	while(temp){
		//printk("start:%p\tend:%p\n",(unsigned long*)temp->vm_start,(unsigned long*)temp->vm_end);
		//printk("start:%x\tend:%x\n",(unsigned long*)temp->vm_start,(unsigned long*)temp->vm_end);
		printk("start:%lx\tend:%lx\n",(unsigned long*)temp->vm_start,(unsigned long*)temp->vm_end);
		//printk("start:%pK\tend:%pK\n",(unsigned long*)temp->vm_start,(unsigned long*)temp->vm_end);
		temp=temp->vm_next;
	}
	return 0;
}
static void __exit memtest_exit(void){
	printk("Unloading my module.\n");
	return;
}
module_init(memtest_init);
module_exit(memtest_exit);
MODULE_LICENSE("GPL");

mem.c对应Makefile文件:

#Makefile文件注意:假如前面的.c文件起名为first.c,那么这里的Makefile文件中的.o文
#件就要起名为first.o    只有root用户才能加载和卸载模块
obj-m:=mem.o                          #产生task_struct模块的目标文件
#目标文件  文件  要与模块名字相同
CURRENT_PATH:=$(shell pwd)             #模块所在的当前路径
LINUX_KERNEL:=$(shell uname -r)        #linux内核代码的当前版本
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)

all:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules    #编译模块
#[Tab]              内核的路径       当前目录编译完放哪  表明编译的是内核模块

clean:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean      #清理模块

 exam.c:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/mman.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

int main(){
	int i,fd;
	char * buf;
	printf("pid=%d\n",getpid());
	sleep(500);
}

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

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

相关文章

分组卷积与dw卷积

分组卷积&#xff08;Group Convolution&#xff09; 分组卷积在ResNext中用到了 首先必须明确&#xff1a; 常规卷积&#xff08;Convolution&#xff09;的参数量是&#xff1a; K*K*C_in*n K是卷积核大小&#xff0c;C_in是input的channel数&#xff0c;n是卷积核个数(outp…

共享模型之管程(一)

1.共享带来的问题 1.1.线程安全问题 例如: 两个线程对初始值为0的静态变量一个做自增,一个做自减,各做5000次,结果是0吗? Slf4j public class TestThread {//静态共享变量static int counter 0;public static void main(String[] args) throws InterruptedException {Threa…

【Axure教程】拖动排序——扣款顺序

随着移动支付的发展&#xff0c;移动支付的途径和方式也越来越多&#xff0c;常见的有钱包余额支付、支付宝支付、微信支付、银行卡支付……随着绑定的账户越来越多&#xff0c;我们需要一个设置扣款顺序的功能页面。 所以今天作者就教大家如果做一个拖动排序的扣款顺序的原型…

机器学习的4种经典模型总结

机器学习&#xff08;Machine Learning&#xff09;是人工智能的一个分支&#xff0c;也是人工智能的一种实现方法。机器学习的核心是“使用算法解析数据&#xff0c;从中学习&#xff0c;然后对新数据做出决定或预测”&#xff0c;机器学习的概念就是通过输入海量训练数据对模…

【财务】FMS财务管理系统---质保金与预付款

在FMS财务管理系统中&#xff0c;如何对质保金和预付款进行管理&#xff0c;笔者做了详细的业务流程拆解。 上一篇主要说了财务应收管理&#xff0c;有一些朋友留言提出了很多建议&#xff0c;在这里必须谢谢。 关于应收分为ToC与ToB两部分&#xff0c;每一部分都与前端业务系…

新一代自动出价范式:在线强化学习SORL框架

丨目录&#xff1a; 摘要 动机&#xff1a;在离线不一致问题 问题建模 方法&#xff1a;SORL框架 实验结果 总结 关于我们 参考文献▐ 摘要近年来&#xff0c;自动出价已成为广告主提升投放效果的重要方式&#xff0c;在真实广告系统&#xff08;RAS&#xff09;中&#xff0c;…

C++ 数学与算法系列之高斯消元法求解线性方程组

1. 前言 什么是消元法&#xff1f; 消元法是指将多个方程式组成的方程组中的若干个变量通过有限次地变换&#xff0c;消去方程式中的变量&#xff0c;通过简化方程式&#xff0c;从而获取结果的一种解题方法。 消元法主要有代入消元法、加减消元法、整体消元法、换元消元法、…

【C/C++ SOCKET编程】实现服务器客户端的简单通信

什么是SOCKET Socket又称"套接字"&#xff0c;应用程序通常通过"套接字"向网络发出请求或者应答网络请求&#xff0c;使主机间或者一台计算机上的进程间可以通讯。 TCP/IP协议 从字面意义上讲&#xff0c;有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议…

Hive环境安装搭建

目录 Hive安装 MySQL安装 配置Hive元数据库到MySQL Hive安装 软件包 0积分免费下载&#xff1a; hive环境安装所需软件包-Hive文档类资源-CSDN下载 将软件包拖进虚拟机中 将jar包解压到目录 给目录文件夹名改为hive 配置环境变量 输入命令&#xff1a; vim /etc/profile …

数据滚动大屏:Stimulsoft Dashboards.WIN 2023.1.2

Stimulsoft Dashboards.WIN 是一组组件&#xff0c;您可以使用这些组件将分析添加到您的应用程序中。WinForms 和 WPF 的仪表板 Stimulsoft Dashboards.WIN 是一个功能齐全的工具&#xff0c;用于在仪表板上转换、分析、分组、过滤、排序和显示数据。它与 .NET Framework 4.5 及…

科创板智能家居第一股,萤石网络昨日上市

2022年12月28日&#xff0c;杭州萤石网络股份有限公司(以下简称“萤石网络”)成功登陆上海证券交易所科创板&#xff0c;证券代码为688475。值得一提的是&#xff0c;萤石网络是登陆科创板的第500家企业。 在上市仪式上&#xff0c;萤石网络董事长、总经理蒋海青表示&#xff0…

医药信息咨询公司排名TOP10是怎么进行收费的?

随着我国医药行业的飞速发展&#xff0c;市场竞争也是越发的激烈&#xff0c;作为产业链中的医药信息咨询公司作用也愈加明显&#xff0c;医药信息咨询公司以提供医药行业的战略咨询、项目尽调、产品立项评估、行业赛道/细分市场机会评估、专利服务、新产品上市服务、新药产品特…

QA | 关于高级硬件在环(HIL)想要了解的十个问题

HiL&#xff08;Hardware-in-the-Loop&#xff09;硬件在环仿真测试系统是采用实时处理器运行仿真模型来模拟受控对象&#xff08;比如&#xff1a;汽车、航空飞机等设备&#xff09;的运行状态&#xff0c;以此判断电控模块的性能。 Q1&#xff1a;什么是HIL&#xff1f; 硬…

分享20个Javascript中的数组方法,收藏

什么是数组&#xff1f;与其他编程语言中的数组一样&#xff0c;Array对象允许在一个变量名称下存储多个项的集合&#xff0c;并且具有用于执行常见数组操作的成员。 声明数组 我们可以用两种不同的方式声明数组。 使用新阵列 使用new Array&#xff0c;我们可以指定希望存在…

GitHub下载量10W,最新23版Java岗面试攻略,涵盖25个技术栈

年底失业&#xff0c;机会也不多&#xff0c;短时间内想找到合适工作是几乎不可能的。身体好点在家&#xff0c;主要建议大家就做两件事&#xff1a; 第一&#xff1a;整理工作经验&#xff0c;制定新年求职计划。等一些不错的公司放出新的hc&#xff0c;市场情况一回暖&#…

淘宝首页serverless升级后的质量保障方案

本文主要介绍了serverless 架构升级在淘宝首页的应用&#xff0c;新架构对底层所依赖的容器、环境资源等与之前相比差异较大&#xff0c;并且对应的预发、安全生产、生产等环境&#xff0c;与旧架构的完全隔离。背景阿里巴巴集团大淘宝技术全面推进云原生2.0战役——serverless…

wordpress企业主题推荐

WordPress制造企业主题推荐 国潮好物&#xff0c;配国产主题&#xff0c;为中国制造加油、助力&#xff0c;适合生产、加工、制造业官网的WordPress主题。 演示 https://www.jianzhanpress.com/?p4358 wordpress服务行业网站模板推荐 浅绿色小清新wordpress网站模板&#x…

软件测试期末复习(一)试题及答案

一、单项选择题&#xff08;每空 2 分&#xff0c;共 40 分&#xff09; 1&#xff0e;软件测试的目的:&#xff08; c &#xff09; A. 避免软件开发中出现的错误 B. 发现软件开发中出现的错误 C. 尽可能发现并排除软件中潜藏的错误&#xff0c;提高软件的可靠性 D. 修改软件…

Axure绘制流程图

相信大家在日常的工作中经常会绘制流程图&#xff0c;基本常见的绘制流程图的工具有Visio、亿图等。但是如果大家使用的是axure制作的产品prd的话&#xff0c;这些流程图的源文件全部需要进行存储&#xff0c;一旦丢失就需要重新画一遍&#xff0c;这样是很不方便。那么有没有一…

JDBC API详解

文章目录入门案例DriverManagerConnectionStatementResultSetPreparedStatement数据库连接池完整代码入门案例 package jdbc;import java.sql.*;public class connectionTest {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.注册…