谁决定特定虚拟地址、内核或 MMU 的物理地址?

谁决定特定虚拟地址、内核或 MMU 的物理地址?

我试图了解运行操作系统时物理地址是如何分配的。

我的问题是,当内核分配一些内存(假设使用 kmalloc)时,谁决定应该为该虚拟内存范围映射什么物理内存地址范围?

据我所知,内核将创建页表来将映射从虚拟转换为物理,并且 MMU 将使用它。但在此之前,应该有人分配/指派一些要映射的物理页面。这是由内核本身完成的还是MMU会让内核知道可以使用的特定物理地址范围?

如果内核本身分配物理地址,那么它如何跟踪哪些物理地址已被使用以及哪些是空闲的(待使用)?

答案1

我试图了解运行操作系统时物理地址是如何分配的。

物理地址没有被分配,它们已经在那里了——它就是 RAM。

我的问题是,当内核分配一些内存(假设使用 kmalloc)时,谁决定应该为该虚拟内存范围映射什么物理内存地址范围?

Who:内核内存映射算法。那么,内核。

但在此之前,应该有人分配/指派一些要映射的物理页面。

如前所述,物理内存是内核必须处理的现实。

内存芯片如何映射以形成分段连续内存范围的问题取决于您的硬件及其启动过程。在台式机或服务器 x86 中,通常,当您在引导期间初始化 DRAM 控制器时,固件(或引导加载程序)会读取 DRAM 内存模块(“DIMM”)“配置 EEPROM”的内容并配置 CPU 的内存控制器(或主板,具体取决于硬件的具体情况)将内存地址访问转换为相应地读取和写入这些芯片。在嵌入式平台上,RAM 配置可能只是被烘焙到软件中(例如,uboot 和 Linux 内核使用 devicetree 初始化硬件),然后内存控制器以这种方式进行配置。

所以,这里没有通用的答案。 “如何处理动态内存”是架构不同的主要内容之一 - 如果您还记得 i386 上的 PAE,那么它可以变得非常详细且特定于 CPU 型号。

谁决定应该为该虚拟内存范围映射什么物理内存地址范围?

让我们谈谈如何:由于内核通过硬件或固件接口,或者通过配置文件,知道物理地址空间中有多少物理内存,内存映射的IO在哪里,以及它已经在使用什么内存,所以它能够保持跟踪空闲物理内存的数据结构。因此,当您kmalloc使用特定大小进行调用时,您会寻找符合大小要求的未使用的物理内存。

答案2

这很简单。

  • 最初,作为启动过程的一部分,CPU 会重置 MMU。
  • 内核检测物理内存(RAM),并构建kmalloc可以分配的数据结构。内核代码所在的 RAM 被排除在外。
  • 当内核决定/sbin/init最初运行一个进程 ( ) 时,它会分配所需的内部表和一块 RAM 以映射到可执行文件中。
  • 然后,作为进程 srartup 的一部分,使用“页表”设置 MMU,以便每个进程都能看到从位置 0 开始的内存空间,并且该进程的位置 0 是唯一的。每个进程的位置 0 都是有毒的 -SEGV - segment violation如果你使用它,你会得到 a 。这会检测未初始化的指针。
  • 当 CPU 处于“管理程序”模式(硬件状态)时,MMU 被禁用。当内核将控制权转移给进程并清除“管理程序”模式时,MMU 生效。
  • 现在处于活动状态,MMU 将自身插入到 CPU<->RAM 硬件路径中,因此现在是 CPU<->MMU<->RAM。
  • CPU 发出的每个地址的高位位都会被页表中的位替换,直到 CPU 通过中断返回“管理程序”模式。

相关内容