1、RVDS编译选项中的RO base、RW base、entry point有何作用?
ARM镜像文件分为RO(只读)、RW(读写)和ZI(零初始化)三个部分。这三个部分的地址又分为两种,加载时地址和运行时地址。编译选项中的RO、RW确定了映像文件由flash加载到内存中各部分的起始地址,即运行时地址。对于s3c6410而言,在镜像文件小于8KB时,没有设置这些地址的必要。但是当镜像文件大于8KB时,就需要分配各部分的地址。entry point指定了镜像文件的入口点的地址。每个镜像文件都有且只有一个入口点,通常都是将该入口点设置为0。
2、RVDS中如何设置堆栈?
这个问题还没有搞懂。在测试流水灯的程序中,通过汇编调用C之前没有设置堆栈,代码也能正常运行,猜测是编译器自己设置了堆栈。但总不能让编译器随便设置堆栈的地址吧?今后找个机会搞懂。
3、6410启动时为什么会把nand flash中的前8K复制到内存中?
在6410手册的第8章NFCON中,开头就介绍了这么两句“The 6410 is equipped with an internal SRAM buffer called ‘Steppingstone’. Generally, the boot code will copy NAND flash content to SDRAM.”这个steppingstone就是6410的内置SRAM,大小为8KB。这就是为什么在韦东山的视频里我们可以看到将SP指向8KB地址的原因。在镜像文件小于8KB的情况下,可以完全不用考虑RO、RW的运行时地址的设置;而在镜像文件大于8KB的情况下,需要将RO、RW等进行一定的设置,而在开始的8KB代码中只进行必要的初始化操作,之后跳转到指定的地址执行。
4、6410启动时为什么要将外设地址告诉CPU?
在韦东山的视频里我们看到硬件初始化的两个操作。一个将外设的基地址告诉CPU,一个是关看门狗定时器。关看门狗定时器在6410手册的34章watch dog中,提到看门狗定时器的复位使能默认为1,即上电后自动复位。因此我们需要将其置为0。这个很容易理解。但是为什么要将外设的基地址告诉CPU?因为arm11将memory和Peripheral分开,如果不告诉CPU外设的基地址,则CPU会将外设当作memory来访问,这必然是不正确的。
5、下载代码时为何要下载到0x50008000这个地址?
这个问题猜测是因为uboot占用了0x50000000到0x50007FFF这段地址,具体原因还不清楚。等研究了uboot之后再弄明白。