地址映射檢視原始碼討論檢視歷史
地址映射是計算機科學術語。為了保證CPU執行指令時可正確訪問存儲單元,需將用戶程序中的邏輯地址轉換為運行時由機器直接尋址的物理地址,這一過程稱為地址映射。[1][2]
地址映射結構
在Tornado\target\h\vmLib.h文件中
typedef struct phys_mem_desc
{
void *virtualAddr;
void *physicalAddr;
UINT len;
UINT initialStateMask; /* mask parameter to vmStateSet */
UINT initialState; /* state parameter to vmStateSet */
} 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, /* 4 k - Board Control and Status */
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, /* 64 k - Internal Memory Map */
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, /* Flach memory */
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, /* 8 m - Flash window 1 */
VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE,
VM_STATE_VALID | VM_STATE_WRITABLE
},
注意
地址映射最小單位為1頁,4K大小,所以len值最小為:0x00001000。
地址映射分類
地址映射也可以成為地址重定位或地址變換,可以分為以下兩類:
1.靜態重定位當用戶程序被裝入內存時,一次性實現邏輯地址到物理地址的轉換,以後不再轉換(一般在裝入內存時由軟件完成)。
2.動態重定位在程序運行過程中要訪問數據時再進行地址變換(即在逐條指令執行時完成地址映射。一般為了提高效率,此工作由硬件地址映射機制來完成。由硬件支持,軟件硬件結合完成。硬件上一般需要一對寄存器的支持)。
參考文獻
- ↑ 計算機等級考試信息安全(1)網絡安全工程師考試
- ↑ 計算機四級網絡工程師(操作系統多選)- 知識點_計算機四級...CSDN博客