ARM Linux内核启动分析:从入口到start_kernel(4)

需积分: 10 1 下载量 183 浏览量 更新于2024-12-09 收藏 37KB DOC 举报
"这篇文档是关于ARM Linux启动过程的代码分析,主要集中在从入口到`start_kernel`阶段,特别是创建页表的环节。" 在ARM架构的Linux系统中,从入口点开始,系统逐步初始化,直到调用`start_kernel`函数,这个过程中包含了多个关键步骤。在描述的这一部分,我们关注的是如何为系统创建页表,这是内存管理的基础,它允许CPU高效地映射和访问物理内存。 创建页表的过程是由函数`__create_page_tables`执行的。在这个阶段,系统已经获取了处理器类型(processortype)和机器类型(machinetype)的信息。这些信息通常是在系统启动时由固件或Bootloader传递给内核的,以便内核能够根据硬件特性进行适当的配置。 在ARM体系结构中,使用了两级页表机制:L1页表和L2页表。在这个分析中,我们专注于L1页表,也称为段页表(Section Page Table)。L1页表将整个4GB的虚拟地址空间划分为4096个1MB大小的段(section)。每个段表项(section entry)占用32位(4字节),所以L1页表总计需要16KB的内存空间。 ARM926EJS的L1页表段表项结构如上所述,包括了以下字段: - BaseAddress:这是段的起始物理地址,占据高20位。 - SBZ(Software Bits,保留位):这部分位通常是未使用的,可以由软件设置。 - AP(Access Permissions):访问权限位,控制段的读/写权限以及用户态/内核态访问权限。 - Domain:域字段,用于内存访问权限控制。 - C(Cacheable):缓存位,如果设置,则表示该段内容可被缓存。 - B(Bufferable):缓冲位,如果设置,表示内容可以被缓冲。 其他位还有额外的属性,如数据缓存和缓冲标志,它们决定了页表项对应的内存区域是否被缓存,以及缓存类型。例如,当CacheBit和BufferBit都为0时,表示该段的内容既不缓存也不缓冲。 创建页表的目的是为了将虚拟地址映射到物理地址,使CPU能够正确地访问内存。在Linux内核启动过程中,这个步骤至关重要,因为它允许内核在初始化阶段设置内存管理和调度等核心服务,最终调用`start_kernel`函数,正式开始运行用户态程序和服务。