ARM架构下Linux内核高低端内存设置解析

需积分: 10 0 下载量 179 浏览量 更新于2024-08-31 收藏 93KB DOC 举报
"这篇文档详细介绍了在ARM架构下Linux内核如何在启动过程中设置高低端内存的分界线。文章作者以Linux 3.0版本的内核源码为分析对象,逐步解析了相关代码,主要涉及`init.c`文件中的`__initbootmem_init(void)`函数。 首先,在`__initbootmem_init(void)`函数中,定义了`min`, `max_low`, 和 `max_high`变量来初始化内存限制。接着通过调用`find_limits()`函数找到内存的最小和最大低端内存界限。然后,`arm_bootmem_init(min, max_low)`用于初始化低端内存。这一步骤确保了内核启动时对内存的初步分配。 之后,`arm_memory_present()`函数被调用,它尝试在`memory_present()`中分配启动内存,这部分必须在固定预留内存之后进行。紧接着,`sparse_init()`执行,这个函数需要 bootmem 分配器已经运行,以初始化稀疏内存映射。 在`arm_bootmem_free(min, max_low, max_high)`步骤中,释放了从`min`到`max_low`之间的内存,这是为了`memmap_init_zone()`函数能够正确初始化区域,否则所有的物理页帧号(PFNs)将被视为无效。 最后,`high_memory`被设置为`(__va(((phys_addr_t)max_low<<PAGE_SHIFT)-1)+1)`,这代表了高端内存的起点,它是虚拟地址空间中逻辑地址与虚拟地址分界线减去固定偏移后的地址。这里的`__va()`宏转换物理地址为虚拟地址,`PAGE_SHIFT`是页大小的位移,通常为12,表示4KB页面。 整个过程展示了Linux内核在ARM上如何动态地管理内存,区分出高端和低端内存,为后续的系统运行和内存分配做好准备。这个过程对于理解Linux内核内存管理机制,特别是对ARM平台开发者来说至关重要。"