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

内存映射机制

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

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

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

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

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

总结:通过前几位来找到页目录表中的项数来确定二级页表,再通过中间几位找到页表在的页表项来确定基地址,再通过后几位来确定偏移地址

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

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

不同进程间虚拟地址对应物理内存的映射情况
在这里插入图片描述
以上仅为个人见解,如有问题,欢迎讨论!
补充
一级页表中每一个表项用来设置1M 的空间,对于整个4G空间,需要4096个页表项。
一级页表映射,MMU根据虚拟地址的[31:20]确定是哪一个一级页表项,后[19:0]确定偏移地址。

  • 40
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值