Memory 内核内存管理:从哪里开始?

Memory 内核内存管理:从哪里开始?,memory,memory-management,kernel,paging,virtual-memory,Memory,Memory Management,Kernel,Paging,Virtual Memory,谈到内核编程,我有点不知所措,我想知道是否有人能为我指明在内核环境中开始实现内存管理的正确方向。我目前正在研究一个玩具内核,并且正在做很多关于这个主题的研究,但是我对内存管理的主题有点困惑。它有很多不同的方面,比如分页和虚拟内存映射。是否有一个具体的顺序,我应该实施的事情或任何做的和不做的 >我不寻找任何代码或任何东西,我只需要指向正确的方向。< /强>将有任何帮助。 有多个方面,您应该分别考虑: 管理可用的物理内存 管理内核及其数据结构所需的内存 管理每个进程的虚拟内存(空间) 管理任何进程

谈到内核编程,我有点不知所措,我想知道是否有人能为我指明在内核环境中开始实现内存管理的正确方向。我目前正在研究一个玩具内核,并且正在做很多关于这个主题的研究,但是我对内存管理的主题有点困惑。它有很多不同的方面,比如分页和虚拟内存映射。是否有一个具体的顺序,我应该实施的事情或任何做的和不做的<强> >我不寻找任何代码或任何东西,我只需要指向正确的方向。< /强>将有任何帮助。

有多个方面,您应该分别考虑:

  • 管理可用的物理内存
  • 管理内核及其数据结构所需的内存
  • 管理每个进程的虚拟内存(空间)
  • 管理任何进程所需的内存,即
    malloc
    free
为了能够管理任何其他内存需求,您需要知道实际有多少物理内存可用,以及其中哪些部分可供您使用。 假设您的内核是由一个多引导兼容的引导加载程序加载的,那么您将在从引导加载程序传递的(如果我没记错的话,在x86上的
eax
中)中找到此信息。 标头包含一个结构,描述哪些内存区域被使用,哪些可以自由使用

您还需要以某种方式存储这些信息,并跟踪分配和释放的内存。这样做的一个简单方法是维护位图,其中位
N
指示从
N*S
(N+1)*S-1
的(固定大小
S
)内存区域是使用还是空闲。当然,随着内核的发展,您可能希望使用更复杂的方法,如多级位图或自由列表,但是上面的简单位图可以让您开始

此内存管理器通常只提供“大”大小的内存块,通常是
4KB
的倍数。当然,这对于动态内存分配是没有用的,您习惯于应用程序编程中使用的
malloc
free

由于动态内存分配将大大简化内核高级功能(多任务、进程间通信等)的实现,因此您通常会特别为内核编写内存管理器。它提供了分配(
kalloc
)和释放(
kfree
)任意大小内存块的方法。此内存来自使用上面的物理内存管理器分配的池

所有这些都发生在内核内部。您可能还希望为应用程序提供执行动态内存分配的方法。实现这一点在概念上与上述物理内存管理非常相似:

进程只能看到自己的虚拟地址空间。它的某些部分对于进程来说是不可用的(例如内核内存映射到的区域),但是它的大部分将是“可自由使用的”(也就是说,没有实际的物理内存与之关联)。内核至少需要为应用程序提供分配和释放单个页面内存地址空间的方法。在对物理内存管理器的调用中,以及在从请求的页面到新分配的内存的映射中,分配页面结果(在引擎盖下,应用程序不可见)

但是请注意,许多内核为其进程提供了对自己的地址空间更复杂的访问,或者直接在内核中实现以下一些任务


像以前一样能够分配和释放页面(
4KB
大部分)对动态内存管理没有帮助,但像以前一样,这通常是由其他一些内存管理器处理的,这些内存管理器使用这些大内存块作为池,为应用程序提供较小的内存块。一个突出的例子是。像这样的内存管理器通常实现为链接到每个应用程序的库(最有可能是标准库的一部分)

谢谢你的帮助。学习分页:并查看一些最简单的示例: