为什么需要内存管理:
初始程序都直接在物理地址上运行。 也就是说,该程序所需的空间必须超过该计算机的物理内存,但在实际场景中是多任务、多进程,该物理地址reserved不可靠。 举个栗子: 3个程序a、b、c、a需要10M,b需要100M,c需要20M,总内存需要120M,按照前面的分配方式,前面的10M剩下a,10M-110M剩下b,系统剩下10M,c怎么办?
1 .效率问题
你可能会考虑在c程序运行的时候把b程序的数据写入磁盘,在b程序运行的时候从磁盘中回写数据
2 .进程地址隔离问题
除了效率问题之外,reserved给进程的空间在需要从其他进程访问时会崩溃。 例如,a进程访问的空间是最初的10M,但如果代码访问a程序10-110M,b程序可能会崩溃,因此进程的地址空间必须相互隔离。
三.重新安置的问题
在现实场景中,单任务不是在分割的存储器中执行的,在多任务并行执行的情况下,在动态申请释放存储器时,有可能向其他进程的地址申请,在这种情况下,需要重新配置到新地址。
内存管理除了寻找解决上述三个问题的方法外,如何提高内存的使用效率? 如何隔离进程的地址空间? 如何解决程序运行时的重新定位问题?
如何从内存管理虚拟地址映射到物理地址:
从存储器管理虚拟地址映射到物理地址的过程是解决上述三个问题的过程。 内存管理用分段机制和分页机制分别解决了上述三个问题。 大致步骤如下。
分段机制:
如果程序分割段,将段整体移动到任意位置,则段内的地址相对于段基地址不变,与段基地址无关,只要赋予段内的偏移地址,cpu就正确的命令。 如果将整个段的内容复制到新位置,并将基于段的地址寄存器的地址变更为该地址,程序将正确运行
可以看到,分割机制解决了进程之间的隔离和重新定位问题。 该动作由硬件进行,但也有没有分段机构的硬件,作为跨平台的linux使用更通用的寻呼机构解决了从线性地址到虚拟地址的转换。分页机制:
参照《CPU是如何访问内存的?》,可以知道主页面表的概念。 linux通常使用四级页面表、页面全局目录、页面顶层目录、页面中间目录和页面表,以支持32位和64位。
这里没有详细说明linux如何在四阶段的页面表中进行从线性地址(虚拟地址)到物理地址的转换。 网上有很多。 我推荐https://www.cn blogs.com/Linhao study/p/10038100.HTML # Autoid-2-2-0。
进程切换时,根据task_struct找到mm_struct的pgd字段,获取新进程的页面全局目录,输入CR3寄存器,完成页面切换。
文/上海蓝盟 IT外包专家