Linux系统内核下的内存映射机制

发布时间:2023年12月27日

内存映射机制

在单片机中(无MMU)或者未开启MMU时的控制器中,CPU直接通过物理地址来访问外设和内存。
启动MMU(Memory Management Unit),即内存管理单元,硬件器件。作用是将CPU发出的虚拟地址转换为物理地址访问外设和内存。

Linux内核会把物理地址会划分为一个个4K的块,也称为页,会对每个块进行编号处理,并用Struct page这个结构体来管理块(页)的状态信息,并对每一页进行编号 PFN(Page Frame Number)。

下面是Linux系统下两级页面映射机制解析图所示
在这里插入图片描述

在32位操作系统中,程序员首先给出的是逻辑地址,然后通过分段机制转换为线性地址,再将线性地址通过分页机制转换为物理地址
线性地址(虚拟地址),以0000000011 0000000100 0001 0000 0000为例解析,分为3个部分,第一部分是目录Directory,第二部分是页表,第三部分是偏移量

首先取出第一部分的值为3索引去查看页目录表,找到页目录项3,里面存放着页表3的地址。每个进程都有一个页目录表,表里有1024页目录项,页目录项的地址保存至cr3寄存器中,每一个页目录项又指向相应的页表,所以通过第一项能得到页表的地址,一个页表也是1024项
其次,第二部分以table的值为4索引找到页表里对应的页表4项的内容,项的内容保存的是实际的物理块号4的,找到对应的物理块起始地址0x1000 4000。
最后,第三部分通过offset的偏移量256和页表3里面的页表项4的地址相加来找到最终物理地址0x1000 4256,完成内存映射。

通常程序访问的是虚拟内存,虚拟内存映射到物理内存的一小部分
在Linux系统中,虚拟内存默认为4G的大小。每个进程都有独立的4G内存地址空间。4G指的是可用范围为4G,不一定能占满,所以能映射到的物理内存实际上很少,只是让进程误以为自己独占4G内存。
进程中分为用户空间和内核态
在这里插入图片描述

总的来说,虚拟地址的映射涉及到整个进程的地址空间,而不是特定变量或数据结构内的偏移地址映射。
值得注意的是,操作系统为每个运行的进程分配独立的虚拟地址空间,每个进程都有自己的页表
每个进程的虚拟地址其实是不一样的,当不同的进程里,如定义int a = 10;假设其地址都是0x1234,访问相同的虚拟地址时,它们实际上在各自的页表中进行地址映射。
进程里的变量的地址是相对于进程的虚拟地址空间的偏移量,所以不同进程里的相同虚拟地址,如0x1234所映射的物理地址是不相同的。

不同进程间虚拟地址对应物理内存的映射情况
在这里插入图片描述
以上仅为个人见解,如有问题,欢迎讨论!

文章来源:https://blog.csdn.net/qq_45009309/article/details/134841628
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。