gpt4 book ai didi

memory - 内核内存管理 : where do I begin?

转载 作者:行者123 更新时间:2023-12-04 12:48:47 25 4
gpt4 key购买 nike

在内核编程方面,我有点菜鸟,想知道是否有人可以指出我在内核设置中开始实现内存管理的正确方向。我目前正在研究一个玩具内核,并且正在对该主题进行大量研究,但我对内存管理主题有些困惑。它有很多不同的方面,比如分页和虚拟内存映射。是否有我应该实现的特定命令或任何做和不做的事情? 我不是在寻找任何代码或任何东西,我只需要指出正确的方向。 任何帮助,将不胜感激。

最佳答案

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

  • 管理可用的物理内存。
  • 管理内核所需的内存及其数据结构。
  • 管理每个进程的虚拟内存(空间)。
  • 管理任何进程所需的内存,即 mallocfree .

  • 为了能够管理任何其他内存需求,您实际上需要知道您有多少物理内存可用以及它的哪些部分可供您使用。
    假设您的内核是由多引导兼容引导加载程序加载的,您将在 multiboot header 中找到此信息。您从引导加载程序通过(如果我没记错的话,在 x86 上的 eax 中)。
    头部包含一个结构,描述哪些内存区域被使用,哪些可以自由使用。

    您还需要以某种方式存储此信息,并跟踪分配和释放的内存。一个简单的方法是维护一个位图,其中 bit N指示(固定大小 S)内存区域是否来自 N * S(N + 1) * S - 1已使用或免费。当然,随着内核的发展,您可能希望使用更复杂的方法,例如多级位图或空闲列表,但是上面的简单位图可以帮助您入门。

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

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

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

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

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

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

    关于memory - 内核内存管理 : where do I begin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33447708/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com