Uboot编译步骤和分析汇编代码
编译uboot
-
生成一系列的配置文件:make s5p_goni_config
-
执行make
centos下要安装依赖的文件包:yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
生成过程
start.s ---->start.o
board.c ---->board.o
......c ---->xxxx.o
连接器拼接
---->uboot(包含原始代码,调试信息,地址信息等等)
---->分析
---->arm-linux-objdump -S uboot | less
-S 显示源代码和反汇编代码
重定向到less查看器
uboot 剥离调试信息等
---->uboot.bin
---->运行
编译器:把c语言代码编译成汇编语言
汇编器:把汇编语言编译成二进制文件,机器代码
分析uboot(objdump 之后)
_start: b reset
34800000: ea000014 b 34800058 <reset>
1、汇编代码
2、代码所在内存地址 机器指令 机器指令对应的汇编指令
ldr pc, _undefined_instruction
34800004: e59ff014 ldr pc, [pc, #20] ;
34800020 <_undefined_instruction>
1、汇编代码 伪指令
机器代码四个字节
地址也四个字节 放不下指令ldr,pc这些内容
2、汇编器做了一个处理
利用pc指针,+20
与其保存四字节的内容,不如利用pc,保存立即数20就可以了
流水线(三级) 程序指令运行
取指 ---->译码 ---->运行
代码内存到CPU 翻译成机器能识别的二进制 运行
pc指令并不是指向当前运行的这条命令 而是指向当前这条命令+8(取值,译码一共8字节)
pc,#20 = 0x04+8 = 0x0c
+ 0x14(20) == 34800020
[pc,#20] = 34800200 异常处理函数开始处代码
34800020 <_undefined_instruction>:
34800020: 34800200 .word 0x34800200