task_struct 结构,mm_struct 结构, vm_area_struct 结构

Linux内核:mm_struct简介 虚拟地址区间vm_area_struct是虚拟内存的1部份,内存描写符mm_struct指向全部虚拟空间,而vm_area_struct只是指向了虚拟空间的1段。之所以这样分隔是由于每一个虚拟区间可能来源不同,有的可能来自可履行映像,有的可能来自同享库,而有的多是动态内存分配的内存区,所以对每一个由vm_area_struct结构所描写的区间的处理操作和它前后范围的处理操作不同,因此linux把虚拟内存分割管理,并利用了虚拟内存处理例程vm_ops来抽象对不同来源虚拟内存的处理方法。 阅读详情

task_struct 结构,mm_struct 结构, vm_area_struct 结构

1、task_struct

每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。

  • 位置:<include\linux\sched.h> - 593行
  • 部分代码如下:
struct task_struct
{
    /*...*/
	struct mm_struct		*mm;
	struct mm_struct		*active_mm;

	/* Per-thread vma caching: */
	struct vmacache			vmacache;
    /*...*/
}
  • *mm
    mm为mm_struct类型的指针,指向mm_struct结构,对于普通的用户进程来说mm字段指向他的虚拟地址空间的用户空间部分,对于内核线程来说这部分为NULL。

  • *active_mm
    对于匿名进程,也可以理解为内核线程,它的mm字段为NULL,表示没有内存地址空间,可也并不是真正的没有,这是因为所有进程关于内核的映射都是一样的,内核线程可以使用任意进程的地址空间。
    内核schedule在进程上下文切换的时候,会根据task->mm判断即将调度的进程是用户进程还是内核线程。
    由于内核线程之前可能是任何用户层进程在执行,故用户空间部分的内容本质上是随机的,内核线程决不能修改其内容,故将mm设置为NULL。所以对于内核线程来说task_struct->mm == NULL,而task_struct->active_mm为某个进程的mm。
    如果切换出去的是用户进程,内核将原来进程的mm存放在新内核线程的active_mm中,因为某些时候内核必须知道用户空间当前包含了什么。
    而当内核线程离开的时候,会把借用的地址空间将会返还给原来的进程,并且清除这一字段。

  • vmcacahe
    vmacache结构体定义在<include\linux\mm_types_task.h>的34行,如下:

    #define VMACACHE_BITS 2
    #define VMACACHE_SIZE (1U << VMACACHE_BITS)
    
    struct vmacache {
      u64 seqnum;
      struct vm_area_struct *vmas[VMACACHE_SIZE];
    };
    

    可以看到它是一个vm_area_struct类型的数组指针,表示指向几段vma。
    这是由于为了提高vma的查找速度,由传统的链表式改为了红黑树管理,然而某些进程地址空间中的vma数量众多,而查找vma又是内核中非常频繁的操作,所以为了进一步加快查找速度,内核采取了一种缓存方式,就是把最近访问的几个vma保存起来。
    VMACACHE_SIZE为左移2位的一个无符号整形数字,这里感觉大概是保存了4个最近访问的vma。

2、mm_struct

每一个进程都会有唯一的mm_struct结构体

  • 位置:<include\linux\mm_types.h> - 340行
  • 部分代码如下:
struct mm_struct
{
    /*...*/
    struct vm_area_struct *mmap;		/* list of VMAs */
	struct rb_root mm_rb;
	u64 vmacache_seqnum;                /* per-thread vmacache */
    unsigned long mmap_base;	/*映射基地址*/
	unsigned long mmap_legacy_base;	/*不是很明白这里*/
    unsigned long task_size;	/*该进程能够vma使用空间大小*/
	unsigned long highest_vm_end;	/*该进程能够使用的vma结束地址*/
	pgd_t * pgd;
    atomic_t mm_users;
    atomic_t mm_count;
    int map_count;			/* vma的总个数 */
    unsigned long total_vm;	   /* 映射的总页面数*/
    /*...*/
    unsigned long start_code, end_code, start_data, end_data;
	unsigned long start_brk, brk, start_stack;
	unsigned long arg_start, arg_end, env_start, env_end;
    /*...*/
  • *mmap
    该进程内已经使用的进程虚拟空间vm_are_struct结构,以双链表形式存储该指针指向vma链表的头节点。

  • mm_rb
    红黑树组织形式,用于快速查找。
    rb_boot结构体定义在<include\linux\rbtree.h>的43行

