1.uboot简介
它是bootloader的一种
bootloader是用于为操作系统的启动初始化硬件环境,加载启动操作系统
开源程序
号称通用的bootloader
1)支持多种CPU架构
2)支持启动多种操作系统
2.uboot的配置与编译过程
make x6818_config
make
make clean //清除编译过程中产生的文件
make distclean //清除配置阶段和编译阶段产生的文件
问:为什么要先配置后编译
答:配置完成了选出特定硬件相关代码 ,使其参与后续编译过程
3.阅读uboot的代码
3.1 寻找入口点
rm u-boot
make V=1 //V=1意思是显示编译链接的详细过程
arm-cortex_a9-linux-gnueabi-ld.bfd -pie --gc-sections -Bstatic -Ttext 0x43C00000 -o u-boot -T u-boot.lds arch/arm/cpu/slsiap/start.o --start-group arch/arm/cpu/built-in.o ... //链接的第一个文件将是入口文件
vi u-boot.lds
arch/arm/cpu/slsiap/s5p6818/start.o (.text*)
所以:入口点文件是arch/arm/cpu/slsiap/s5p6818/start.S
3.2 uboot启动流程
linux下代码阅读工具: vi + ctags
sudo apt-get install ctags //安装ctags
ctags -R *
vi start.s
将光标停留要查看的函数字符串上 ,按下键盘上的 ctrl + ] 就可以跳转到定义位置,ctrl + t 返回跳转前的位置
0x00000000 b reset:
reset:
1.设置为SVC模式
2.禁止看门狗
3.使L1缓存无效
4.禁止MMU
5.清空BSS6.bl board_init_f { initcall_run_list (init_sequence_f) } //完成一系列硬件的初始化
7.ldr pc, =board_init_r { initcall_run_list ( init_sequence_r) } //进一步完成硬件的初始化
8.最后 执行 run_main_loop 函数
run_main_loop:
- 循环执行main_loop
- s = bootdelay_process(){
s = getenv("bootdelay");
//完成字符串到整型的转换
bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;
...
s = getenv("bootcmd");
stored_bootdelay = bootdelay;
return s;
}- autoboot_command(s){
//倒数读秒计时 判断是否被打断
if (stored_bootdelay != -1 && s && !abortboot(stored_bootdelay)){
//顺序执行bootcmd中对应的命令
run_command_list(s, -1, 0);
}
}- cli_loop(){
cli_simple_loop(){
for (;;){
//输出命令提示符 接收用户输入的命令到console_buffer
len = cli_readline(CONFIG_SYS_PROMPT);
strcpy(lastcommand, console_buffer);
//执行命令
run_command_repeatable(lastcommand, flag)
}
}
}
sourceinsight:编辑 阅读 修改代码的利器
ubuntu 系统使用 wine的模拟器
阅读代码的经验:
1)有文档先看文档
2)看代码时关注框架 关注流程 放弃细节