setup_arch函数主要是处理cpu体系相关架构,我们是arm64平台,这个函数处理arm64的一些初始化,主要包括: 初始化内核的mm结构体的代码段、数据段和栈的结束地址; 调用函数early_fixmap_init进行早期固定映射初始化; 调用函数early_ioremap_init进行早期io映射初始化; 调用函数setup_machine_fdt解析fdt中内存,加入到memblock...
Linux内核源码分析之setup_arch (四) 前言 Linux内核源码分析之setup_arch (三) 基本上把setup_arch主要的函数都分析了,由于距离上一篇时间比较久了,所以这里重新贴一下大致的流程图,本文主要分析的是bootmem_init函数。 代码分析 bootmem_init函数的结构如下: find_limits通过存储在meminfo中的内存条信息得到低端内...
接下来就是解析bootloader传递的命令行参数,通过tag->hdr.tag查找内核中预置的对应类型tag的解析函数,然后调用对应类型tag的parse函数即可实现对参数的解析。 /* arch/arm/kernel/setup.c */staticint__initparse_tag(conststructtag *tag){externstructtagtable__tagtable_begin, __tagtable_end;structtagtable*t;...
在开启MMU之后就正式开始了C语言代码的执行,C语言代码的入口是start_kernel这个函数,本文要介绍其中的set_arch这个函数,该函数的作用是查找给定机器ID的数据结构信息、配置内存条信息、解析bootloader传递命令行参数,然后根据machine_desc结构体所记录的信息对机器进行一些必要的设置,最后开始正式建立完整的页表,大致流程如...
接着上一篇《Linux内核源码分析之setup_arch (一)》继续分析,本文首先分析arm_memblock_init函数,然后分析内核启动阶段的是如何进行内存管理的。 2. arm_memblock_init 该函数的功能比较简单,主要就是把meminfo中记录的内存条信息添加到memblock.memory中,然后把内核镜像所在内存区域添加到memblock.reserved中,arm_mm_me...
在开启MMU之后就正式开始了C语言代码的执行,C语言代码的入口是start_kernel这个函数,本文要介绍其中的set_arch这个函数,该函数的作用是查找给定机器ID的数据结构信息、配置内存条信息、解析bootloader传递命令行参数,然后根据machine_desc结构体所记录的信息对机器进行一些必要的设置,最后开始正式建立完整的页表,大致流程如...
接着上一篇《Linux内核源码分析之setup_arch (一)》继续分析,本文首先分析arm_memblock_init函数,然后分析内核启动阶段的是如何进行内存管理的。 2. arm_memblock_init 该函数的功能比较简单,主要就是把meminfo中记录的内存条信息添加到memblock.memory中,然后把内核镜像所在内存区域添加到memblock.reserved中,arm_mm_me...
Uboot传递给内核的参数,都是一些对一个个的设备参数的描述,用于对内核进行相应的初始化,参数的具体内容暂时无需关心,有个大致印象就行,下面一步步看内核是怎么接收uboot参数的,在setup_arch函数中首先定义struct tag *型指针变量tags: struct tag *tags = (struct tag *)&init_tags; ...
3.2 start_kernel函数流中的关键函数 (1)setup_arch(&command_line)函数 内核架构相关的初始化函数,是非常重要的一个初始化步骤。其中,包含了处理器相关参数的初始化、内核启动参数(tagged list)的获取和前期处理、内存子系统的早期初始化。 command_line实质是uboot向内核传递的命令行启动参数,即uboot中环境变量boo...