我正在构建一个小的x86-64内核,我完全是从头开始编写的。我开始编写一个非常简单的内存分配器,我只是在页面结构上进行迭代,以找到一个空闲的页面,并在找到一个页面时中断循环。当我开始写分配器时,我偶然发现了一个问题。
在内核中,我使用UEFI (GetMemoryMap())成功地获得了RAM的内存映射。通过在内存映射上迭代,我发现我将有大约1021 of的可用内存(在1024 of中)。我在QEMU上测试我的内核。
我到处读到,Linux内核为系统中的每个页面都保存了一个页面结构。我猜Linux内核的内存分配器使用页面结构来确定哪些页是空闲的,哪些是不空闲的。通过使用适当的二进制结构和有效的算法,它试图尽可能快地找到一个空闲页面,以供自己使用或提供给用户模式进程。
如果我的假设是正确的,问题就出现在这里。如果Linux内核的内存分配程序依赖于页面结构来工作,那么它如何为页结构本身分配内存呢?
我想到了一个简单的算法,从第一个可用内存区域的物理地址开始。如果这个内存区域有足够的空间容纳所有的页面结构(代表整个内存),我就在这里停止。否则,我使用第二个内存区域a等等。这看起来很简单,但是我想知道Linux内核是如何处理这个问题的。
即使我的上述假设是错误的,内存分配器可能需要一些内存才能工作。在启动时,Linux内核如何为自己的内存分配器分配内存?
发布于 2022-01-05 12:38:31
我想您可以谷歌一些有关成员锁分配程序的内容,它在内核启动阶段管理物理内存。
https://stackoverflow.com/questions/70585695
复制相似问题