首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux 3/1拆分与物理映射

Linux 3/1拆分与物理映射
EN

Unix & Linux用户
提问于 2019-02-12 19:58:14
回答 1查看 936关注 0票数 3

我试图理解Linux 3/1拆分(或2/2,1/3,任意)以及如何映射到物理内存。让我们假设x86。

我特别不明白为什么内核在va[3 4GiB,4 4GiB]中的1 4GiB总是映射到pa0,1 1 1GiB。拆分位于(虚拟) PAGE_OFFSET

如果我有更多的记忆呢?如果我的钱少了呢?用户空间的所有内存都去哪里了?

从TLDP中我了解到底层的物理1GiB总是用于内核(为什么?)。当虚拟地址空间小于物理地址空间时,使用高内存(通过这个职位),因为内存很多,否则会浪费(对吗?);在x86-64中,由于虚拟地址空间是不存在的,所以没有使用它。

让内核始终保持不变的一件事可能是,在上下文开关上,current保持不变,不需要更改cr3

这个答案说:

高内存是用户空间程序可以处理的内存段.它不能触摸低内存。低内存是Linux内核可以直接寻址的内存段。如果内核必须访问高内存,它必须首先将其映射到自己的地址空间。

人们是否超载了“低内存”和“高内存”这两个词?

最后,LDD3说:

内核不能直接操作未映射到内核地址空间的内存。换句话说,内核需要它自己的虚拟地址来处理它必须直接接触的任何内存。因此,多年来,内核可以处理的最大物理内存量是可以映射到内核虚拟地址空间的部分,减去内核代码本身所需的空间。因此,基于x86的Linux系统最多只能工作1GB以下的物理内存。

这是否指内核中的指针p必须持有虚拟地址,而不是物理地址,因为映射总是适用的?为什么这个“1 1GiB的物理记忆”限制?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-02-13 06:45:47

如今,32位x86几乎和20世纪90年代初诞生时的16位8086一样过时。那时,386所提供的4GB虚拟地址空间是足够的,因为一台典型的台式计算机只有几兆内存。

Linus决定分割虚拟地址空间,以便为内核保留1GB(从地址0xc0000000开始),用户空间进程可以使用较低的3GB(从地址0开始)。然后从PAGE_OFFSET开始映射所有物理内存,即从3GB开始的地址。1GB在当时已经足够了,因为(正如我前面提到的)物理RAM的典型数量要比这个小得多,这种分割为用户空间留下了一个舒适的3GB空间。

在打开分页(即虚拟地址映射)之前,包含内核代码和静态数据的内核映像被加载到物理内存的开始。(嗯,不完全是这样,但通常从2MB开始,这是因为PC平台的一些怪癖。)当分页打开时,物理地址N处的内存以虚拟地址N+ PAGE_OFFSET结束。这意味着内核映像占据内核内存区域的较低部分,通常只有几兆字节。

请注意,到目前为止,我已经讨论过虚拟地址空间,即为某些特定事物保留的空间。要实际使用这些地址,您必须将物理RAM页帧映射到虚拟地址。在早期,只映射了少量内核虚拟地址空间,因为需要映射的物理RAM太少了,但是当更大的RAM大小变得可以负担的时候,这种情况很快就发生了巨大的变化,导致1GB的空间不足以处理所有的RAM。因此,引入了“高内存”机制,该机制提供了一个窗口,在该窗口中可以根据需要映射额外RAM的部分。

那么,为什么内核需要在其虚拟地址空间中拥有RAM呢?问题是CPU只能(以编程方式)通过虚拟(映射)地址访问内存。寄存器中的指针是指向虚拟地址空间的指针,指导程序流的指令指针也是如此。内核需要能够自由地访问RAM,例如,它以后将提供给用户空间进程的缓冲区为零。

内核将整个RAM存储在其地址空间并不意味着用户空间无法访问它。可以存在多个到RAM页面帧的映射;当进程被选择执行时,它既可以永久映射到内核内存空间,也可以映射到某个地址到用户空间。

票数 5
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/500256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档