下载地址为什么是0xd0020010?
刚开始在s5pv210的开发板上学习嵌入式开发时,学习教程上每次都说,利用usb方式启动时,需要先将usb驱动下载到0xd0020010这个地址处,每每听到这里,我都很疑惑为什么一定要下载到此处,可以说算得上是满脸的黑人问号吧。但是咱也不知道,只能硬着头皮继续学习。
最近,当初的那个“为什么”总是时不时地出现在自己的脑海中,本着让自己心安的态度进行了一番探索,得出了结论,分享如下,如有不足,希望大家能够指正:

首先,且看上图,我们可以得知s5pv210这款芯片的内存地址的配情况,然后再结合下面这个表:

我们可以知道,0x0000_0000~0x1FFF_FFFF是一个特殊区域,他会根据boot mood的结果来决定将某区域内存的指令映射到本区域,供程序指针(PC)读取执行。210启动的过程可以大概总结:
1、上电,执行rom内的厂家固化代码,识别boot mode(norFlash/SD/NAND)完成一些简单的初始化,保证cpu能够具有将bl1代码从nand读取到sram中执行的能力。
2、bl1代码执行的过程中进一步对nand进行初始化,以便完成将bl2代码读入ddr中执行的操作
3、bl2代码执行,完成对ddr的初始化,并将整个uboot与内核代码拷贝到ddr中执行。
在学习中,210上并没有norFlash,为了学习方便,我们使用的是SD卡启动的方式,因此被映射到0x0000_0000~0x1FFF_FFFF是这个特殊区域的内存区域0xD000_0000~0xD003_7FFF。查表我们可以知道,这个区域可以分为两块:0xD000_0000
~0xD000_FFFF(IROM),0xD002_0000~0xD003_7FFF(IRAM)。
众所周知,IROM就是rom,这种内存一般不能直接写,只可以直接读,因此我们并不能将我们的实验程序写进这个内存区域里,我们的实验程序实际上是扮演了BL1与BL2的作用,运行在IRAM中,因此BL1的加载内存地址在不需要校验的情况下可以是0xD0020000,但是我们模仿的是uboot的加载原理,uboot要求必须在BL1的开头设置校验位,校验通过的情况下才可以继续往后执行,因此在BL1的开头设置了16字节的校验位,因此我们的程序必须从IRAM的第十七个字节开始执行,即加载地址就编程了0xD0020010,下载地址因此就是0xD0020010。
综上所述,使用sd卡作为启动介质时,下载地址为0xD0020010