内存管理vma_内核是如何管理内存的?(中)

73fd424c7dc53ed5a115ed4739dde1c5.png
原文: https:// manybutfinite.com/post/ how-the-kernel-manages-your-memory/
翻译:RobotCode俱乐部

虚拟页面(Page)是内存保护的最小基本单元,因为它的所有字节共享U/S和R/W标志。这就是为什么经典的x86分页允许执行堆栈上的代码,从而更容易利用堆栈缓冲区溢出。缺少PTE no-execute标志说明了一个更广泛的事实:VMA中的权限标志可能会,也可能不会干净地转换为硬件保护(这地方直译了,修为比较浅,没懂原文的意思)。内核做它能做的,但最终架构限制了可能做的。

虚拟内存不存储任何东西,它只是将程序的地址空间映射到底层物理内存上,处理器将这些物理内存作为一个称为物理地址空间的大块访问。虽然总线上的内存操作有点复杂,但是我们可以在这里忽略它,并假设物理地址以1字节增量的形式从0到可用内存的顶部。这个物理地址空间被内核分解成页面帧(Frame)。处理器不知道或不关心帧,但是它们对内核非常重要,因为页帧是物理内存管理的单元。Linux和Windows在32位模式下都使用4KB页帧;下面是一个2GB内存的机器示例:

6a7cfe15c0b5bc2aa1d09d8585c8eee8.png

在Linux中,每个页面帧由一个描述符和几个标记跟踪。这些描述符一起跟踪计算机中的整个物理内存;每个页面帧的精确状态总是已知的。物理内存使用伙伴内存分配技术进行管理,因此如果页面帧可以通过伙伴系统进行分配,那么它就是空闲的。分配的页帧可能是匿名的,保存程序数据,也可能在页缓存中,保存存储在文件或块设备中的数据。

让我们将虚拟内存区域、页表和页帧放在一起,以理解这一切是如何工作的。下面是一个用户堆的例子:

51fae377441643ee3d79b1289554bda0.png

蓝色矩形表示VMA范围内的页面,箭头表示将页面映射到页面帧的页面表项。一些虚拟页面缺少箭头;这意味着它们对应的PTE将P位标志清除。这可能是因为这些页面从未被使用过,或者是因为它们的内容被交换了出来。无论在哪种情况下,对这些页面的访问都将导致页面错误,即使它们位于VMA中。VMA和页表不一致似乎很奇怪,但这种情况经常发生。

由于本人水平有限,翻译必然有很多不妥的地方,欢迎指正。
同时,欢迎关注下方微信公众号,一起交流学习:)

da1fb4e6521b7d52e74f11fe3d42a083.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值