话说上回通过LFS把linux的结构学习了一下后,探究出嵌入式的几大组成部分,bootloader,linux内核,根文件系统
得,就从bootloader开始,从cpu加电的那一刻开始
拿出以前买的s3c2440的开发板,经过一番搜索,得知uboot和vivi是这个平台下比较流行的两个bootloader,鉴于vivi比较简单,就从vivi入手,找出head.S即bootloader的入口,逐行分析,从最简单的点灯,到输出UART,到拷贝nand到ram,到跳转到c程序,其间通过《S3C2410完全开发教程》的帮助,基本调通弄明白了,大家有不明白的可以多搜索这篇文章。
我就讲讲几个在调试过程中困扰我比较久的问题:
1:一个是跳到ram的问题,如何实现,即通过ldr pc,=step2 这个伪指令,=step2就是ld的时候设置的运行地址,要注意ldr作为伪指令和加载指令的区别
_start:
b step1 @b操作都是相对位置
step1: @标号这都是连接地址,如0x30000000 动态库重定向地址应该也是这个概念,加载的地址不一样
ldr pc,=step2 @ldr操作则是填入绝对地址,即连接地址,实现跳转
step2:
b step2
2:GPIO口的设置,我这个开发板的灯端口是GPIO_B
mov r1, #GPIO_CTL_BASE
add r1, r1, #oGPIO_B
ldr r2,=0x155555 @设置11个引脚都为输出 ,两位描述一个脚