OEMAddressTable 内存映射表是怎么被wince使用的(作者:wogoyixikexie@gliet)

作者:wogoyixikexie@gliet

  1. ;------------------------------------------------------------------------------
  2. ;
  3. ;  File:  memory_cfg.inc
  4. ;
  5. ;  This file is used to define g_oalAddressTable. This table is passed to
  6. ;  KernelStart to estabilish physical to virtual memory mapping. This table
  7. ;  is used also in IOMEM OAL module to map between physical and virtual
  8. ;  memory addresses via OALPAtoVA/OALVAtoPA functions.
  9. ;
  10. ;------------------------------------------------------------------------------
  11. ; Export Definition
  12.         EXPORT  g_oalAddressTable[DATA]
  13. ;------------------------------------------------------------------------------
  14. ;
  15. ; TABLE FORMAT
  16. ;       cached address, physical address, size
  17. ;------------------------------------------------------------------------------
  18. g_oalAddressTable
  19.         DCD     0x80000000, 0x30000000, 64      ; 32 MB DRAM BANK 6
  20.         DCD     0x84000000, 0x10000000, 32      ; nGCS2: PCMCIA/PCCARD
  21.         DCD     0x86000000, 0x18000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 3
  22.         DCD     0x88000000, 0x20000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 4
  23.         DCD     0x8A000000, 0x28000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 5
  24.         DCD     0x8C000000, 0x08000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 1
  25.         DCD     0x90800000, 0x48000000,  1      ; Memory control register
  26.         DCD     0x90900000, 0x49000000,  1      ; USB Host register
  27.         DCD     0x90A00000, 0x4A000000,  1      ; Interrupt Control register
  28.         DCD     0x90B00000, 0x4B000000,  1      ; DMA control register
  29.         DCD     0x90C00000, 0x4C000000,  1      ; Clock & Power register
  30.         DCD     0x90D00000, 0x4D000000,  1      ; LCD control register
  31.         DCD     0x90E00000, 0x4E000000,  1      ; NAND flash control register
  32.         DCD     0x90F00000, 0x4F000000,  1      ; Camera control register
  33.         DCD     0x91000000, 0x50000000,  1      ; UART control register
  34.         DCD     0x91100000, 0x51000000,  1      ; PWM timer register
  35.         DCD     0x91200000, 0x52000000,  1      ; USB device register
  36.         DCD     0x91300000, 0x53000000,  1      ; Watchdog Timer register
  37.         DCD     0x91400000, 0x54000000,  1      ; IIC control register
  38.         DCD     0x91500000, 0x55000000,  1      ; IIS control register
  39.         DCD     0x91600000, 0x56000000,  1      ; I/O Port register
  40.         DCD     0x91700000, 0x57000000,  1      ; RTC control register
  41.         DCD     0x91800000, 0x58000000,  1      ; A/D convert register
  42.         DCD     0x91900000, 0x59000000,  1      ; SPI register
  43.         DCD     0x91A00000, 0x5A000000,  1      ; SD Interface register
  44.         DCD     0x92000000, 0x00000000, 32      ; 32 MB SROM(SRAM/ROM) BANK 0
  45.         DCD     0x00000000, 0x00000000,  0      ; end of table
  46. ;------------------------------------------------------------------------------
  47.         END

以前,一直不知道这个表是怎么回事,刚才偶然的机会,看见了调用他的函数

