UBoot讲解和实践-------------讲解(二)

UBoot  ARM移植之阶段二   理论篇

 stage2:

           1.初始化本阶段要使用的硬件设备:

             通常包括两方面:

              1)初始化至少一个串口,以便和终端用户进行I/O输出信息。
              2)初始化计时器等

          2.检测系统的内存映射

             内存映射就是指在整个4GB物理地址空间中有哪些地址被分配用来寻址系统的RAM单元。必须知道CPU预留的全部RAM地址空间中的哪些被真正映射到RAM地址单元,哪些处于"unused状态。

            使用数据结构体memory_area_struct来描述RAM地址空间中的一段连续的地址范围

           处有一个可用来检测整个RAM地址空间内存映射情况的简单而有效的算法。(具体研究此算法需要另看别的书)

         3.加载内核映像和根文件系统映像

              有两个工作要做:

               1)规划内存占用的布局。包括两个方面:内核映像所占用的内存范围、根文件系统所占用的内存范围。在规划内存占用的布局时,主要考虑基地址和映像的大小两个方面。

              2)从flash上复制。由于像ARM这样的嵌入式CPU通常都在统一的内存空间地址中寻址flash等固态存储设备的,因此从flash上读取数据与从RAM单元中读取数据并没有什么不同。用一个简单的循环就可以完成从flash设备上复制映像的工作

                 while(count)

                 {

                        *dest++=*src++;
                         count -= 4;//arm 是4字节的,由总线决定的。
                  }

           4.设置内核的动参数

               即设置linux内核的启动参数。

               数据结构tag和tag_header定义在linux内核源码的include/asm/setup.h头文件中。(这里面大有文章)

           5.调用内核

               Boot Loader调用Linux内核的方法是直接跳转到内核的第一条指令处,跳转需要满足的条件:

               1)CPU寄存器的设置:R0=0;

               (具体参看内核代码文件:linux/arch/arm/tools/mach --types)
               2)CPU模式:必须禁止中断(IRQs和FIQs),同时必须应该是SVC模式(特权模式,可以访问更多的硬件资源)。
               3)Cache和MMU的设置:MMU必须关闭;指令Cache可以打开也可以关闭;数据cache必须关闭。

                

             

The future's not set,there is no fate but what we make for ourselves.

你可能感兴趣的:(uboot)