### ARM Linux 内存映射知识点详解 #### 一、概览 《ARM Linux 内存映射》是一篇深入探讨ARM架构下Linux系统如何管理内存映射的文章。该文档由作者张俊岭编写,发布于2009年8月5日。文档主要介绍了在ARM Linux环境下,如何通过处理器的MMU(Memory Management Unit,内存管理单元)来实现对存储器的保护以及如何通过虚拟地址访问物理存储器。 #### 二、ARM Linux内存映射的基本概念 在ARM Linux中,由于处理器使用的是虚拟地址空间,因此需要将虚拟地址映射到物理地址上。这一过程涉及到MMU的配置和页表的设置。页表是用于存储虚拟地址与物理地址对应关系的数据结构。 #### 三、内存映射的创建 内存映射的创建是在内核启动函数`start_kernel()`中完成的,具体通过调用`setup_arch()`函数实现。`setup_arch()`函数位于`arch/arm/kernel/setup.c`文件中。 1. **收集信息**: - 首先从“机器描述信息块”、“启动参数块”和“命令行”等处收集相关信息。 - 这些信息被整理到一个名为`mem_info`的结构体中,它描述了系统中所有存储器的起始地址和大小。 2. **创建页表**: - 在收集完信息后,调用`paging_init()`函数来创建页表。此函数负责将虚拟地址映射到物理地址。 - `paging_init()`函数接收两个参数:一个是`mem_info`结构体,另一个是机器描述表指针`mdesc`。 #### 四、`setup_arch()`函数详解 `setup_arch()`函数是整个内存映射过程中最关键的部分之一。下面是该函数的主要步骤: 1. **初始化处理器**:通过调用`setup_processor()`函数进行基本的处理器初始化。 2. **定位机器描述表**:根据特定的“机器类型代码”,找到对应的“机器描述表”(`machine_desc`结构),这一步骤对于不同的硬件平台至关重要。 3. **处理启动参数**:如果存在“启动参数”(tagged list),则对其进行处理。 4. **调用`paging_init()`**:创建页表,即创建内存映射。这是内存管理的核心部分,它负责将物理存储器映射到虚拟地址空间。 5. **请求资源**:通过`request_standard_resources()`函数为存储设备预留资源。 #### 五、`mem_info`结构体解析 `mem_info`结构体在`include/asm-arm/setup.h`文件中定义,用于描述系统中所有存储器的信息。其定义如下: ```c struct membank { unsigned long start; // Bank的起始地址 unsigned long size; // Bank的大小 int node; // Bank的节点号 }; struct meminfo { int nr_banks; // Bank的数量 struct membank bank[NR_BANKS]; // Bank数组 }; ``` - `nr_banks`表示Bank的数量。 - 每个`membank`结构体包含存储Bank的起始地址、大小和节点号。 #### 六、总结 《ARM Linux 内存映射》这篇文章提供了关于ARM Linux环境下内存管理的一个简洁而完整的示例。通过深入了解`setup_arch()`函数及其内部逻辑,可以更好地理解ARM Linux系统是如何管理和映射内存的。这对于嵌入式开发人员来说是非常宝贵的资源,有助于他们更高效地进行内存管理,尤其是在资源有限的环境中。
剩余10页未读,继续阅读
- QFMCwlk2013-08-12资源还行,就是解释偏少
- 粉丝: 112
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助