我正在关注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 | |
| +------------------+ |
+-----------------------------------------+
我想知道它是否可能完全解耦分页和堆。我希望它是可能的,因为从概念上讲,我认为
它们看起来分别相当独立。它们是否可以以分离的方式实现,只具有单向依赖性,例如堆叠TCP / IP协议?