2979|7

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教FirstPT的地址问题 [复制链接]

各位前辈好!想向大家请教一个问题,是这样的:
我在做OAL时,用IAR5.2调试,在startup.s的开头的几行定义如下:
    bl      TT
   
g_oalAddressTable_address   
        ALIGNRAM 2      
        DC32      AT91SAM9261EK_VA_BASE_REG,      AT91SAM9261EK_BASE_REG,     1       //; Internal registers.
        DC32      AT91SAM9261EK_VA_BASE_SRAM,     AT91SAM9261EK_BASE_SRAM,    1       //; INTERNAL SRAM (160KB).
        DC32      AT91SAM9261EK_VA_BASE_SDRAM,    AT91SAM9261EK_BASE_SDRAM,   64      //; AT91SAM9261EK SDRAM (64MB).
        DC32      AT91SAM9261EK_VA_BASE_LCD,      AT91SAM9261EK_BASE_LCD,     1       //; LCD registers.         
        DC32           AT91SAM9261EK_VA_BASE_NOR_NK,   AT91SAM9261EK_BASE_NOR_NK,  64      //;  NOR
        DC32           AT91SAM9261EK_VA_BASE_NOR_bootloader, AT91SAM9261EK_BASE_NOR_bootloader, 1     // ; NOR     
        DC32       0x00000000,                        0x00000000,             0      //; end of table

TT
    LDR r0, =g_oalAddressTable_address
    bl            KernelStart

其中:
#define AT91SAM9261EK_VA_BASE_SDRAM                        0x80000000
#define AT91SAM9261EK_VA_BASE_NOR_bootloader                0x84000000
#define AT91SAM9261EK_BASE_SRAM                                0x00300000
#define AT91SAM9261EK_VA_BASE_REG                        0x9FF00000
#define AT91SAM9261EK_VA_BASE_LCD                        0x9FE00000     //;LCD register
#define AT91SAM9261EK_VA_BASE_SRAM                        0x9E700000
#define AT91SAM9261EK_VA_BASE_NOR_NK                        0x84100000
#define AT91SAM9261EK_BASE_SDRAM                        0x20000000
#define AT91SAM9261EK_BASE_LCD                              0x30000000
#define AT91SAM9261EK_BASE_NOR_NK                        0x40000000
#define AT91SAM9261EK_BASE_NOR_bootloader                0x10000000
#define AT91SAM9261EK_BASE_REG                                0xFFF00000

然后程序就会转到armtrap.s下的KernelStart里,程序如下:
KernelStart:   
        mov     r11, r0                         ; (r11) = &MemoryMap (save pointer)
        
        ; figure out the virtual address of OEMAddressTable
        mov     r1, r11                         ; (r1) = &MemoryMap (2nd argument to VaFromPa)
        
       ;add     r0,  r0 ,#AT91SAM9261EK_BASE_NOR_NK   ;****I ADD THIS line***********
        
        bl      VaFromPa
        mov     r6, r0                          ; (r6) = VA of MemoryMap

        ; convert base of PTs to Physical address
        ldr     r4, =PTs                        ; (r4) = virtual address of FirstPT
        mov     r0, r4                          ; (r0) = virtual address of FirstPT
        mov     r1, r11                         ; (r1) = &MemoryMap (2nd argument to PaFromVa)
        bl      PaFromVa
就是这里的PTs定义如下
; High memory layout:
;       FFFD0000 - first level page table (uncached)
;       FFFD4000 - not used
;       FFFE0000 - disabled for protection
;       FFFF0000 - exception vectors
;       FFFF03E0 - exception vector jump table
;       FFFF0400 - not used (r/o)
;       FFFF1000 - disabled for protection
;       FFFF2000 - r/o (physical overlaps with vectors)
;       FFFF2400 - Interrupt stack (1k)
;       FFFF2800 - r/o (physical overlaps with Abort stack)
;       FFFF3000 - disabled for protection
;       FFFF4000 - r/o (physical memory overlaps with vectors & intr. stack & FIQ stack)
;       FFFF4900 - Abort stack (2k - 256 bytes)
;       FFFF5000 - disabled for protection
;       FFFF6000 - r/o (physical memory overlaps with vectors & intr. stack)
;       FFFF6800 - FIQ stack (256 bytes)
;       FFFF6900 - r/o (physical memory overlaps with Abort stack)
;       FFFF7000 - disabled
;       FFFFC000 - kernel stack
;       FFFFC800 - KDataStruct
;       FFFFCC00 - r/o for protection (2nd level page table for 0xFFF00000)

        ^ 0xFFFD0000
