Linux内核初始化setup_arch C语言代码的入口是start_kernel这个函数,本文要介绍其中的set_arch这个函数,该函数的作用是查找给定机器ID的数据结构信息、配置内存条信息、解析bootloader传递命令行参数,然后根据machine_desc结构体所记录的信息对机器进行一些必要的设置,最后开始正式建立完整的页表。 setup_arch这个重磅函数,...
Linux内核启动:setup_arch BootLoader可以向Linux传递参数,编译内核时也可以配置boot options。 调试中使用的U-Boot bootargs如下: noinitrd root=/dev/mtdblock3 rw console=ttySAC0,115200 init=/linuxrc mem=64M 内核版本: 2.6.35.7 内核的处理参数的整体过程如下: ①u-boot将配置参数地址通过寄存器传递给内核 ...
1. 概述之前已经写了几篇Linux内核启动相关的文章,比如:《 解压内核镜像》《调用 start_kernel》都是用汇编语言写的,这些代码的作用仅仅是把内核镜像放置到特定的位置,同时配置好C语言的运行环境,再有就是简…
Linux内核源码分析之setup_arch (三) 基本上把setup_arch主要的函数都分析了,由于距离上一篇时间比较久了,所以这里重新贴一下大致的流程图,本文主要分析的是bootmem_init函数。 代码分析 bootmem_init函数的结构如下: find_limits通过存储在meminfo中的内存条信息得到低端内存和高端内存的页框编号,分别放入到min、max...
Linux内核源码分析之setup_arch (一) 1. 概述 之前已经写了几篇Linux内核启动相关的文章,比如:《解压内核镜像》《调用 start_kernel》都是用汇编语言写的,这些代码的作用仅仅是把内核镜像放置到特定的位置,同时配置好C语言的运行环境,再有就是简单的把内核镜像所在区域的页表设置一下,在开启MMU之后就正式开始了C...
在Linux内核源码分析之setup_arch (二) 中介绍了当前启动阶段的内存分配函数memblock_alloc,该内存分配函数在本篇将要介绍paging_init中用于页表和内存的分配,paging_init函数大致流程如下图所示。 2. paging_init 2.1 build_mem_type_table 该函数根据具体的CPU架构对静态定义的mem_types数组中定义的属性进行调整。
include/linux/init.h: 点击(此处)折叠或打开 struct obs_kernel_param { const char *str; //在cmdline中相应参数名。 int (*setup_func)(char *); //对于此参数的专用处理函数 int early;//是否为早期需要处理的参数 }; 两种不同的参数在内核中用了不同的宏来定义: ...
接着上一篇《Linux内核源码分析之setup_arch (一)》继续分析,本文首先分析arm_memblock_init函数,然后分析内核启动阶段的是如何进行内存管理的。 2. arm_memblock_init 该函数的功能比较简单,主要就是把meminfo中记录的内存条信息添加到memblock.memory中,然后把内核镜像所在内存区域添加到memblock.reserved中,arm_mm_me...
__atags_pointer,定义在汇编文件arch/arm/kernel/head-common.S的__switch_data子程序(可参考“ARM架构内核启动分析-head.S(1.4、stext分析之打开MMU并跳到start kernel”一文)),在内核代码源头stext运行前,由arm寄存器R2保存要传递给内核的参数的地址,当stext运行到子程序__switch_data时,定义变量__atags_point...
arm-linux之uboot向内核传递参数(setup_arch分析) 抛开uboot不谈,先看看uboot给内核传递的参数是什么样的东西,在arch/arm/kernel/setup.h文件中的struct tag结构体: struct tag { struct tag_header hdr; union { struct tag_core core; struct tag_mem32 mem; struct tag_videotext videotext; struct tag...