地址映射

計算機術語之一

地址映射是為了保證CPU執行指令時可正確訪問存儲單元,需將用戶程序中的邏輯地址轉換為運行時由機器直接定址的物理地址。

結構介紹


物理地址與虛擬地址的映射
物理地址與虛擬地址的映射
Tornado\target\h\vmLib.h文件中
typedef struct phys_mem_desc
{
void *virtualAddr;
void *physicalAddr;
UINT len;
UINT initialStateMask; 
UINT initialState; 
} PHYS_MEM_DESC;
virtualAddr:你要映射的虛擬地址
physicalAddr:硬體設計時定義的實際物理地址
len;要進行映射的地址長度
initialStateMask:可以初始化的地址狀態:
有如下狀態:
#define VM_STATE_MASK_VALID 0x03
#define VM_STATE_MASK_WRITABLE 0x0c
#define VM_STATE_MASK_CACHEABLE 0x30
#define VM_STATE_MASK_MEM_COHERENCY 0x40
#define VM_STATE_MASK_GUARDED 0x80
不同的CPU晶元類型還有其特殊狀態
initialState:實際初始化的地址狀態:
有如下狀態:
#define VM_STATE_VALID 0x01
#define VM_STATE_VALID_NOT 0x00
#define VM_STATE_WRITABLE 0x04
#define VM_STATE_WRITABLE_NOT 0x00
#define VM_STATE_CACHEABLE 0x10
#define VM_STATE_CACHEABLE_NOT 0x00
同樣不同的CPU晶元類型還有其特殊狀態

初始化結構


在 Tornado\target\config\ads860\sysLib.c 文件中:
PHYS_MEM_DESC sysPhysMemDesc [] =
{
{
(void *) LOCAL_MEM_LOCAL_ADRS,
(void *) LOCAL_MEM_LOCAL_ADRS,
LOCAL_MEM_SIZE ,
VM_STATE_MASK_VALID|VM_STATE_MASK_WRITABLE |
VM_STATE_MASK_CACHEABLE,
VM_STATE_VALID | VM_STATE_WRITABLE|VM_STATE_CACHEABLE
},
{
(void *) BCSR0,
(void *) BCSR0,
0x00001000, 
VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE |
VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_GUARDED,
VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT |
VM_STATE_GUARDED
},
……
{
(void *) INTERNAL_MEM_MAP_ADDR,
(void *) INTERNAL_MEM_MAP_ADDR,
INTERNAL_MEM_MAP_SIZE, 
VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE |
VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_GUARDED,
VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT |
VM_STATE_GUARDED
},
{
(void *) ROM_BASE_ADRS,
(void *) ROM_BASE_ADRS,
ROM_SIZE, 
VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE |
VM_STATE_MASK_CACHEABLE ,
VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT
}
};
上面結構中是預設地址映射。

地址初始化

在Tornado\target\src\config\ usrMmuInit.c 文件中
通過函數usrMmuInit使地址映射生效

實現映射

如你定義flash地址為0x04000000開始的8Mbyte地址,則可以如下進行地址映射
{
(void *) 0x04000000,
(void *) 0x04000000,
0x00800000, 
VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE,
VM_STATE_VALID | VM_STATE_WRITABLE
},

注意

地址映射最小單位為1頁,4K大小,所以len值最小為:0x00001000。

分類介紹

地址映射也可以成為地址重定位或地址變換,可以分為以下兩類:
靜態重定位
當用戶程序被裝入內存時,一次性實現邏輯地址到物理地址的轉換,以後不再轉換(一般在裝入內存時由軟體完成)。
在程序運行過程中要訪問數據時再進行地址變換(即在逐條指令執行時完成地址映射。一般為了提高效率,此工作由硬體地址映射機制來完成。由硬體支持,軟體硬體結合完成。硬體上一般需要一對寄存器的支持)。