網(wǎng)站的建設(shè)模式專業(yè)推廣引流團(tuán)隊(duì)
虛擬內(nèi)存管理
對(duì)于帶MMU的目標(biāo)板,VxWorks提供虛擬內(nèi)存的支持,VxWorks提供了兩種虛擬內(nèi)存管理單元(MMU)的支持: 基本MMU和VxVMI
基本MMU邦定于VxWorks中,可以通過config.h中宏定義INCLUDE MMU BASIC或Tornado工程配置中包含基本MMU組件
VxVMI是wind River公司推出的一個(gè)可選軟件模塊,實(shí)現(xiàn)了MMU的全部功能
VxWorks中有關(guān)MMU的配置包括以下內(nèi)容INCLUDE MMU BASIC: 基本MMU的支持。
????????INCLUDE MMU FULL: 完整MMU的支持(需要VxVMD
????????INCLUDE PROTECT TEXT: 代碼段寫保護(hù)支持(需要VVMD
????????INCLUDE PROTECT VEC TABLE: 中斷向量表寫保護(hù)支持需要VxVMI
虛擬內(nèi)存幾個(gè)名詞:
- 虛擬地址空間:由程序計(jì)數(shù)器的尋址能力來(lái)決定其大小,如32位的i86虛擬地址空間=4GB
- 物理地址:用于內(nèi)存芯片級(jí)的單元尋址,與處理器連接的地址總線相對(duì)應(yīng)(與地址總線相對(duì)應(yīng) )
- 虛擬地址:虛擬地址空間中的地址,程序中使用的都是虛擬地址
- 內(nèi)存映射:建立虛擬地址與物理地址之間的對(duì)應(yīng)關(guān)系一-處理器中MMU可以完成此功能
基本MMU與VxWorks捆綁在一起,可以指定基于頁(yè)的內(nèi)存區(qū)域?yàn)椴豢删彺?#xff0c;該特性能夠使直接內(nèi)存訪問(DMA)和處理其內(nèi)部通信更為有效、迅速。如當(dāng)其它處理器或DMA設(shè)備訪問同一段地址空間時(shí),可以保證這些數(shù)據(jù)不被緩存。
如果系統(tǒng)不具備這樣的不可緩存特性,那么在訪問這些地址空間時(shí),必須從全局上關(guān)閉高速緩存Cache或者手工清洗緩沖區(qū)(flush)或使緩沖區(qū)無(wú)效(invalidate)。
- 基本MMU使用物理內(nèi)存描述來(lái)建立一種地址映射關(guān)系,這種方式是平面型的,實(shí)地址和虛地址一一對(duì)應(yīng)
- BSP負(fù)責(zé)提供物理內(nèi)存描述的支持:
1:sysLib.c中定義PHYS MEM DESC 結(jié)構(gòu)體類型的數(shù)組sysPhysMemDesc[]。
2:sysPhysMemdesc[]描述了虛擬地址和實(shí)地址之間的對(duì)應(yīng)關(guān)系及內(nèi)存頁(yè)的初始狀態(tài)
3:定義的內(nèi)存區(qū)必須是頁(yè)對(duì)齊的,并且必須跨越完整的頁(yè)
4:頁(yè)面大小VM PAGE SIZE在config.h中定義,一般為4KB或8KB
·PHYS MEM DESC 數(shù)據(jù)結(jié)構(gòu)定義如下( vmLib.h) :
typedef struct phys_mem_desc{void *virtualAddr;void *physicalAddr;UNIT len;UNIT initialStateMask;UNIT initialState;} PHYS MEM DESC;
virtualAddr和physicalAddr通常是相等的.
sysPhysMemDesc [] 中可能包含的映射空間有內(nèi)存、flash、rom、I/O設(shè)備和外部總線地址空間等·
下面是多cpu嵌入式系統(tǒng)中使用共享內(nèi)存網(wǎng)絡(luò)時(shí)各目標(biāo)板的MMU配置示例:
{(void *) 0x4000000,/* virtual address */(void *) 0x4000000,/* physical address */0x20000,/* length *//* initial state mask */VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_CACHEABLE,/* initial state */VM_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE_NOT,……}
虛擬內(nèi)存狀態(tài)標(biāo)志:
VM_STATE_VALIDVM_STATE_VALID_NOTVM_STATE_WRITABLEVM_STATE_WRITABLE_NOTVM_STATE_CACHEABLEVM_STATE_CACHEABLE_NOT
有效性: 有效狀態(tài)指示虛到實(shí)轉(zhuǎn)換是正確的。當(dāng)轉(zhuǎn)換表被初始化時(shí),全局虛內(nèi)存被標(biāo)記為有效的,所有其他虛內(nèi)存被初始化為無(wú)效的.
可寫性:通過設(shè)置狀態(tài)為不可寫,也可以被設(shè)置為只讀。這被VxWorks用于寫保護(hù)所有text段.
可cache: 內(nèi)存頁(yè)的cache可以通過設(shè)置狀態(tài)標(biāo)志為cache被禁止。這對(duì)處理器間共享的內(nèi)存及DMA設(shè)備是有用的.
屏蔽標(biāo)志:描述哪一標(biāo)志可以被改變
VM_STATE_MASK_VALIDVM_STATE_MASK WRITABLEVM_STATE_MASK_CACHEABLE
有兩種方法可以修改虛地址和實(shí)地址之間的映射關(guān)系;
????????靜態(tài)方式:通過修改結(jié)構(gòu)體sysPhyMemDesc的內(nèi)容
????????動(dòng)態(tài)方式:通過調(diào)用vmBaseStateSet函數(shù)來(lái)修改一塊虛擬內(nèi)存空間的狀態(tài)
????????所有可能會(huì)在應(yīng)用程序中被訪問的物理內(nèi)存(包括內(nèi)存映射設(shè)備,比如以太網(wǎng)設(shè)備、PCI設(shè)備、SCSI設(shè)備等) 都應(yīng)該被映射到不同的虛擬內(nèi)存空間.
在MMU使能的情況下,如果某一段物理地址沒有被映射,而試圖對(duì)這樣的地址進(jìn)行些操作時(shí),將會(huì)引起總線錯(cuò)誤.
????????一個(gè)較完整的內(nèi)存映射實(shí)例, 此實(shí)例是一款基于mpc860開發(fā)板的內(nèi)存映射表。這款開發(fā)板上的器件有mpc860, mpc860內(nèi)嵌64K存儲(chǔ)器, 外掛內(nèi)存(SDRAM) 、Boot flash、版本fIash.
PHYS MEM_DESC sysPhysMemDesc [] =
{{(void*)LOCAL_MEM_LOCAL_ADRS,(void*)LOCAL_MEM_LOCAL ADRS,LOCAL_MEM_SIZE, /*SDRAM*/VM_STATE_MASK_VALID | VM_STATE_MASK_ WRITABLE |VM_STATE_MASK_CACHEABLE |VW_STATE_VALID | VM_STATE_WRITABLE | VM_STATE_CACHEABLE},……}