内核启动流程
一、内核配置编译
1、配置:生成.config
①、make menuconfig
②、默认 arch/arm/configs 找到相似 xxx_defconfig -->make xxx_defconfig 执行完生成.config
③、使用厂家提供 cp xxxconfig .config 再 make menuconfig 配置
使得:
.config —> autoconf.h 源码目录下
.config —> auto.conf 顶层Makefile目录下
2、编译
①、make uImage
uImage 成分 :头部64k + 真正内核
依赖:
uImage : vmlinx (内核)
vmlinx:… 主要是两个文件 一个是 arch/arm/kernel/head.S 另一个是 arch/arm/kernel/vmlinux.lds
②、Makefile文件
obj - m/y += xx.o -------m:模块 y:编进内核
如: obj -m += ab.o | ab.o - objs := a.o b. o
二、启动流程
从uboot把内核拷到SDRAM后 首先会进行内核自解压再执行内核,处理uboot传入的参数(机器ID、环境参数)
执行内核过程:执行 arch/arm/kernel/head.S
①、判断是否支持此CPU __lookup_processor_type
②、判断是否支持此单板==看机器ID是否跟内核匹配 __lookup_machine_type 通过.arch.info.init段找到内核的nr(ID) 与uboot传递给R1的寄存器比较
③、建立页表
④、使能mmu
⑤、跳转 start_kernel 第一个c函数 (arch/arm/kernel/head-common.S)
start_kernel:
setup_arch //处理uboot传入的启动参数
setup_command_line //处理uboot传入的启动参数
rest_init
kernel_thread(kernel_init) //内核线程
preare_namespace
mount_root //挂载根文件系统
initpost //执行应用程序
内核:启动应用程序{
1、挂接根文件系统
2、启动第一个应用程序
}
1、挂接根文件系统mount yaffs:内部含有第一应用程序
2、内核启动第一个应用程序:
a:
打开一个设备 open (“/dev/console ”)
sys_dup(0);
sys_dup(0); //“复制”一个打开的文件号,使两个文件号都指向同一个文件
//第一个作为printf 二:scanf 三:err
b:
run_init_process(命令行init =xxx(linuxrc)或者/sbin/init或者..) 只执行一个,内部为死循环