    struct rb_root {
      struct rb_node *rb_node;
    };
    

    rb_node结构体定义在<include\linux\rbtree.h>的36行

    struct rb_node {
      unsigned long  __rb_parent_color;
      struct rb_node *rb_right;
      struct rb_node *rb_left;
      } __attribute__((aligned(sizeof(long))));
    

    可以看到该数据结构包含了父节点颜色、左子树指针、右子树指针等字段

  • vmacache_seqnum
    vma的缓存策略所使用的字段,表示每个进程都有的几个缓存vma,对应task_struct->vmacache->seqnum。

  • *pgd
    该进程页目录表,把新进程mm_struct的PGD字段填充到CR3中就完成了页表的切换。

  • mm_users、mm_count
    为了支持mm与active_mm,在这里设置了两个计数器,mm_users主要用来记录共用此命名空间的线程数量,mm_count则主要记录对此mm_struct结构体的引用情况。
    也就是说mm_users表示有多少真正使用地址空间的进程,当copy_mm函数在创建进程的时候,遇到CLONE_VM字段的话就再到需要让父子进程共享同一个地址空间,这时会把mm_users加1。而mm_count则表示有多少内核线程引用了这个地址空间。
    当mm_users为0时就会释放mm_count,当mm_count为0时结构体mm_struct将会被释放。

3、vm_area_struct

内核每次为用户空间中分配一个空间使用时,都会生成一个vm_are_struct结构用于记录跟踪分配情况,一个vm_are_struct就代表一段虚拟内存空间。

  • 位置:<include\linux\mm_types.h> - 264行
  • 全部代码如下:
struct vm_area_struct {
	unsigned long vm_start; //虚存区起始
	unsigned long vm_end;   //虚存区结束
	struct vm_area_struct *vm_next, *vm_prev;   //前后指针
	struct rb_node vm_rb;   //红黑树中的位置
	unsigned long rb_subtree_gap;
	struct mm_struct *vm_mm;    //所属的 mm_struct
	pgprot_t vm_page_prot;      
	unsigned long vm_flags;     //标志位
	struct {
		struct rb_node rb;
		unsigned long rb_subtree_last;
	} shared;	
	struct list_head anon_vma_chain;
	struct anon_vma *anon_vma;
	const struct vm_operations_struct *vm_ops;  //vma对应的实际操作
	unsigned long vm_pgoff;     //文件映射偏移量
	struct file * vm_file;      //映射的文件
	void * vm_private_data;     //私有数据
	atomic_long_t swap_readahead_info;
#ifndef CONFIG_MMU
	struct vm_region *vm_region;	/* NOMMU mapping region */
#endif
#ifdef CONFIG_NUMA
	struct mempolicy *vm_policy;	/* NUMA policy for the VMA */
#endif
	struct vm_userfaultfd_ctx vm_userfaultfd_ctx;
} __randomize_layout;
  • *vm_ops
    vm_operations_struct结构体定义在<include\linux\mm.h>的393行
    struct vm_operations_struct {
      void (*open)(struct vm_area_struct * area);
      void (*close)(struct vm_area_struct * area);
      int (*split)(struct vm_area_struct * area, unsigned long addr);
      int (*mremap)(struct vm_area_struct * area);
      vm_fault_t (*fault)(struct vm_fault *vmf);
      vm_fault_t (*huge_fault)(struct vm_fault *vmf,
      		enum page_entry_size pe_size);
      void (*map_pages)(struct vm_fault *vmf,
      		pgoff_t start_pgoff, pgoff_t end_pgoff);
      unsigned long (*pagesize)(struct vm_area_struct * area);
    
      /* notification that a previously read-only page is about to become
       * writable, if an error is returned it will cause a SIGBUS */
      vm_fault_t (*page_mkwrite)(struct vm_fault *vmf);
    
      /* same as page_mkwrite when using VM_PFNMAP|VM_MIXEDMAP */
      vm_fault_t (*pfn_mkwrite)(struct vm_fault *vmf);
    
      /* called by access_process_vm when get_user_pages() fails, typically
       * for use by special VMAs that can switch between memory and hardware
       */
      int (*access)(struct vm_area_struct *vma, unsigned long addr,
      	      void *buf, int len, int write);
    
      /* Called by the /proc/PID/maps code to ask the vma whether it
       * has a special name.  Returning non-NULL will also cause this
       * vma to be dumped unconditionally. */
      const char *(*name)(struct vm_area_struct *vma);
    
