地址映射

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

地址映射結構,初始化結構,地址初始化,實現映射,注意,地址映射分類,

地址映射結構

在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_WRITABLE0x0c
#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_NOT0x00
#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. 動態重定位
    在程式運行過程中要訪問數據時再進行地址變換(即在逐條指令執行時完成地址映射。一般為了提高效率,此工作由硬體地址映射機制來完成。由硬體支持,軟體硬體結合完成。硬體上一般需要一對暫存器的支持)。

相關詞條

熱門詞條

聯絡我們