file-type

Linux内存管理:初始化详解

下载需积分: 9 | 162KB | 更新于2024-08-02 | 58 浏览量 | 5 下载量 举报 收藏
download 立即下载
"Linux 内存管理系统初始化详解" Linux 内存管理系统是操作系统核心的重要组成部分,负责管理和优化系统中物理内存的使用。初始化是其至关重要的一步,确保系统启动时能够正确配置内存空间,并为后续的进程调度和资源分配奠定基础。在Linux内核启动过程中,内存管理的初始化主要涉及以下几个关键步骤: 1. **激活页内存管理**: Linux内存管理的核心之一是分页机制,它允许操作系统将物理内存划分为固定大小的页,通过页表进行地址转换。在初始化阶段,内核首先会创建并设置页目录(在`swapper_pg_dir`中),这是一个全局的页表,用于映射物理内存到虚拟地址空间。 2. **初始化内核数据结构**: 在这个阶段,内核会初始化一系列与内存管理相关的数据结构,如页表项、空闲页列表、内存节点信息等。这些数据结构对于跟踪内存状态、分配和释放内存至关重要。 3. **启动分页机制**: 在i386架构上,通过调用`TurningOnPaging((i386)`函数来开启分页机制。这个过程涉及到修改控制寄存器`CR0`,设置其中的分页标志位,从而启用硬件分页功能。 4. **内核代码的重新映射**: Linux内核通常被加载到物理地址0x100000,但在分页机制启动后,会被重新映射到`PAGE_OFFSET + 0x100000`的虚拟地址。`PAGE_OFFSET`在IA32架构上通常是3GB,标志着用户空间和内核空间的边界。这一重映射确保了内核代码可以被正确访问,而无需直接依赖物理地址。 5. **页表的构建**: 在`arch/i386/kernel/head.S`中,会建立一个初始的页表,将物理地址0-8MB映射到虚拟地址0-8MB(称为身份映射),以及将`PAGE_OFFSET`到`PAGE_OFFSET + 8MB`映射。这样做是为了确保内核代码在分页机制启动后仍然可访问。 6. **调用`start_kernel`**: 分页机制启动后,内核跳转到`init/main.c`中的`start_kernel`函数。由于`start_kernel`位于`PAGE_OFFSET`后的某个地址,所以在页表中必须映射这段地址,以便于执行。 7. **头文件中的神奇代码**: 在`head.S`中,有如下代码用于启动分页: ```assembly /* Enable paging */ 3: movl $swapper_pg_dir-__PAGE_OFFSET,%eax movl %eax,%cr3/*set the page table pointer..*/ movl %cr0,%eax orl $0x80000000,%eax movl %eax,%cr0/*..and set "PG" bit in CR0 to turn on paging */ ``` 这段代码设置了页目录的地址,并通过修改`CR0`寄存器启用了分页。 通过以上步骤,Linux内核完成了内存管理系统的初始化,为系统后续的运行提供了可靠的内存分配和管理基础。这个过程涉及到了硬件层面的地址映射和软件层面的数据结构初始化,确保了内核能够正确地管理和利用内存资源。

相关推荐

zhenwenxian
  • 粉丝: 803
上传资源 快速赚钱