一个嵌入式工程师对内存映射的若干疑惑
最近 在移植uboot,引发出一个思考,内存映射到底怎么理解,到现在我还没有理解透彻。以6410为例:
S3c6410支持32位地址空间,并且这些空间被分为两部分,一部分作为“存储空间”,另一部分为“外设空间”。其中主存空间经由SPINE总线,地址空间为0x0000 0000 ~ 0x6FFF FFFF。
主存空间被化分为四个区:
1、 启动引导区(0x0000 0000 ~ 0x07FFF FFFF ,并没有实际映射)
一般内部存储区或静态储存区会映射到此处,但注意,起始地址固定为0x0000 0000.
2、 内部存储区
用来访问内部的ROM或者内部的SRAM,以用来存储启动代码,即:steppingstone。
l 每个内部的ROM的起始地址是固定的,0x0800 0000 ~ 0x0BFF FFFF,但实际上只有32KB可用,而且是只读的。当选择以内部ROM启动时,应该把此处区域映射到启动引导区。
l 内部SRAM的地区空间是0x0c00 0000 ~ 0x0FFF FFFF,但实际上只有4KB.
3、 静态存储区(0x1000 0000 ~ 0x3FFF FFFF)
可以用来访问SROM,,SRAM, NOR Flash,asyncronous NOR interface device, OneNAND Flash, and Steppingstone。这六个区域,每个区代表一个片选(即:可接一片存储芯片),例如:0x1000 0000 ~0x1FFF FFFF代表Xm0CSn[0],并且每个区的起始地址是固定的(即:不可通过软件配置)。
l NAND、CF、ATA不能在此区访问,如果Xm0CSn[5:2]任何一个区被配置到NFCON或者CFCON中,这些地址空间都是不能被访问的。
2 一个特例:如果Xm0CSn[2]被用于NAND FLASH,那么steppingstone被映射到0x2000 0000 ~ 0x2FFF FFFF
4、 动态存储区(0x4000 0000 ~ 0x6FFF FFFF)
动态区被为分两部分:
DMC0:0x4000 0000 ~ 0x4FFF FFFF
DMC1:0x5000 0000 ~ 0x6FFF FFFF
该区域的起始地址是可配置的。
外设空间:
外设空间是经由PERI总线来传输数据的,地址空间为0x7000 0000 ~ 0x7FFF FFFF。所有的特殊功能寄存器呵以访问这些地址。
uboot启动是从0x0地址开始的。
所谓的0xC000000前4K空间 是什么意思?
启动引导区不是应该 是0x0000 0000 ~ 0x07FFF FFFF 么?
既然 要把启动代码拷贝到前4K 那跟 0x0 又是怎么联系 的??
还有内存映射到底怎么理解啊? 搞不清楚。
S3C6410都有哪些物理地址空间?
主存空间经由SPINE总线,地址空间为0x0000 0000 ~ 0x6FFF FFFF。
外设空间由PERI总线来传输数据的 地址空间为0x7000 0000 ~ 0x7FFF FFFF。
32位地址线,所访问的4G空间 怎么跟这些实际有的 地址空间对应的?????
哪位前辈有比较容易的理解方法,不如向小弟推荐一下,定当膜拜……
[解决办法]
先弄清楚概念和基本过程。
映射是根据需要来进行的,也可以关闭。一般是有操作系统使用比较复杂。
刚启动,肯定没有映射,根据芯片,有固定的启动地址,然后运行一个引导程序,如uboot。这个程序怎样运行,可以打开映射,然后根据要运行的操作系统的需要个规划,把程序搬到对应位置,此刻可能和操作系统实际运行的有出入,因为操作系统可能也要进行重新配置。 总之最终操作系统开始运行并根据自己需要配置了,就是一般看到的情况了。
一个过程承接一个过程,理顺好了就行了,有些绕
------解决方案--------------------
nandflash的前4K存的 一定是 uboot第一个阶段的代码吗?
99.99%没错,要不什么都起来呢,谁知道应该从哪个位置启动Uboot?
不对,搬移到0x0c00 0000,然后映射过去。
[解决办法]
0x646e6140?是4k吧 不是很熟悉
[解决办法]
2410、2440是4K,6410是8K