一步一步写嵌入式操作系统--与内存起始地址相关的问题
最近在看这本书,书中提到的与内存起始地址相关的几个地方,我没搞明白,请教一下:
page 20提到:"ARM体系统结构中,程序必须从内存零地址开始运行",
同时,里面对skyeye的配置为:
cpu:arm920t
mach:s3c2410x
mem_bank:map=m,type=rw,address=0x00000000, size=0x00800000,file="helloworld.bin"
但是page 53说,根据2410的芯片手册,外部sdram可以接在起始地址为:0x30000000,
同时,里面对skyeye的配置为:
cpu:arm920t
mach:s3c2410x
mem_bank:map=m,type=rw,address=0x30000000, size=0x00800000,file="leeos.bin"
我不明白:
1:相同的cpu,为什么前者配置address=0x00000000,后者配置为:0x30000000 ?
2:为什么后者不配置成address=0x00000000,不是必须从内存零地址开始运行吗?
分很少,我没多少分,求教了。
[解决办法]
楼主,我没看过你说的那本书,根据自己的理解说一下,如果有误请谅解。
“但是page 53说,根据2410的芯片手册,外部sdram可以接在起始地址为:0x30000000。”
楼主可以去实际看一下S3C2410的芯片手册,在S3C2410的内部有有一个内存控制器。
该内存控制器一共有8个Bank,每个Bank有128MB的物理地址空间。
其中Bank0 - Bank5只支持ROM存储类型,而只有Bank6和Bank7同时支持RAM和ROM存储类型。
所以对于S3C2410来说,SDRAM必须要接在Bank6和Bank7上。
Bank6和Bank7上接的RAM内存的容量大小可以是2MB/4MB/8MB/16MB/32MB/64/MB/128MB
但是这两个Bank的存储容量必须大小相等。
Bank6的物理地址空间是0x30000000 - 0x37ffffff
Bank7的物理地址空间是0x38000000 - 0x3fffffff
这就是为什么你那本书说道:“根据2410的芯片手册,外部sdram可以接在起始地址为:0x30000000。”
“page 20提到:"ARM体系统结构中,程序必须从内存零地址开始运行",”
对于这句话,我觉得作者说的不是十分准确(我自己的理解)。嵌入式操作系统在启动的时候,
是从0物理地址开始执行程序,但是处于0x00000000物理地址的并不一定是RAM。也有可能是NorFlash。
因为NorFlash也是线性存储设备,可以随机访问。
不知道楼主了解不了解微软的Windows CE嵌入式系统,它里面有一个模拟器,是基于一个微软设想的虚拟硬件来开发的。叫做DeviceEmulator。在这个虚拟的硬件板上,就是以S3C2410为CPU的。
在这个电路板上,在0物理地址上就是接的NorFlash存储器,那么板子一上电,程序就会从0物理地址,
也就是NorFlash上开始执行。这个貌似叫做程序的XIP执行方式。所以说书中作者说道必须从“内存零地址开始执行”,我觉得会误导读者。
如果楼主仔细看S3C2410手册,会发现这颗CPU,还有一种启动方式叫做“阶石”技术。就是说在使用NandFlash作为启动ROM的时候,在物理地址的最低4KB,是一块叫做Boot intermal的SRAM,只有4KB大小,是用来引导启动程序的。不过这4KB大小的SRAM可不是Bank6/7上接的那块SDRAM。
[解决办法]