linux的启动过程可以分为两个部分
1.架构/开发板相关的引导过程2.后续的通用启动过程
最终目的:运行应用程序(在根文件系统中)------->挂载根文件系统才能找到应用程序
第一阶段:引导过程
通常使用汇编语言编写
第一个执行的文件是/arch/arm/kernel/head.S
1.开始确定内核是否支持该构架__lookup_processor_type
2.确定内核是否支持单板__lookup_machine_type---->u-boot启动内核时传入的机器id
3.__create_page_tables建立一级页表
4.__arm920_setup禁止ICache/Dcache/数据Cache/指令Cache
5.__enable_mmu使能MMU
6.__mmap_switched 复制数据段、清除BBS段、设置栈指针、保存CPU ID到__machine_arch_type变量,调用start_kernel
第二阶段:后续启动过程
1.输出Linux版本信息printk(linux_banner)
2.设置与体系结构相关的环境setup_arch
3.其他的初始化操作
4.console_init
5.其他部分
6.启动init过程---->rest_init--->调用kernel_init-->调用prepare_namespace---->调用mount_root挂载根文件系统----->挂载完成后调用init_post打开/dev/console执行应用程序
init/main.c的start_kernel函数是第一个C函数
setup_arch与setup_command_line来解析u-boot传递过来的参数
内核启动流程:
arch/arm/kernel/head.S
start_kernel
setup_arch
setup_command_line
parase_early_param
do_early_param
从__setup_start到__setup_end,调用early函数
unkonw_bootoption
obsolete_checksetup
从__setup_start到__setup_end调用非early函数
rest_init
kernel_init
prepare_namespace
mount_root
init_post
执行用户的应用程序
1.架构/开发板相关的引导过程2.后续的通用启动过程
最终目的:运行应用程序(在根文件系统中)------->挂载根文件系统才能找到应用程序
第一阶段:引导过程
通常使用汇编语言编写
第一个执行的文件是/arch/arm/kernel/head.S
1.开始确定内核是否支持该构架__lookup_processor_type
2.确定内核是否支持单板__lookup_machine_type---->u-boot启动内核时传入的机器id
3.__create_page_tables建立一级页表
4.__arm920_setup禁止ICache/Dcache/数据Cache/指令Cache
5.__enable_mmu使能MMU
6.__mmap_switched 复制数据段、清除BBS段、设置栈指针、保存CPU ID到__machine_arch_type变量,调用start_kernel
第二阶段:后续启动过程
1.输出Linux版本信息printk(linux_banner)
2.设置与体系结构相关的环境setup_arch
3.其他的初始化操作
4.console_init
5.其他部分
6.启动init过程---->rest_init--->调用kernel_init-->调用prepare_namespace---->调用mount_root挂载根文件系统----->挂载完成后调用init_post打开/dev/console执行应用程序
init/main.c的start_kernel函数是第一个C函数
setup_arch与setup_command_line来解析u-boot传递过来的参数
内核启动流程:
arch/arm/kernel/head.S
start_kernel
setup_arch
setup_command_line
parase_early_param
do_early_param
从__setup_start到__setup_end,调用early函数
unkonw_bootoption
obsolete_checksetup
从__setup_start到__setup_end调用非early函数
rest_init
kernel_init
prepare_namespace
mount_root
init_post
执行用户的应用程序