我看SMDK6410里面的那些驱动访问物理地址来读写寄存器,都是用一个函数DrvLib_MapIoSpace()来将手册上寄存器的物理地址转换一下。
在_WIN32_WCE >= 600的时候(我用的就是wince6),函数如下,那些驱动在用这个时第三个参数基本都是false:
- void *DrvLib_MapIoSpace(UINT32 PhysicalAddress, UINT32 NumberOfBytes, BOOL CacheEnable)
- {
- UINT32 MappedAddr = 0;
- int index = 0;
- DRVLIB_MSG((_T("[DRVLIB] ++DrvLib_MapIoSpace(0x%08x, 0x%08x, %d)\n\r"), PhysicalAddress, NumberOfBytes, CacheEnable));
- while(g_oalAddressTable[index][2]) // Find to end of table
- {
- if ( (PhysicalAddress >= g_oalAddressTable[index][1])
- && (PhysicalAddress < ( g_oalAddressTable[index][1]+0x100000*g_oalAddressTable[index][2]) ))
- {
- // Matched Address Found
- MappedAddr = g_oalAddressTable[index][0] +(PhysicalAddress - g_oalAddressTable[index][1]);
- if (!CacheEnable)
- {
- MappedAddr += 0x20000000; // Offset to Uncached Area
- }
- break;
- }
- index++; // Find Next
- }
- if (MappedAddr)
- {
- DRVLIB_MSG((_T("[DRVLIB] --DrvLib_MapIoSpace() = 0x%08x\n\r"), MappedAddr));
- return (void *)MappedAddr;
- }
- else
- {
- DRVLIB_ERR((_T("[DRVLIB:ERR] --DrvLib_MapIoSpace() = NULL\n\r")));
- return NULL;
- }
- }
而表g_oalAddressTable[][3]是这么一个:
DCD 0x80000000, 0x50000000, 128 ; 128 MB DRAM
DCD 0x90000000, 0x70000000, 4 ; SROM SFR
DCD 0x90400000, 0x71000000, 4 ; TZIC0
DCD 0x90800000, 0x72000000, 1 ; FIMG-3DSE SFR
DCD 0x90A00000, 0x74000000, 2 ; Indirect Host I/F
DCD 0x90C00000, 0x74300000, 2 ; USB Host
DCD 0x90E00000, 0x75000000, 2 ; DMA0
DCD 0x91000000, 0x76100000, 3 ; 2D Graphics
DCD 0x91300000, 0x77000000, 3 ; Post Processor
DCD 0x91600000, 0x78000000, 1 ; Camera I/F
DCD 0x91700000, 0x78800000, 1 ; JPEG
DCD 0x91800000, 0x7C000000, 5 ; USB OTG LINK
DCD 0x91D00000, 0x7D000000, 13 ; D&I(Security Subsystem Config) SFR
DCD 0x92A00000, 0x7E000000, 1 ; DMC, MFC, WDT, RTC, HSI TX/RX, Keypad, ADC, SYSCON
DCD 0x92B00000, 0x7F000000, 1 ; TZPC, AC97, I2S, I2C, UART, PWM, IrDA, GPIO, PCM, SPI
DCD 0x93000000, 0x00000000, 16 ; 32 MB SROM(SRAM/ROM) BANK 0
DCD 0x94000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1 = DM9000A
DCD 0x00000000, 0x00000000, 0 ; end of table
那么经过这样的转换得到的就是所谓程序可以使用的虚拟地址么?
如果是这样,那我在程序里面也按照这种方法直接给一个指针赋值,不就可以肆意访问物理地址了么?比如:
我想访问0x50001000,那么就按照这个表,在程序里给一个指针赋值成0xA0001000,然后使用它。
姑且不讨论什么安全不安全,按这样做就能访问到指定的物理地址了吗?(感觉这个转换好简单……)
这种转换的意义又何在呢?