引用 7 楼 powerall888 的回复:
谢谢frankizhong的回复,我原先的内容如下,
;? ? ? ? DCD? ? 0x80000000, 0x30000000, 64? ? ? ; 32 MB DRAM BANK 6
;? ? ? ? DCD? ? 0x84000000, 0x10000000, 32? ? ? ; nGCS2: PCMCIA/PCCARD
;? ? ? ? DCD? ? 0x86000000, 0x18000000, 32? ? ? ; 32 MB SROM(SRAM/ROM) BANK 3
修改后变成如下:
? ? ? ? DCD? ? 0x80000000, 0x30000000, 128? ? ? ; 32 MB DRAM BANK 6? ? ? ?
pcmcia/pccard的驱动我没有使用,因此地址空间没有任何冲突。
另外,我知道stepldr中没有使用oemaddresstable,因此我在stepldr程序中只是对物理地址空间测试,即对0x30000000~0x37ffffff测试,没有问题;
在eboot中有启用mmu,有用到oemaddresstable,但是我在eboot中对虚拟地址0x84000000~0x87ffffff进行测试时,发现读写不正确;对虚拟地址0x80000000~0x83ffffff能够正确读写;
我因此检查了0x30010000地址的一级页表的所有内容,发现全部正确,就是说虚拟地址的和物理地址的映射关系是正确的;
我现在依然没有找到eboot中不能正确访问地址0x84000000~0x87ffffff的原因,高手帮忙啊!
提出一些看法:
1,你两片接的是CS6片选,也就是每片16Mx16的sdram,所以两片结在一起的时候是16Mx32,也就是你所说的64MB。那么初始化SDRAM的时候有没有把数据长度改成32bit的宽度呢。
2,在片选为CS6的的两片SDRAM里面,你的地址范围应该是0x30000000-0x33ffffff吧?那么映射以后也就是0x80000000-0x83ffffff。这样你不能访问0x84000000~0x87ffffff就很正常了。超出范围了!
3,即使你把sdram扩展成128M,但你的地址是不连续的,那个片选为CS7的两片的起始地址应该是0x38000000开始的地址。
上面说的希望会对你有所帮助!