首页 > 代码库 > 【系统移植】U_BOOT移植
【系统移植】U_BOOT移植
U-BOOT移植
Bootloader引导启动
0x0000_0000 0x0000_8000 32KB IROM
0x0002_0000 0x0003_8000 96KB IRAM
0x0003_4000 0x0003_8000 16KB BL1
The boot loader is divided into the BL0( 1st boot loader) and the BL1(2nd boot loader).
? BL0 which is placed in iROM loads BL1 from the booting device to iRAM. The booting device is determined by
the OM and NFMOD pins. In addition, according to the secure boot key values, BL0 checks the integrity of BL1.
? BL1 should initializes the DRAM controller. After initializing the DRAM controller, it loads the OS image from
the booting device to DRAM. And, according to the secure boot key values, BL1 checks the integrity of the OS image.
-对于bootloader的引导内核启动大致可以分为以下几个步骤来实现的:
1)在系统reset或者上电的时候,CPU的PC指针会默认指向物理地址的0x0000-0000处取指译码执行,而此处的物理地址表示的硬件是处理器的片内IROM,由于IROM存储器具有存储并执行代码的功能,它固化了一段引导代码(BL0),这段代码决定了以什么方式启动,一般的启动方式有USB/NAND FLASH 等,BL0找到启动引导代码之后,由于NAND FLASH不支持片上执行,于是BL0会把BL1的引导代码载入片内的IRAM,在上面看到IRAM的存储空间是96KB但是只留了0x34000 - 0x38000 的16KB存储空间给BL1引导启动,如果系统的启动和引导代码的大小小于16KB的时候,BL1引导代码不会自搬移,直接完成了bootloader的引导内核的启动
2)但是一般情况下,都不会有那么理想的引导方式,此时在BL1的引导代码中,在IRAM执行中会自搬移到DRAM中,此时会有疑问,当BL1搬移到DRAM后的在IRAM中执行过的代码会不会再次被重复执行,(答案是不会的,在u_boot启动的代码中通过比较运行地址和连接地址的比较)当执行BL1的代码时,u_boot会对系统的相关硬件初始化,初始化系统时钟,关看门狗,以及初始化栈空间和清BSS段以及创建异常向量表,在这里由于内核启动时要求关内存管理单元以及关相应的D_CACHE,I_CACHE,DLL等
3)还有最后也是最重要的就是在u_boot把内核的镜像zImage加载到物理地址的0x20008000中还有一些内核启动时初始化内存管理以及内核线程运行的一些环境都被BL1存放在地址的0x200000100的param_struct 结构体中,当内核起来的时候回去调用这些参数
4)其实在内核起来的时候运行还需要根文件系统rootfs,在这之前u_boot固化的方式或者通过nfs网络共享的方式提供给内核。
【系统移植】U_BOOT移植