      #ifdef CONFIG_NUMA
      /*
       * set_policy() op must add a reference to any non-NULL @new mempolicy
       * to hold the policy upon return.  Caller should pass NULL @new to
       * remove a policy and fall back to surrounding context--i.e. do not
       * install a MPOL_DEFAULT policy, nor the task or system default
       * mempolicy.
       */
      int (*set_policy)(struct vm_area_struct *vma, struct mempolicy *new);
    
      /*
       * get_policy() op must add reference [mpol_get()] to any policy at
       * (vma,addr) marked as MPOL_SHARED.  The shared policy infrastructure
       * in mm/mempolicy.c will do this automatically.
       * get_policy() must NOT add a ref if the policy at (vma,addr) is not
       * marked as MPOL_SHARED. vma policies are protected by the mmap_sem.
       * If no [shared/vma] mempolicy exists at the addr, get_policy() op
       * must return NULL--i.e., do not "fallback" to task or system default
       * policy.
       */
      struct mempolicy *(*get_policy)(struct vm_area_struct *vma,
      				unsigned long addr);
      #endif
      /*
       * Called by vm_normal_page() for special PTEs to find the
       * page for @addr.  This is useful if the default behavior
       * (using pte_page()) would not find the correct page.
       */
      struct page *(*find_special_page)(struct vm_area_struct *vma,
      				  unsigned long addr);
      };
    
    

vm_operations结构中包含的是函数指针,其中open为虚存区的打开,close用于虚存区的关闭,另外还有split、mremap、acess等操作。

  • shared
    对于具有地址空间和后备存储的区域,链接到地址空间的i_mmap间隔树。

  • rb_subtree_gap
    该vma子树最大可用内存间隔(以字节为单位),具体为与vma和vma->vm_prev之间,或子vma和它的vma->vm_prev之间的内存间隙,有助于找到大小合适的空闲区域。

  • vm_flags
    描述该区域的一段标志,包括其读写属性等,采用bit位方式,状态标志位定义在<include\linux\mm.h>文件173行中:

  #define VM_NONE		0x00000000  //无标志

  #define VM_READ		0x00000001	//可读
  #define VM_WRITE	0x00000002  //可写
  #define VM_EXEC		0x00000004  //可操作
  #define VM_SHARED	0x00000008  //允许被多个线程访问

  /* mprotect() hardcodes VM_MAYREAD >> 4 == VM_READ, and so for r/w/x bits. */
  #define VM_MAYREAD	0x00000010	//允许设置可读
  #define VM_MAYWRITE	0x00000020	//允许设置可写  
  #define VM_MAYEXEC	0x00000040	//允许设置可操作
  #define VM_MAYSHARE	0x00000080	//允许设置可共享

  #define VM_GROWSDOWN	0x00000100	//向低地址增长
  #define VM_UFFD_MISSING	0x00000200	
  #define VM_PFNMAP	0x00000400	
  #define VM_DENYWRITE	0x00000800	//不允许写入
  #define VM_UFFD_WP	0x00001000	
  #define VM_LOCKED	0x00002000	//VMA被锁定,不会被交换到交换分区
  #define VM_IO           0x00004000	//该VMA用于IO 映射

  #define VM_SEQ_READ	0x0000800	//应用程序会顺序读该VMA的内容
  #define VM_RAND_READ	0x00010000	//应用程序会随机读取该VMA内存
  #define VM_DONTCOPY	0x00020000	//fork时不会复制该VMA
  #define VM_DONTEXPAND	0x00040000	
  #define VM_LOCKONFAULT	0x00080000	//当处于page fault时锁定该VMA 对应的物理页
  #define VM_ACCOUNT	0x00100000	
  #define VM_NORESERVE	0x00200000	//不做保留
  #define VM_HUGETLB	0x00400000	//huge TLB page对应的VM
  #define VM_SYNC		0x00800000	//page fault时同步映射
  #define VM_ARCH_1	0x01000000	
  #define VM_WIPEONFORK	0x02000000	//不会从父进程相应的VMA中复制页表到子进程的VMA中
  #define VM_DONTDUMP	0x04000000	//VMA不会被包含到core dump中

  #ifdef CONFIG_MEM_SOFT_DIRTY
  # define VM_SOFTDIRTY	0x08000000	
  #else
  # define VM_SOFTDIRTY	0
  #endif