FirstPT         # 0x4000
                # 0x4000
                # 0x8000
                # 0x10000       ; not mapped
ExVector        # 0x1000
                # 0x1400        ; not mapped
                # 0x0400        ; 1K interrupt stack
IntStack        # 0x2000        ; not mapped                    (ffff2800)
                # 0x0100        ; not mapped (FIQ stack)        (ffff4800)
                # 0x0700        ; 2K-256 abort stack            (ffff4900)
AbortStack      # 0x1800        ; not mapped                    (ffff5000)
                # 0x0100        ; not mapped (FIQ stack)        (ffff6800)
FIQStack        # 0xC000-0x6900 ; not mapped                    (ffff6900)
KDBase          # 0x07E0        ; 2K-32 kernel stack
KStack          # 0x0020        ; temporary register save area
KData           # 0x400         ; kernel data area


        ;-----------------------------------------------------------------------
        ; .KDATA area is used to reserve physical memory for the above structures.
        AREA |.KDATA|,DATA,NOINIT
        
        EXPORT  ExceptionVectors
        
KDataArea
PTs     %       0x4000          ; space for first-level page tableExceptionVectors
        %       0x0400          ; space for exception vectors
        %       0x0400          ; space for interrupt stack
        %       0x0100          ; space for FIQ stack
        %       0x0700          ; space for Abort stack
KPage   %       0x0c00          ; space for kernel stack & KDataStruct
HighPT  %       0x0400          ; space for 2nd level page table to map 0xFFF00000
KDEnd   %       0

我不明白的是
1:这个PTs的虚拟地址是否就是0xFFFD0000?如果是的话在接下来的调用PaFromVa后,在我的g_oalAddressTable_address表中是找不到对应的虚拟地址的啊??
2:"add     r0,  r0 ,#AT91SAM9261EK_BASE_NOR_NK "这行是我自己加的,因为我的g_oalAddressTable_address表在上面一行中获的地址为r0=0x2DC,这个在下面调用VaFromPa后还是在我的g_oalAddressTable_address中找不到相应的虚拟地址啊?,为了能找到我就自己加了上面说的一行.

请大家多多指教啊,谢谢!!
  

最新回复

——————对在我的帖子我说清楚了。  详情 回复 发表于 2009-1-4 23:24
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
自己顶啊
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
大家进我的编程与硬件交流群呀72651142
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
郁闷啊,希望songtitan 进来指点一下啊
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 kkkcxf1981 的回复:
郁闷啊,希望songtitan 进来指点一下啊


songtitan 老兄最近不来了
1:这个PTs的虚拟地址是否就是0xFFFD0000?如果是的话在接下来的调用PaFromVa后,在我的g_oalAddressTable_address表中是找不到对应的虚拟地址的啊??
当然不是了。
2:"add    r0,  r0 ,#AT91SAM9261EK_BASE_NOR_NK "这行是我自己加的,因为我的g_oalAddressTable_address表在上面一行中获的地址为r0=0x2DC,这个在下面调用VaFromPa后还是在我的g_oalAddressTable_address中找不到相应的虚拟地址啊?,为了能找到我就自己加了上面说的一行.

——我正在看,这个,看懂了一起交流。这是wince内核初始化的代码啊。


 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
好的,希望到时候我也能学到一点知识
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
1.PTs的虚拟地址是0xFFFD0000,ARM的内存映射有两种方式,0xFFF00000~0xFFFFFFFF使用二级映射,其余VA使用一级映射,g_oalAddressTable配置的是一级映射表,当然找不到。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 navi_dx 的回复:
1.PTs的虚拟地址是0xFFFD0000,ARM的内存映射有两种方式,0xFFF00000~0xFFFFFFFF使用二级映射,其余VA使用一级映射,g_oalAddressTable配置的是一级映射表,当然找不到。


——————对在我的帖子我说清楚了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表