[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 内核的内存管理机制,并为后续的内存管理学习和开发打下坚实的基础**。

[linux内存管理] 第007篇 fixmap映射详解 9月前查看 评论
[linux内存管理] 第007篇 fixmap映射详解

您好,以下是对您提供的文章内容的100字左右摘要总结: 文章主要介绍了Linux内核中fixmap的概念、作用和实现。fixmap是内核预留的一段虚拟内存空间,用于早期固定映射,包括fdt、console、外设动态映射和paging_init()等。文章详细分析了fixmap的分布、初始化过程以及与设备树(dtb)的关系。fixmap的初始化涉及pgd、pud、pte等页表的创建和映射,而设备树dtb的映射则通过fixmap_remap_fdt()函数实现。此外,文章还介绍了early_ioremap_init()和setup_machine_fdt()等函数的作用,以及FDT调试方法。

linux内核源码解析02–启动代码分析之setup_arch详解 9月前查看 评论
linux内核源码解析02–启动代码分析之setup_arch详解

Linux内核在初始化过程中,通过建立页表映射,使得内核可以访问物理内存。在完成了恒等映射和粗粒度内核页表映射之后,为了能够访问bootloader传入的dtb和IO设备,Linux引入了fixmap映射。fixmap将一段固定虚拟地址映射到dtb和想要访问的IO设备地址,为后续的内存管理和设备驱动程序的初始化奠定了基础。 fixmap映射的基虚拟地址和大小由宏`FIXADDR_SIZE`和`FIXADDR_START`表示。`early_fixmap_init`函数负责初始化fixmap映射,它通过填充页表项,将fixmap区域的虚拟地址与dtb和IO设备的物理地址建立映射关系。 在初始化fixmap映射之后,Linux内核通过`ioremap`函数将IO设备的物理地址映射到内核空间的虚拟地址,使得内核可以访问IO设备。`early_ioremap_init`函数负责初始化ioremap映射,它通过计算虚拟地址和物理地址的偏移量,建立映射关系。 此外,Linux内核还通过`fixmap_remap_fdt`函数将dtb的物理地址映射到内核空间的虚拟地址,使得内核可以访问dtb中的内存信息和板级信息。`memblock_reserve`函数将dtb所占用的内存区域添加到memblock管理的reserve模块中,避免后续内存分配时使用到这部分内存。 最后,Linux内核通过`early_init_dt_scan`函数扫描和解析dtb,将内存布局信息填入memblock系统,并通过`arm64_memblock_init`函数整理内存区域,将一些特殊区域添加到memblock内存管理模块中。这些步骤为后续的内存管理和设备驱动程序的初始化提供了重要的基础。