[linux 内存管理] 第010篇 paging_init详解 9月前查看 评论
[linux 内存管理] 第010篇 paging_init详解

**本篇文章介绍了 Linux 内核启动过程中 `paging_init` 函数的作用和实现细节**。 * **作用**: 建立物理内存到内核空间虚拟地址的映射,使得操作系统可以正常访问和管理内存。 * **实现**: * **fixmap 映射**: 将内核页表 `swapper_pg_dir` 映射到 fixmap 区域,方便后续操作。 * **内核段映射**: 将内核映像的各个段(text, rodata, inittext, initdata, data)映射到内核空间的虚拟地址(vmalloc 区域)。 * **物理内存映射**: 将 `memblock.memory` 中所有 regions 对应的物理内存进行线性映射,使得整个物理内存区域可以被访问。 * **页表替换**: 将 fixmap 映射的页表替换为 `swapper_pg_dir` 页表,并更新内核主进程的 pgd 地址。 * **内存释放**: 释放 `init_pg_dir` 页表的物理内存,并允许 memblock 重新调整大小。 * **关键函数**: * `pgd_set_fixmap`: 将 pgd 页表映射到 fixmap 区域。 * `map_kernel`: 映射内核段的动态页表。 * `map_mem`: 建立物理内存的线性映射。 * `__create_pgd_mapping`: 依次动态建立各级页表。 * `alloc_init_pud`: 填充 pgd 表项,并建立 pud 页表。 * `alloc_init_cont_pmd`: 填充 pmd 表项,并建立 pte 页表。 * `early_pgtable_alloc`: 动态分配页表。 * **总结**: `paging_init` 函数是 Linux 内核启动过程中至关重要的步骤,它为操作系统提供了访问和管理内存的能力,为后续的内存管理操作奠定了基础。 **通过理解 `paging_init` 函数的实现细节,可以更好地理解 Linux 内核的内存管理机制,并为后续的内存管理学习和开发打下坚实的基础**。