函数定义如下(/arch/arm/setup.c): void __init __no_sanitize_address setup_arch(char **cmdline_p) { //init_mm是init进程(0号进程)的内存描述符 //初始化内核的mm结构体的代码段、数据段和栈的结束地址 setup_initial_init_mm(_stext, _etext, _edata, _end); //cmdline_p指向boot启动参数 *...
最后就是把memblock管理的内存移交给bootmem来管理,对于memblock中的空闲区域通过free_bootmem将bitmap中对应的bit置零,而已经使用的内存,即memblock中对应的reserved的区域使用reserve_bootmem将bitmap中对应bit置1。 /* arch/arm/mm/init.c */staticvoid__initarm_bootmem_init(...){ .../* Free the lowme...
最终会调用alloc_init_pte函数对指定范围的内存区域进行映射,其中的early_pte_alloc函数最终也会去调用Linux内核源码分析之setup_arch (二)中介绍的memblock_alloc函数来分配内存,最后将PTE所在页写入到PMD中即可完成映射。 /* arch/arm/mm/mmu.c */staticvoid__initalloc_init_pte(...){pte_t*start_pte = e...
①u-boot将配置参数地址通过寄存器传递给内核 ②内核(arch/arm/kernel/head-common.S中的__mmap_switched)将这个地址存入__atags_pointer(定义于arch/arm/kernel/setup.c) ③setup_arch()函数 [html]view plaincopyprint? void __init setup_arch(char **cmdline_p) { struct tag *tags= (struct tag *)&...
Linux内核源码分析之setup_arch (三)基本上把setup_arch主要的函数都分析了,由于距离上一篇时间比较久了,所以这里重新贴一下大致的流程图,本文主要分析的是bootmem_init函数。 代码分析 bootmem_init函数的结构如下: find_limits通过存储在meminfo中的内存条信息得到低端内存和高端内存的页框编号,分别放入到min、max_...
接着上一篇《Linux内核源码分析之setup_arch (一)》继续分析,本文首先分析arm_memblock_init函数,然后分析内核启动阶段的是如何进行内存管理的。 2. arm_memblock_init 该函数的功能比较简单,主要就是把meminfo中记录的内存条信息添加到memblock.memory中,然后把内核镜像所在内存区域添加到memblock.reserved中,arm_mm_me...
在Linux内核源码分析之setup_arch (二) 中介绍了当前启动阶段的内存分配函数memblock_alloc,该内存分配函数在本篇将要介绍paging_init中用于页表和内存的分配,paging_init函数大致流程如下图所示。 2. paging_init 2.1 build_mem_type_table 该函数根据具体的CPU架构对静态定义的mem_types数组中定义的属性进行调整。
//arch/arm/mm/Init.c->static struct meminfo meminfo __initdata = { 0, }; memcpy(&meminfo, mi, sizeof(meminfo));//将mi拷贝到全局量meminfo //请参考《浅析armlinux-setup_arch()->alloc_bootmem_low_pages()函数5-1》 zero_page = alloc_bootmem_low_pages(PAGE_SIZE);//zero_page指向清...
(1)setup_arch(&command_line)函数 内核架构相关的初始化函数,是非常重要的一个初始化步骤。其中,包含了处理器相关参数的初始化、内核启动参数(tagged list)的获取和前期处理、内存子系统的早期初始化。 command_line实质是uboot向内核传递的命令行启动参数,即uboot中环境变量bootargs的值。若uboot中bootargs的值为...
Uboot传递给内核的参数,都是一些对一个个的设备参数的描述,用于对内核进行相应的初始化,参数的具体内容暂时无需关心,有个大致印象就行,下面一步步看内核是怎么接收uboot参数的,在setup_arch函数中首先定义struct tag *型指针变量tags: struct tag *tags = (struct tag *)&init_tags; tags是重点,它就是内核接...