shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
阅读:1443回复:10

WINCE下MMU地址映射问题

楼主#
更多 发布于:2007-11-23 14:48
目前在做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之后   虚拟地址和物理地址关系不对造成的     我应该怎么修改呢,能不能给个思路啊??
shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-11-23 18:21
补充一下:
刚才又试了一下 我在程序中加了一个闪灯程序 就在mcr p15,  0,  r1,  c1,  c0,  0 这句之后,地址都是映射之后的虚拟地址,灯可以闪,  那现在就是b main 这个跳转的地址不对吧,应该怎么改呢??   还有一个问题就是我发现灯是可以闪 但是怎么闪个不停啊??我程序里只是让它闪20次就可以了,但是他不停的闪........
我的程序结构是这样的 在ads下编写4k的boot程序 放到norflash的0地址处, 上电自动运行这段程序,之后从norflash中读第二段代码(64k大小,就是我上面出问题的代码)到0x30000000 执行
shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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
fishly_0
驱动小牛
驱动小牛
  • 注册日期2005-09-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望466点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-11-24 10:38
我以前startup.s里面,就是一个延时都过不去,也不知道为什么.  
感觉你这里不应该加一个亮灯的语句, 注释不是写着: make sure no stall on "mov pc,r0" below, 可能是这些语句要连续的执行,不允许暂停.
我也不懂,随便说说的^_^
shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-11-25 19:56
谢谢 就是因为从汇编跳不到C函数这里我才加了一个闪灯程序的,  都快晕死了
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-11-25 20:49
你这个MMU页表不全,得建立0-0XFFFFFFFF所有地址的映射关系,
(没有物理地址对映的也得填上,得占位置)
然后算好跳转时物理到虚拟的映射关系就行了.
学海无涯
shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-11-26 08:58
谢谢 microsun  0-0XFFFFFFFF是指的是虚拟地址吧?? 为什么要全部映射呢??我有点想不通 我在帮助手册上没有找到这部分说明
还有算好跳转时物理到虚拟的映射关系是怎么算的呢?? 我觉得应该是编译器来处理的吧,我自己还真不会算....
fishly_0
驱动小牛
驱动小牛
  • 注册日期2005-09-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望466点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-11-26 09:31
帮你顶一下,等版主的解答
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
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就是这样定的.
学海无涯
shiqx429
驱动牛犊
驱动牛犊
  • 注册日期2006-04-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分472分
  • 威望57点
  • 贡献值0点
  • 好评度55点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-11-27 09:13
非常感谢,我还是先看看书去 :-)
SenaKen
驱动牛犊
驱动牛犊
  • 注册日期2007-12-19
  • 最后登录2007-12-20
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
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...^_^..
游客

返回顶部