当前位置: 首页 > news >正文

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

1. 在linux内核中, task_struct 表示一个进程的实例 

struct task_struct{[…]struct mm_struct *mm, *active_mm;[…]
}

2.  mm_struct 表示进程的内存映射

struct mm_struct {struct vm_area_struct *mmap;unsigned long mmap_base;unsigned long task_size;unsigned long highest_vm_end;pgd_t * pgd;atomic_t mm_users;atomic_t mm_count;atomic_long_t nr_ptes;
#if CONFIG_PGTABLE_LEVELS > 2atomic_long_t nr_pmds;
#endifint map_count;spinlock_t page_table_lock;unsigned long total_vm;unsigned long locked_vm;unsigned long pinned_vm;unsigned long data_vm;unsigned long exec_vm;unsigned long stack_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;/* ref to file /proc/<pid>/exe symlink points to */struct file __rcu *exe_file;
};

    其中 pdg 表示进程的一级页表,

    start_stack 表示用户栈起始地址,

    mmap_base表示映射区域的起始地址(动态库.so, mmap系统调用映射的文件),

    start_brk 表示堆起始地址,

    brk 表示堆结束的地址,

    start_data 表示数据段起始地址,

    end_data 表示数据段结束地址,

    end_code 表示代码段结束地址 

3. task_struct  和  mm_struct 的关系如图:

4. 虚拟内存区域:

  如前所述,mm_struct 里面有一个  mmap 成员,它表示进程内存映射的一个区域(VMA),VMA(Virtual Memory Area)即虚拟内存区域。 在Linux中,每个正在运行的进程都会有多个VMA,如代码段,数据段,堆栈段,文件映射区域等。

struct vm_area_struct {unsigned long vm_start; unsigned long vm_end;struct vm_area_struct *vm_next, *vm_prev;struct mm_struct *vm_mm;pgprot_t vm_page_prot;unsigned long vm_flags;unsigned long vm_pgoff;struct file * vm_file;[...]
}

5. task_struct, mm_struct, vm_area_struct  关系图

http://www.lryc.cn/news/625056.html

相关文章:

  • Chromium base 库中的 Observer 模式实现:ObserverList 与 ObserverListThreadSafe 深度解析
  • 套接字超时控制与服务器调度策略
  • 单例模式及优化
  • 高防IP如何实现秒级切换?
  • 【Day 30】Linux-Mysql数据库
  • IDE开发系列(2)扩展的IDE框架设计
  • STC8单片机矩阵按键控制的功能实现
  • 分治-归并-493.翻转对-力扣(LeetCode)
  • Flutter 自定义 Switch 切换组件完全指南
  • Python 面向对象三大特性详解(与 C++ 对比)
  • Android Handler 线程执行机制
  • flutter项目适配鸿蒙
  • 【展厅多媒体】互动地砖屏怎么提升展厅互动感的?
  • 2025年最新美区Apple ID共享账号免费分享(持续更新)
  • 数组学习2
  • Java面试题储备14: 使用aop实现全局日志打印
  • 【HTML】document api
  • Vue 3中watch的返回值:解锁监听的隐藏技巧
  • C++---有符号和无符号整数的位移操作
  • RabbitMQ:数据隔离
  • kafka 冲突解决 kafka安装
  • Unity进阶--C#补充知识点--【Unity跨平台的原理】Mono与IL2CPP
  • 探索性测试:灵活找Bug的“人肉探测仪”
  • MongoDB Windows 系统实战手册:从配置到数据处理入门
  • keil错误:Error: failed to execute ‘D:\Keil\C51\BIN\BIN\A51.EXE‘
  • 【智慧工地源码】智慧工地云平台系统,涵盖安全、质量、环境、人员和设备五大管理模块,实现实时监控、智能预警和数据分析。
  • PYTHON让繁琐的工作自动化-猜数字游戏
  • 从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
  • 车e估牵头正式启动乘用车金融价值评估师编制
  • CoRL 2025|隐空间扩散世界模型LaDi-WM大幅提升机器人操作策略的成功率和跨场景泛化能力