C:/WINCE500/PLATFORM/COMMON/SRC/ARM/COMMON/MEMORY/memory.c

  1. //------------------------------------------------------------------------------
  2. //
  3. //  File:  memory.c
  4. //  从这个代码看出ARM虚拟内存和物理内存的关系
  5. //  Memory interface routines.
  6. //
  7. #include <windows.h>
  8. #include <oal_log.h>
  9. #include <oal_memory.h>
  10. typedef struct {
  11.     UINT32  CA;                         // cached virtual address
  12.     UINT32  PA;                         // physical address
  13.     UINT32  size;                       // size, in MB bytes
  14. } OAL_ADDRESS_TABLE, *POAL_ADDRESS_TABLE;
  15. //------------------------------------------------------------------------------
  16. //------------------------------------------------------------------------------
  17. //
  18. //  Function:  OALPAtoVA
  19. //
  20. //  Converts a physical address (PA) to a virtual address (VA). This routine
  21. //  uses the OEMAddressTable defined in the platform.
  22. //
  23. VOID* OALPAtoVA(UINT32 pa, BOOL cached)
  24. {
  25.     OAL_ADDRESS_TABLE *pTable = g_oalAddressTable;
  26.     VOID *va = NULL;
  27.     OALMSG(OAL_MEMORY&&OAL_FUNC, (L"+OALPAtoVA(0x%x, %d)/r/n", pa, cached));
  28.     // Search the table for address range
  29.     while (pTable->size != 0) {
  30.         if (
  31.             pa >= pTable->PA && 
  32.             pa <= (pTable->PA + (pTable->size << 20) - 1)
  33.         ) break;            // match found 找到表中相近的内存
  34.         pTable++;
  35.     }
  36.     // If address table entry is valid compute the VA
  37.     if (pTable->size != 0) {
  38.         va = (VOID *)(pTable->CA + (pa - pTable->PA));
  39.         // If VA is uncached, set the uncached bit
  40.         if (!cached) (UINT32)va |= OAL_MEMORY_CACHE_BIT;
  41.     }
  42.     // Indicate the virtual address
  43.     OALMSG(OAL_MEMORY&&OAL_FUNC, (L"-OALPAtoVA(va = 0x%08x)/r/n", va));
  44.     return va;
  45. }
  46. //------------------------------------------------------------------------------
  47. //
  48. //  Function:  OALVAtoPA
  49. //
  50. //  Converts a virtual address (VA) to a physical address (PA). This routine
  51. //  uses the OEMAddressTable defined in the platform.
  52. //
  53. UINT32 OALVAtoPA(VOID *pVA)
  54. {
  55.     OAL_ADDRESS_TABLE *pTable = g_oalAddressTable;
  56.     UINT32 va = (UINT32)pVA;
  57.     UINT32 pa = 0;
  58.     OALMSG(OAL_MEMORY&&OAL_FUNC, (L"+OALVAtoPA(0x%08x)/r/n", pVA));
  59.     // Virtual address must be in CACHED or UNCACHED regions.虚拟内存范围
  60.     if (va < 0x80000000 || va >= 0xC0000000) {
  61.         OALMSG(OAL_ERROR, (
  62.             L"ERROR:OALVAtoPA: invalid virtual address 0x%08x/r/n", pVA
  63.         ));
  64.         goto cleanUp;
  65.     }
  66.     // Address must be cached, as entries in OEMAddressTable are cached address.
  67.     va = va&~OAL_MEMORY_CACHE_BIT;
  68.     // Search the table for address range
  69.     while (pTable->size != 0) {
  70.         if (va >= pTable->CA && va <= pTable->CA + (pTable->size << 20) - 1) {
  71.             break;
  72.         }
  73.         pTable++;
  74.     }
  75.     // If address table entry is valid compute the PA
  76.     if (pTable->size != 0) pa = pTable->PA + va - pTable->CA;
  77. cleanUp:
  78.     // Indicate physical address 
  79.     OALMSG(OAL_MEMORY&&OAL_FUNC, (L"-OALVAtoPA(pa = 0x%x)/r/n", pa));
  80.     return pa;
  81. }
  82. //------------------------------------------------------------------------------
  83. //从这两个函数可以看出,这个表只是为了容易修改而已,其实手动访问虚拟内存也是可
  84. //的。至于访问GPIO 的那种访问留到有机会再说了。good luck 今天收获不小。

 

转载请标明:作者wogoyixikexie@gliet.桂林电子科技大学一系科协。如有错误,希望能够留言指出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值