内存管理解析:页表初始化与分配

需积分: 0 0 下载量 127 浏览量 更新于2024-08-05 收藏 713KB PDF 举报
"实验五内存马逸君17300180070第一部分PhysicalPageManagement阅读kern/pmap.c中的mem_init()函数的代码,介绍内存管理的基本流程,包括boot_alloc(),page_init(),page_alloc(),page_free()等关键函数的作用。" 在操作系统中,内存管理是一个至关重要的组成部分,它负责有效地分配、管理和释放物理内存资源。在实验五内存1中,我们主要关注的是在x86架构下,如何通过内核初始化过程来构建两级页表结构,以及几个关键的内存管理函数。 首先,`mem_init()`函数是内存管理的起点,它的主要任务是初始化内存管理系统,构建出能够映射物理内存的页表结构。在x86体系结构中,两级页表机制被用来将虚拟地址转换为物理地址。这个过程始于探测系统内存大小,通过`i386_detect_memory()`函数获取物理内存的总量,然后分配并初始化页目录。 `kern_pgdir`是页目录的起始地址,使用`boot_alloc(PGSIZE)`为其分配内存,`PGSIZE`通常等于4KB,这是x86体系结构的一个页面大小。接着,`memset()`函数清零页目录,以确保所有页表项初始为空。在页目录中插入`UVPT`(用户虚拟页表基址)的页表项,这样用户空间就能通过这个映射访问到自己的二级页表。 `kern_pgdir[PDX(UVPT)] = PADDR(kern_pgdir) | PTE_U | PTE_P;`这行代码设置了页表项的权限标志,`PTE_U`表示用户模式可读,`PTE_P`表示页面存在。这样,内核就允许用户进程读取二级页表,但不允许写入,从而确保了安全性。 接下来,`boot_alloc(npages * sizeof(struct PageInfo))`为二级页表分配一个`PageInfo`结构体数组,`PageInfo`是用来跟踪和管理物理页面的数据结构,包含了页面的状态和引用计数等信息。`page_init()`函数随后被调用来初始化这个数组,初始化每个`PageInfo`对象。 `page_alloc()`和`page_free()`函数是内存分配和释放的核心。`page_alloc()`负责从空闲页面池中分配一个页面,而`page_free()`则将不再使用的页面返回给空闲列表,以便后续再利用。这些函数确保了内存的有效利用,防止内存泄漏,并支持动态内存分配需求。 实验五内存1深入介绍了x86系统中内存管理的基本流程,包括页表的建立、页面的分配和释放,这些都是操作系统运行的基础。通过对`kern/pmap.c`中`mem_init()`函数的分析,我们可以更好地理解内存管理的原理和实现细节。