阅读:1443回复:10
WINCE下MMU地址映射问题
目前在做bootloader 在汇编中要对mmu设置虚拟地址和物理地址的映射关系 我在OEMAddressTable是这样的
DCD 0x80000000, 0x33E00000, 2 ; 64 MB DRAM BANK 6 DCD 0x8C000000, 0x30000000, 62 ; 64 MB DRAM BANK 6 DCD 0x84000000, 0x10000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 2 - XD DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3 - NAND DCD 0x88000000, 0x20000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 4 - SRAM or ATA DCD 0x8A000000, 0x28000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 5 - Ethernet DCD 0x90800000, 0x48000000, 1 ; SDRAM control register DCD 0x90900000, 0x49000000, 1 ; USB Host register DCD 0x90A00000, 0x4A000000, 1 ; Interrupt Control register DCD 0x90B00000, 0x4B000000, 1 ; DMA control register DCD 0x90C00000, 0x4C000000, 1 ; Clock & Power register DCD 0x90D00000, 0x4D000000, 1 ; LCD control register DCD 0x90E00000, 0x4E000000, 1 ; NAND flash control register DCD 0x90F00000, 0x4F000000, 1 ; SSMC control DCD 0x91000000, 0x50000000, 1 ; UART control register DCD 0x91100000, 0x51000000, 1 ; PWM timer register DCD 0x91200000, 0x52000000, 1 ; USB device register DCD 0x91300000, 0x53000000, 1 ; Watchdog Timer register DCD 0x91400000, 0x54000000, 1 ; IIC control register DCD 0x91500000, 0x55000000, 1 ; IIS control register DCD 0x91600000, 0x56000000, 1 ; I/O Port register DCD 0x91700000, 0x57000000, 1 ; RTC control register DCD 0x91800000, 0x58000000, 1 ; A/D convert register DCD 0x91900000, 0x59000000, 1 ; SPI register DCD 0x91A00000, 0x5A000000, 1 ; SD Interface register DCD 0x91B00000, 0x48800000, 1 ; Extrenal Bus Interface DCD 0x91C00000, 0x4D800000, 1 ; Camera control register DCD 0x91D00000, 0x4B800000, 1 ; ATAPI control register DCD 0x92000000, 0x00000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 0 DCD 0x00000000, 0x00000000, 0 ; end of table 当汇编走到 mrc p15,0,r1,c1,c0,0 orr r1, r1, #0x0071 ; Enable: MMU orr r1, r1, #0x0004 ; Enable the cache ldr r0, =VirtualStart cmp r0, #0 ; make sure no stall on "mov pc,r0" below mcr p15, 0, r1, c1, c0, 0 ;;;;;;;这里程序就飞掉了 mov pc, r0 ; & jump to new virtual address nop ;------------------------------------------------ ; MMU & caches now enabled. ; (r10) = physcial address of 1st level page table VirtualStart ldr sp, =0x8F020000 b main 我知道原因应该是在开启MMU之后 虚拟地址和物理地址关系不对造成的 我应该怎么修改呢,能不能给个思路啊?? |
|
沙发#
发布于:2007-11-23 18:21
补充一下:
刚才又试了一下 我在程序中加了一个闪灯程序 就在mcr p15, 0, r1, c1, c0, 0 这句之后,地址都是映射之后的虚拟地址,灯可以闪, 那现在就是b main 这个跳转的地址不对吧,应该怎么改呢?? 还有一个问题就是我发现灯是可以闪 但是怎么闪个不停啊??我程序里只是让它闪20次就可以了,但是他不停的闪........ 我的程序结构是这样的 在ads下编写4k的boot程序 放到norflash的0地址处, 上电自动运行这段程序,之后从norflash中读第二段代码(64k大小,就是我上面出问题的代码)到0x30000000 执行 |
|
板凳#
发布于:2007-11-23 18:47
在补充一下:
现在闪灯不是闪个不停了,刚才可能是我搞错了,目前情况是这样 ldr r0, =VirtualStart cmp r0, #0 ; make sure no stall on "mov pc,r0" below mcr p15, 0, r1, c1, c0, 0;;;;使能MMU bl LED_DISPLAY1;;;;灯闪正常 mov pc, r0;;;;;;;估计就是这里不对,跳转地址有问题 ; & jump to new virtual address nop ;------------------------------------------------ ; MMU & caches now enabled. ; (r10) = physcial address of 1st level page table VirtualStart ldr sp, =0x8F020000 b main |
|
地板#
发布于:2007-11-24 10:38
我以前startup.s里面,就是一个延时都过不去,也不知道为什么.
感觉你这里不应该加一个亮灯的语句, 注释不是写着: make sure no stall on "mov pc,r0" below, 可能是这些语句要连续的执行,不允许暂停. 我也不懂,随便说说的^_^ |
|
地下室#
发布于:2007-11-25 19:56
谢谢 就是因为从汇编跳不到C函数这里我才加了一个闪灯程序的, 都快晕死了
|
|
5楼#
发布于:2007-11-25 20:49
你这个MMU页表不全,得建立0-0XFFFFFFFF所有地址的映射关系,
(没有物理地址对映的也得填上,得占位置) 然后算好跳转时物理到虚拟的映射关系就行了. |
|
|
6楼#
发布于:2007-11-26 08:58
谢谢 microsun 0-0XFFFFFFFF是指的是虚拟地址吧?? 为什么要全部映射呢??我有点想不通 我在帮助手册上没有找到这部分说明
还有算好跳转时物理到虚拟的映射关系是怎么算的呢?? 我觉得应该是编译器来处理的吧,我自己还真不会算.... |
|
7楼#
发布于:2007-11-26 09:31
帮你顶一下,等版主的解答
|
|
8楼#
发布于:2007-11-26 20:45
你找本讲ARM的书看一下就知道了,
但考虑一级页表的情况,如页表的起始地址为:p,则: p+0为虚拟地址0对应的物理地址, p+4为虚拟地址0+1M对应的物理地址, p+8为虚拟地址0+2M对应的物理地址, 这样一直排到0XFFFFFFFF. 总共需要2G/1M=4K大的物理空间来存放这个表,如果还有二级页表就得更大的空间. ARM的MMU就是这样定的. |
|
|
9楼#
发布于:2007-11-27 09:13
非常感谢,我还是先看看书去 :-)
|
|
10楼#
发布于:2007-12-19 18:17
Dear shiqx429 :
Did you fix this problem in the bootloader? Because I got the same problem and block in "mov pc, r0" for a long time...>"<... If you fixed this problem, can you tell me how to fix it? Thank You very much...^_^.. |
|