https://cloud.tencent.com/developer/article/1012408
linux系统编程之基础必备(五):Linux进程地址空间和虚拟内存
https://manybutfinite.com/post/anatomy-of-a-program-in-memory/
Anatomy of a Program in Memory
3
https://developer.aliyun.com/article/496012 非常通俗
linux 进程地址空间的一步步探究
进程虚拟地址空间结构
- text 段
放代码的,
共享的,只有一个副本 - data段
初始化的变量 - bss段
放没有初始化的全局变量和静态变量,
只是占位置,不占用具体空间, - 堆
动态存储分配 - 共享库和mmap内存映射区
进行文件的映射等 - 栈
函数调用时保存信息。
Linux具体实现
- 虚拟地址-》物理地址
-
task_struct结构体
使用mm_struct管理内存。
使用vm_area描述虚拟内存的具体样子。
使用页表管理虚拟-》物理的映射。
可执行文件-》进程
把程序内容放到进程的虚拟地址空间
创建一组vm_area,设置对应的起始结束,磁盘文件等。访问指令过程
当在vm_start和vm_end之间的一条指令被执行时,
缺页异常,操作系统做操作:分配一个页表,让页目录项指向它,分配一个真正的物理内存页面,让页表项指向它,从磁盘文件中将内容读取到物理内存页面中。
页面置换
mem_map结构体描述物理页框
是否脏页
LRU
如果该页被修改过,操作系统必须保留该页的内容以便晚些时候在被访问。这种页称为"脏(dirty)页",当它被从内存中删除时,将被保存在一个称为交换文件的特殊文件中。
相对于处理器和物理内存的速度,访问交换文件要很长时间,操作系统必须在将页写到磁盘以及再次使用时取回内存的问题上花费心机。
如果用来决定哪一页被淘汰或交换的算法不够高效的话,就可能出现称为"抖动"的情况。在这种情况下,页面总是被写到磁盘又读回来,操作系统忙于此而不能进行真正的工作。
linux使用"最近最少使用(Least Recently Used ,LRU)"页面调度技巧来公平地选择哪个页可以从系统中删除。这种设计系统中每个页都有一个"年龄",年龄随页面被访问而改变。页面被访问越多它越年轻;被访问越少越老。年老的页是用于交换的最佳候选页。