目的:仿写U-BOOT
概念介绍:bootloader的作用就是初始化硬件设备,建立内存空间映射,为启动内核提供一个好的环境,所以说我们的最终目标是成功启动内核。
第一步:写start.S
1.关闭看门狗
2.设置时钟(包括设置分频系数,MPLLCON和设置CPU处于异步模式)
3.设置内存
4.重定位,设置栈指针
5.nand flash初始化
6.给拷贝代码至内存的函数分配参数(参数由链接文件指定地址)
7.拷贝代码至sdram,然后清理BSS段
8.设置中断跳转至main函数
第二步:编写boot.c
1.参考u-boot构建出启动内核的步骤:定义函数指针*kernel;串口初始化(因为我们需要通过串口向串口软件发送调试信息);nand_read(addr,*buf,size)从addr的地址开始,读取大小为size的数据到buf指定的地址里,;设置启动参数;设置内存参数;设置命令行参数;设置结束参数;调用内核函数:362在uboot源码里指的是s3c2440(其中设置启动、内存、命令行、结束参数的函数参考uboot源码)
第三步:编写init.c
分别写uart_init()、puts()、nand_init()、nand_read()、copy_code_to_sdram()
今日所得:学会从编译器的报错和警告中去调试代码,还有就是调用另外一个文件的函数时要用extern,这是c语言基础。编写Makefile的时候在-gcc后面加上-fno-builtin可以消去编译器关于函数参数不匹配的问题。最后就是要有耐心得坐着调,虽然会遇到一遍又一遍的问题但还是要一个个得解决。