sam*_*y17 5 linux memory virtual-memory
我试图了解运行操作系统时物理地址是如何分配的。
我的问题是,当内核分配一些内存(假设使用 kmalloc)时,谁决定应该为该虚拟内存范围映射什么物理内存地址范围?
我知道内核将创建页表来将映射从虚拟转换为物理,并且 MMU 将使用它。但在此之前,应该有人分配/指派一些要映射的物理页面。这是由内核本身完成的还是 MMU 会让内核知道可以使用的特定物理地址范围?
如果内核本身分配物理地址,那么它如何跟踪哪些物理地址已被使用以及哪些是空闲的(待使用)?
\n\n我试图了解运行操作系统时物理地址是如何分配的。
\n
物理地址没有分配,它们已经在那里 \xe2\x80\x93 这是 RAM。
\n\n\n我的问题是,当内核分配一些内存(假设使用 kmalloc)时,谁决定应该为该虚拟内存范围映射什么物理内存地址范围?
\n
Who:内核内存映射算法。那么,内核。
\n\n\n但在此之前,应该有人分配/指派一些要映射的物理页面。
\n
如前所述,物理内存是内核必须处理的现实。
\n内存芯片如何映射以形成分段连续内存范围的问题取决于您的硬件及其启动过程。在台式机或服务器 x86 中,通常,当您在引导期间初始化 DRAM 控制器时,固件(或引导加载程序)会读取 DRAM 内存模块(“DIMM”)“配置 EEPROM”的内容并配置 CPU 的内存控制器(或主板,具体取决于硬件的具体情况)将内存地址访问转换为相应地读取和写入这些芯片。在嵌入式平台上,RAM 配置可能只是被烘焙到软件中(例如,uboot 和 Linux 内核使用 devicetree 初始化硬件),然后内存控制器以这种方式进行配置。
\n所以,这里没有通用的答案。“如何处理动态内存”是 \xe2\x80\x93 中体系结构不同的主要内容之一,如果您还记得 i386 上的 PAE,那么它可以变得非常详细且特定于 CPU 型号。
\n\n\n谁决定应该为该虚拟内存范围映射什么物理内存地址范围?
\n
让我们谈谈如何:由于内核通过硬件或固件接口,或者通过配置文件,知道物理地址空间中有多少物理内存,内存映射的IO在哪里,以及它已经在使用什么内存,所以它能够保持跟踪空闲物理内存的数据结构。所以,当你打电话时kmalloc
使用特定大小进行调用时,您会寻找符合大小要求的未使用的物理内存。