  #define VM_MIXEDMAP	0x10000000	
  #define VM_HUGEPAGE	0x20000000	
  #define VM_NOHUGEPAGE	0x40000000	
  #define VM_MERGEABLE	0x80000000	
  • vm_page_prot
    vm_flags代表VMA的状态位,但是相应的状态位最后要转化成实际内存的下发到硬件状态位,而pgprot则是代表实际物理页状态位。
4、关系图

在这里插入图片描述



师兄博客入口:https://blog.youkuaiyun.com/weixin_48101150/article/details/116207139

深度剖析Linux内核进程描述符task struct实现原理(超级详细) 一、程序和进程 以我个人的理解就是,程序是一段二进制编码甚至是一个简单的可执行文件,而当程序这段二进制编码放入内存运行时,它就会产生一个或多个进程。 二、CPU时间片 对于CPU来说,它的工作就是不停地执行指令,而由于CPU执行指令的速度非常快,它可以用5ms的时间专门用于执行进程A,5ms的时间专门用于执行进程B,5ms的时间专门用于执行进程C,然后这样不停交替执行进程A、B、C。在我们看来就像进程A、B、C在同时执行一样,而实际上同一个时间点只有一个进程正在CPU上运行。 资料直. 阅读详情

相关推荐

进程管理(1):task_struct结构体说明

本篇笔记详细讲述task_struct结构体的基本内容,涉及的代码基于Linux5.9.8版本。 1. 进程和线程 关于进程和线程的概念,这里不赘述。需要了解的是在Linux内核中,进程通常被叫做任务,所以进程控制块(PCB)也被命名为struct task_struct。而Linux中是没有明确的线程的概念的,被称为轻量级进程,和进程使用相同的PCB结构,内核使用clone()来创建线程。 进程和线程的区别在于进程拥有独立的资源空间,而线程则共享进程的资源空间,通常一个进程可以拥有多个线程。 2. tas

翔底的博客 5317

mm_struct(内存描述符)

文章目录一、引出概念二、Linux下数据大致是这样管理三、mm_struct一、Linux下查看mm_struct二、mm_struct是什么? 三、mm_struct四、vm_area_struct五、vm_operations_struct六、图解(在网上看到的,画的很具体就用上了) 一、引出概念 先看代码 #include<stdio.h> #include<u...

zcl9796的博客 2814

linux内核那些事之用户空间管理

内核主要数据结构 linux内核将用户空间抽象成struct vm_area_struct进行管理,每申请以个用户空间在内核中都会抽象成对应的vm_are_struct进行管理,同时为了区别不同进程的空间相互进行隔离,进行一个层次抽象划分如下图所示: 内核中用户空间管理主要涉及到task_struct、mm_strcut及vm_area_struct等几个比较重要的数据结构。 vm_are_struct的组织形式有链表和红黑树两种方式以方便加速查找,即链表+树形式,是一种场景优化方式,以弥补链..

weixin_42730667的博客 1619

内存管理--linux进程地址管理之mm_struct

无论是内核线程还是用户进程,对于内核来说,无非都是 task_struct这个数据结构的一个实例而已,task_struct被称为进程描述符(process descriptor),因为它记录了这个进程所有的context。其中有一个被称为’内存描述符‘(memory descriptor)的数据结构 mm_struct,抽象并描述了Linux视角下管理进程地址空间的所有信息 mm_struct定义在include/linux/mm_types.h中,其中的域抽象了进程的地址空间,如下图所示: 每个进程都

老鹰不捉小鸡 1476

Simulink与CANape联动教程:模型调试阶段如何快速标定参数观测信号

本文详细介绍了如何通过Simulink与CANape联动,实现模型参数的实时标定与信号观测,从而避免反复编译,提升开发效率。核心在于正确配置Simulink中的标定量与观测量,生成A2L描述文件,并利用XCP协议建立通信,为新能源汽车与自动驾驶系统的快速原型开发提供高效解决方案。

weixin_29006187的博客 375

告别NEDC!手把手教你将CLTC/WLTP等最新工况文件导入AVL Cruise(附资源包)

本文详细指导如何将CLTC、WLTP等最新工况文件导入AVL Cruise软件,替代传统的NEDC工况。从资源获取、文件预处理到分步导入指南,再到常见问题排查,帮助工程师高效完成汽车仿真性能评估。附赠全球主流工况文件资源包,助力精准仿真分析。

weixin_30374009的博客 461

【Linux 内核 内存管理】内存映射相关数据结构 ① ( vm_area_struct 结构体 | task_struct、mm_struct、vm_area_struct 3 个结构体之间的关系)

一、vm_area_struct 结构体、 二、task_struct 进程描述符、mm_struct 内存描述符、vm_area_struct 虚拟内存区间 之间的关系

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2673

2022年全球市场微波等离子体CVD反应器总体规模、主要生产商、主要地区、产品和应用细分研究报告

据GIR (Global Info Research)调研,按收入计,2021年全球微波等离子体CVD反应器收入大约 百万美元,预计2028年达到 百万美元,2022至2028期间,年复合增长率CAGR为 %。

MARKETRESEARCH的博客 1137

#Linux内存管理 # 请你介绍一下 struct task_struct mm_struct vm_area_struct 这三个结构体之间的关系

mm_struct结构描述了一个进程的整个虚拟地址空间,vm_area_truct描述了虚拟地址空间的一个区间(简称虚拟区)。下图就是我们所说的由task_struct到mm_struct,进程的地址空间的分布。一个进程的虚拟地址空间主要由两个数据结来描述,一个是 mm_struct,一个是 vm_area_structs。vm_page_prot:页保护位(PROT_READ/PROT_WRITE/PROT_EXEC)// 代码段起始地址。

sinat_37817094的博客 1066

车载测试工程师必备:5分钟搞定CANoe台架搭建(附DBC导入技巧)

本文为车载测试工程师提供快速搭建CANoe测试台架的实用指南,涵盖硬件连接、DBC文件导入及常见报错解决方案。通过详细步骤和高效技巧,帮助工程师在5分钟内完成台架搭建,提升车载测试效率,特别适合紧急功能验证场景。

potato的博客 812

基于opencv人脸识别实现课堂抬头率检测系统 完整代码 可直接运行 作为毕设

基于opencv人脸识别实现课堂抬头率检测系统 完整代码 可直接运行 作为毕设

机器学习深度学习业余选手 1146

【Linux】【进程】进程管理task_struct,mm_struct,vm_area_struct

每个 vm_area_struct 结构对应于虚拟内存空间中的唯一虚拟内存区域 VMA,vm_start 指向了这块虚拟内存区域的起始地址(最低地址),vm_start 本身包含在这块虚拟内存区域内。保存了上一次找到的vma,根据局部性原理,下一次要用到的vma正好是上次使用的vma的可能性是比较大的,因此使用find_vma()函数查找vma时,会首先从mmap_cache中找,找到了就直接返回。stack_vm是栈中所映射的内存页数目,这些变量均是表示进程虚拟内存空间中的虚拟内存使用情况。

m0_64014551的博客 1494

物流分拣YOLO实战:YOLO26 OBB+YOLOv8多尺度融合,不规则包裹分拣效率提升40%(附训练+部署代码)

在物流分拣的工业场景中,模型的检测精度、推理速度、部署友好性本次基于YOLO26 OBB+YOLOv8多尺度融合打造的物流分拣视觉检测方案,精准解决了工业场景中不规则包裹的旋转检测、多尺度包裹的漏检问题,最终实现分拣效率提升40%,检测准确率提升至95%以上,且模型在边缘设备上的推理帧率稳定35FPS+,完全适配物流分拣的工业落地需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 881

源码之linux进程:vm_area_struct与虚拟内存的关系

前言 在虚拟内存中,我提到了linux虚拟内存区域的结构,但具体其是如何在linux中表示与实现的呢? 我利用了linux2.6的源码进行了浅显的分析。 正文 task_struct 在linux中,进程控制块即PCB的结构为task_struct,我们以linux2.6为例,其源码如下: struct task_struct { //表示进程当前运行状态 //volatile避免...

Hpsyche的博客 2352

R语言中的summarise函数和mutate函数用于计算分组占比。下面是关于这两个函数的详细介绍以及相应的源代码示例:

R语言中的summarise函数和mutate函数用于计算分组占比。

CodeByte的博客 1182

【ComfyUI】QwenImageEdit OOTD角色与姿态匹配换装

本文介绍了一个基于Qwen Edit OOTD 2.0的ComfyUI工作流,能够实现角色与姿态匹配的智能穿搭生成。该工作流通过整合模型推理、姿态识别、图像拼接和渲染等节点,完成从角色图、姿态图到成品穿搭图的完整生成流程。核心采用Qwen Image系列模型进行图像理解和编辑,配合ControlNet进行姿态引导。用户只需提供角色图和姿态参考图,系统即可自动完成姿态解析、语义编码、采样生成等步骤,输出与输入姿态一致的穿搭图像。该方案适用于虚拟角色展示、电商试穿等场景,能保持角色特征一致的同时灵活变换姿态,显

Mr数据杨 1582

Linux进程结构

1.Linux进程结构主要涉及三个结构体task_struct、mm_struct、vm_area_struct 现代操作系统主要采用虚拟内存实现对计算机物理内存的管理,每个进程都拥有自己的用户空间,进程用户空间之间的数据相互独立,互不干扰,从而保证进程运行的安全性。 2.task_struct task_struct是Linux系统中的进程控制块(PCB),内部包含了一个进程所需的各项信息。其中 mm_struct *mm则表示进程所拥有的内存空间描述。 struct task_struct {

qq_41285455的博客 1109

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【Linux 内核 内存管理】虚拟地址空间布局架构 ⑤ ( Linux 内核中对 “ 虚拟地址空间 “ 的描述 | task_struct 结构体源码 )

一、Linux 内核中对 " 虚拟地址空间 " 的描述、 二、task_struct 结构体源码

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1497

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

vm_area_struct的作用:Linux缺页处理

进程的task_struct中存了mm_struct的指针mm,task_struct中存了vm_area_struct的链表结构 每个vm_area_struct都代表虚拟内存空间中一段连续的、具有相同访问权限的区域。包含下面的成员: vm_start:指向这个区域的起始处 vm_end:指向这个区域的结束处 vm_prot:描述这个区域所有页的读写许可权限 vm_flags:描述这个区域内的页面是与其他进程共享的还是私有的 vm_next:指向链表下一个区域结构 当访问某个页面发生缺页中断,需要查询

sinat_41619762的博客 477

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux 内核 - 进程地址空间的数据结构

本文介绍了Linux内核中进程内存管理的两个关键数据结构:task_struct和mm_struct。task_struct表示进程实例,其中包含指向mm_struct的指针。mm_struct详细描述了进程的内存映射情况,包括页表(pgd)、用户栈(start_stack)、堆区(start_brk/brk)、数据段(start_data/end_data)、代码段(end_code)等关键内存区域的地址信息,以及映射区域基址(mmap_base)等。这些数据结构共同构成了Linux内核的进程地址空间管理

GPU全栈博主 463

Linux 从PCB的角度谈用户空间

进程控制块PCB,实际上指的是一个结构体task_struct。下面说说这个task_struct   Task_struct有一个指向mm_struct的指针,mm_struct结构体是该进程整个用户空间的抽象。包含着装入的可执行映像信息以及进程的页目录指针。Mm_struct结构体非常有意思,在一个进程控制块里,只含有一个指向mm_struct的指针,但是一个mm_struct能够被若干个

qq_33225741的博客 1250

进程地址空间 - 数据结构

TBD

kickxxx的专栏 2400

高级OS(八) - Linux内存映射

高级OS(八) - Linux内存映射一.题目二.解答1.进入Linux 内核(4.19)源代码, 给出task_struct 结构,mm_struct 结构和 vm_area_struct 结构的关系图,这样的数据结构设计对你有什么启发?每个数据结构至少分析2个以上字段2.对实验中涉及的相关内核数据结构、函数进行深入分析,并画出流程图。至少分析6个数据结构和6个函数 一.题目 查看学堂在线《Linux内核分析与应用》的4.5~4.7节的视频,完成其实验代码,截图,讨论,两人一组。 进入Linux 内核(

zxq997997的博客 574

程序装载与进程结构

详解程序装载与进程结构

pdxbshx的博客 1002

linux 查看进程地址空间,进程地址空间(Linux内核源码分析)

原标题:进程地址空间(Linux内核源码分析)背景上一次讨论了关于内存管理源码的分析。大体介绍了什么是页、区、slab缓存,以及内核获取、释放页的接口,分配、释放slab缓存的接口。进程地址空间是什么呢?进程地址空间简单的说就是用户空间中进程的内存,我们叫这内存为进程地址空间。本文借助Linux内核源码大体分析进程地址空间的相关知识。进程控制块既然我们要聊一聊进程地址空间,那么不可避免的就要先聊一...

weixin_42169674的博客 712

unix / linux 进程相关数据结构合集

task_struct 描述系统中的一个任务或进程  参见 include/linux/sched.h//进程描述符task_structstruct task_struct {        /* * offsets of these are hardcoded elsewhere - touch with care        */ volatile long state; /*

2390
下一篇: MISC机制编写字符驱动程序
FF_programming
博客等级 码龄5年 4粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值