5.setup_arch大概步骤

在内核已经载入内存、而初始化的汇编程序部分已经执行完毕后,内核必须执行哪些特定于系统的步骤?图3-12给出了各个操作的代码流程图。

该图只包括与内存管理相关的那些函数调用。在这里所有其他的都是不重要的,因此省去。
首先调用machine_specific_memory_setup,创建一个列表,包括系统占据的内存区和空闲内存区。BIOS提供的映射给出了在这种情况下使用的各个内存区。如果BIOS没有提供该信息(在较古老的机器上可能是这样),内核自身会生成一个表,将0~640KiB和1 MiB之前的内存标记为可用。
 
内核接下来用parse_cmdline_early分析命令行,主要关注类似mem=XXX[KkmM]、highmem=XXX[kKmM]或memmap=XXX[KkmM]" "@XXX[KkmM]之类的参数。
 
下一个主要步骤在setup_memory中执行,该函数有两个版本。一个用于连续内存系统(在arch/x86/kernel/setup_32.c),另一个用于不连续内存系统(在arch/x86/mm/discontig_32.c)。尽管实现不同,但二者的效果相同。
 确定(每个结点)可用的物理内存页的数目。
 初始化bootmem分配器(3.4.3节会详细讲解该分配器的实现)。
 接下来分配各种内存区,例如,运行第一个用户空间过程所需的最初的RAM磁盘。
 setup_memory详细请见9.启动过程期间的内存管理 

paging_init初始化内核页表并启用内存分页,因为IA-32计算机上默认情况下分页是禁用的。通过调用pagetable_init,该函数确保了直接映射到内核地址空间的物理内存被初始化。
低端内存中的所有页帧都直接映射到PAGE_OFFSET之上的虚拟内存区。这使得内核无需处理页表,即可寻址相当一部分可用内存。
 
调用zone_sizes_init会初始化系统中所有结点的pgdat_t实例。首先使用add_active_range,对可用的物理内存建立一个相对简单的列表。体系结构无关的函数free_area_init_nodes接下来使用该信息建立完备的内核数据结构。zone_sizes_init详见8.注册内存区,用于后面初始化内存域和结点(zone_sizes_init) 
 
 
 
posted @ 2022-03-18 00:24  while(true);;  阅读(78)  评论(0)    收藏  举报