Linux 0.11内核中的物理内存管理

需积分: 10 2 下载量 156 浏览量 更新于2024-12-12 收藏 222KB PDF 举报
"Linux 0.11内存管理主要涉及在保护模式下如何管理和访问物理内存。在保护模式中,硬件提供了虚拟存储的基础,但实际的内存管理任务仍由操作系统完成。Linux 0.11通过一种巧妙的方式在内核中直接操作物理内存,即让内核使用的线性地址与物理地址重合,以避开线性地址映射的障碍。 在进入保护模式前,需要初始化页目录表和页表。在Linux 0.11中,由于仅处理16MB物理内存和4GB线性空间的情况,只需要一个页目录表和四个页表。页目录表置于物理地址0x0000,页表分别位于pg0(0x1000)、pg1(0x2000)、pg2(0x3000)和pg3(0x4000)。 关键代码片段位于`linux/boot/head.s`,首先清零5页内存,包括页目录表和4个页表。接着,设置页表项以映射物理内存: ``` 200 movl $_pg_dir, %eax /*pg_dir*/ 201 movl %eax, %ebx /*base address*/ 202 movl $_pg_zero, %esi /*pg_zero*/ 203zero_loop: 204 movl (%esi), %edx /*clear page table entry*/ 205 movl %edx, (%ebx) 206 addl $4, %ebx /*next entry*/ 207 addl $4, %esi /*next pg_zero byte*/ 208 loop zero_loop ``` 这段代码将页目录表和页表的每个条目清零,然后进行初始化。初始化过程中,每个页表项被设置为指向物理内存的特定段,从而实现线性地址与物理地址的映射。 内存的分配与回收是内存管理的另一重要方面。在Linux 0.11中,内存分配通常通过`kmalloc`函数完成,它会从空闲内存块链表中寻找合适大小的块并分配。分配后,内存块会被从链表中移除,并更新内存管理数据结构。当内存不再需要时,通过`kfree`函数进行释放,将内存块返回到空闲链表。 为了跟踪内存的使用情况,Linux 0.11维护了一个空闲页列表,每个页都有状态信息,例如是否已分配、是否可交换等。此外,还存在一个全局变量`free_pages`记录当前系统中可用的空闲页面数量。 Linux 0.11的内存管理涉及了页级的地址映射、初始化、分配和回收机制,以及内存状态的跟踪。这些机制确保了系统在保护模式下能安全、高效地管理内存资源。通过理解这些基础知识,可以更好地了解早期Linux内核的工作原理,同时为理解现代操作系统内存管理打下基础。