如何在OS开发中很好地解耦分页和堆(动态内存管理)功能?

时间:2018-02-27 15:19:25

标签: operating-system kernel paging heap-memory

背景

我正在关注James Molly's OS tutorial来实现一个玩具操作系统,我发现它因为相互依赖而发现了分页和堆code。例如,分页使用堆提供的kmalloc,因为它需要为页表数据结构动态分配空间,并且必须具有虚拟地址。这在paging.c中的以下函数调用中完成:

dir->tables[table_idx] = (page_table_t*)kmalloc_ap(sizeof(page_table_t), &tmp);

同时,堆依赖于分页来在需要增长时分配物理帧,这可以在kheap.c中看到:

alloc_frame( get_page(heap->start_address+i, 1, kernel_directory), (heap->supervisor)?1:0, (heap->readonly)?0:1);

它们在内存管理模块中紧密耦合在一起,如下所示:

             other modules
          ^        ^       ^
          |        |       |
          v        v       v
+-----------------------------------------+
|             Memory Management           |
|                                         |
|     +------------------+                |
|     | paging           |                |
|     |            +-----+------------+   |
|     |            |     |            |   |
|     +------------+-----+            |   |
|                  |          heap    |   |
|                  +------------------+   |
+-----------------------------------------+

问题

我想知道它是否可能完全解耦分页和堆。我希望它是可能的,因为从概念上讲,我认为

  1. 分页可以被认为是地址映射/转换机制(可能还有物理帧分配??)。
  2. 堆是关于动态内存管理的。
  3. 它们看起来分别相当独立。它们是否可以以分离的方式实现,只具有单向依赖性,例如堆叠TCP / IP协议?

0 个答案:

没有答案