启动代码分析 02

Posted 张凌001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了启动代码分析 02相关的知识,希望对你有一定的参考价值。

首先从开发板硬件讲起:

思考问题: 开发板上电后,程序是如何启动呢???

这里分 nor flash 启动 和 nand flash 启动

讲解 : 

nand flash 启动:

______________________________________________________________________________________________________________________

由于NAND FLASH是接在NAND FLASH控制器上而不是系统总线上,所以没有在S3C2440A的8个BANK中分配地址空间。如果S3C2440被配置成从Nand Flash启动,在S3C2440上电后,Nand Flash控制器的会自动的把Nand Flash上的前4K数据搬移到内部SRAM中,也就是所谓的”Steppingstone”, 同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。系统会从这个内部SRAM中启动,程序员需要完成的工作,就是把最核心的启动程序放在Nand Flash的前4K中,也就是说,你需要编写一个长度小于4K的引导程序,作用是将主程序拷贝到RAM (一般是SDRAM)中运行。而在Nand Flash方式启动的情况下,系统是”看不到”Nor Flash的,因为Nor Flash也是挂在nGCS0上的,而nGCS0的地址空间已经被占用了。

________________________________________________________________________________________________________________________

1、系统上电后,首先自动判断是否是autoboot模式,如果使用 s3c2410是带有nandflash的,并且被设置成autoboot,从nandflash开始启动.
2、在判断是autoboot模式后,mcu内置的nandflash控制器自动将nandflash的最前面的4k区域(这4k区域存放着 bootloader的最前面4k代码)拷贝到samsung所谓的"steppingstone"里面(steppingstone是在S3C2440 中,实际上是一块4k大小的SRAM,).
3、在拷贝完前4k代码后,nandflash控制器自动将"steppingstone"映射到arm地址空间0x00000000开始的前4k区域.
4、在映射过程完成后.nandflash控制器将pc指针直接指向arm地址空间的0x00000000位置,准备开始执行"steppingstone"上的代码.
5、而"steppingstone"上从nandflash拷贝过来的4k代码,是程序员写的bootloader的前4k代码.这个 bootloader在之前写好,并已经被烧写到nandflash的0x00000000开始的最前面区域..而这"steppingstone"上的 4k代码就是bootloader的前4k代码.
6、在pc指向arm地址空间的0x00000000后,系统就开始执行指令代码.这4k代码的任务是:初始化硬件,设置中断向量表,设置堆栈,然后一个很重要的任务是,将nandflash的最前面区域的bootloader(包含4k启动代码)拷贝到SDRAM中去,bootloader代码的大小是写好bootloader就确定的.然后只需要确定bootloader想映射到SDRAM的起始位置就ok.
7、在完成对nandflash上的bootloader搬移后,找到4k代码的搬移代码最后一个指令的下一个指令在SDRAM的bootloader的地址,然后跳转到该位置,继续执行bootloader的剩余代码(引导系统).
 
 
具体可以看: http://blog.csdn.net/r91987/article/details/7625916   虽然没有图,但是说得很好啊
 
因为代码必须从 地址 0x000000 开始启动,而 nor flash 就是0x000000  但是nand flash 地址确是 0x30000000  行不通,但是我们有个 4KB 的 steping stone(ARM 芯片自己有的)地址是 0x00000,这样可以 
硬件复制前4KB 代码到 stepping stone 再转到 0x30000000 的 SDRAM 中去
 
nor flash 启动,由于 nor flash 可以存放 bios , 但是 可读不可写,但是 bootloader 里面的 RW 段 和 ZI 段 要被写,自然也要进行代码的搬迁工作(参考 杨铸 97页
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————————————————————————————————————————
 
启动代码详解: 
 
总得来说,裸机开发 启动代码只有 100 多条 汇编指令, 通过启动代码可以近一步熟悉 ARM 汇编指令, 好处是为以后熟练运用 ARM C语言, 汇编语言混合编程以及 uboot的移植打下基础。
那么怎样才算ARM汇编 过关呢???? 只要看得懂启动代码就可以了啊!!!!!!!!!!啊啊啊啊 啊啊 啊 啊啊啊 啊!!!!!!!然后自己会修改就行了!啊啊啊啊啊啊a啊 啊啊啊 啊啊 啊~~  !!!!!!!!!!

以上是关于启动代码分析 02的主要内容,如果未能解决你的问题,请参考以下文章

Android应用程序启动过程源代码分析

Android应用程序启动过程源代码分析

我需要启动父类还是只启动子类

Ocata Neutron代码分析——Neutron RPC启动过程分析

novoton-启动代码分析

视频更新:代码分析8之单步调试ARM64启动汇编与重定位