目錄
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),尚義企業(yè)網(wǎng)站建設(shè),尚義品牌網(wǎng)站建設(shè),網(wǎng)站定制,尚義網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,尚義網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。物理內(nèi)存管理帶來(lái)的問(wèn)題
直接映射
一級(jí)頁(yè)表
二級(jí)頁(yè)表
參考:
物理內(nèi)存管理帶來(lái)的問(wèn)題(C語(yǔ)言內(nèi)存七)分頁(yè)機(jī)制究竟是如何實(shí)現(xiàn)的? - Smah - 博客園
直接映射
- 比如4GB的flash, 如果應(yīng)用程序可直接訪問(wèn)物理內(nèi)存,那么可能一個(gè)非法的操作會(huì)導(dǎo)致程序無(wú)法正常工作,常見(jiàn)于跑裸機(jī)的單片機(jī)程序。
- 而操作系統(tǒng)為了保護(hù)程序可正常運(yùn)行,引入了虛擬內(nèi)存的概念,換句話說(shuō):對(duì)應(yīng)用程序來(lái)講:操作的內(nèi)存是虛擬內(nèi)存。
- 而操作系統(tǒng)做的事情就是把虛擬內(nèi)存映射到物理內(nèi)存。那么如何映射就是需要設(shè)計(jì)的關(guān)鍵。即物理地址 = func_map(虛擬內(nèi)存); 這個(gè)func_map就叫頁(yè)表,以下有常見(jiàn)的現(xiàn)有的設(shè)計(jì)實(shí)現(xiàn)
一級(jí)頁(yè)表
- 頁(yè)表方案:比如一個(gè)4GB的flash,那么需要2^32個(gè)地址去訪問(wèn),而地址從0-2^32,這么大的數(shù)需要4字節(jié)的數(shù)據(jù)去存,也就是需要 uint64 flash[2^32];?
- 內(nèi)存開銷:這樣的數(shù)組去訪問(wèn)每個(gè)物理地址。這樣的數(shù)組有多大呢? 4*4GB = 16GB, 就是說(shuō)訪問(wèn)4GB的flash需要16GB的內(nèi)存,這肯定是不可以的。
這一樣的實(shí)現(xiàn)是 physical_addr = flash[virtual_addr];
二級(jí)頁(yè)表
- 頁(yè)表方案:
- 為了減少內(nèi)存開銷,有了分頁(yè)機(jī)制:把4GB的flash,分為一頁(yè)4K。
- 如果需要訪問(wèn)flash的物理地址,需要頁(yè)數(shù)+頁(yè)內(nèi)偏移。
- 一頁(yè)大小為4K,需要訪問(wèn)所有內(nèi)存,即0-2^12,即至少12位來(lái)得到偏移量
- 而訪問(wèn)所有的頁(yè)數(shù):4GB/4K = 2^32/ 2^12 = 2^20頁(yè),故需要20位來(lái)訪問(wèn)所有的頁(yè)
- 綜上:可設(shè)計(jì)虛擬地址的31-12位得到頁(yè)表數(shù),11-0得到頁(yè)內(nèi)的偏移。
這樣的實(shí)現(xiàn)通過(guò)虛擬地址訪問(wèn)物理地址的偽代碼如下:
#define PAGE_SIZE 2^12 // 4K大小的頁(yè) //通過(guò)傳入的virtual_addr訪問(wèn)物理地址 uint32 Func_map(uint32 virtual_addr) { // 得到高20位 uint32 page_Number = virtual_addr & 0xfffff000; // 得到低12位 uint32 ofst= virtual_addr & 0x00000fff; // 得到頁(yè)表位置 uint32 phy_page = page_Number * PAGE_SIZE; // 返回頁(yè)表內(nèi)存+偏移得到具體的物理位置 return phy_page + ofst; }
- 頁(yè)表的開銷:一個(gè)虛擬地址為4字節(jié),共需要4GB/4K = 2^32/ 2^12 = 2^20個(gè)虛擬地址,一共占4*2^20字節(jié)== 4M,即維護(hù)一級(jí)頁(yè)表:可訪問(wèn)4G的物理內(nèi)存,開銷為4M
前人又設(shè)計(jì)了二級(jí)頁(yè)表實(shí)現(xiàn):
- 將虛擬地址分割為三分部,高10位作為頁(yè)目錄中元素的下標(biāo),中間10位作為頁(yè)表中元素的下標(biāo),最后12位作為頁(yè)內(nèi)偏移
- 其中通過(guò)頁(yè)表下標(biāo)和頁(yè)內(nèi)偏移得到物理內(nèi)存地址和一級(jí)頁(yè)表的方法是一樣的。
- 一級(jí)頁(yè)表可知:4M的頁(yè)表開銷,并不需要完全使用(物理內(nèi)存用不到4G)。而二級(jí)頁(yè)表就是通過(guò)頁(yè)目錄來(lái)管理。需要使用物理內(nèi)存,則通過(guò)頁(yè)目錄記錄下頁(yè)表,通過(guò)頁(yè)表訪問(wèn)一段內(nèi)存。
- 頁(yè)表需要4M來(lái)感知4G的物理內(nèi)存,而頁(yè)目錄需4K+ 頁(yè)目錄4M--》可訪問(wèn)4K個(gè)頁(yè)表。
- 一個(gè)頁(yè)目錄下標(biāo)可訪問(wèn)一組頁(yè)表(頁(yè)表下標(biāo)是10位,共2^10個(gè)),即可訪問(wèn)2^10個(gè)頁(yè)表,而每個(gè)頁(yè)表配合頁(yè)內(nèi)偏移12位(?2^12的地址,即4M的內(nèi)存),所以一個(gè)頁(yè)目錄可訪問(wèn)2^12 * 2^10=4M的內(nèi)存。
- 而一共可以有2^10個(gè)頁(yè)目錄,而一個(gè)頁(yè)目錄可用2^10個(gè)頁(yè)表,而一個(gè)頁(yè)表占4K,故共可訪問(wèn)2^10 * 2^10 * 4K?= 4GB 的物理內(nèi)存。
- 偽代碼如下:
uint32 g_pageDir[2^12]; //4K的頁(yè)目錄 //傳入虛擬地址,得到物理地址 uint32 func_map(uint32 virtual_addr) { // 得到高10位 uint32 page_dir= virtual_addr & 0xffC00000; // 得到中10位 uint32 page_tbl= virtual_addr & 0x002ff000; // 得到低12位 uint32 ofst= virtual_addr & 0x00000fff; uint32_t* pageTable = g_pageDir[page_dir];//指向頁(yè)表塊 uint32 phy_addr = pageTable [page_tbl]; //指向物理塊 return (phy_addr + ofst); //得到物理內(nèi)存的具體位置 }
綜上:可通過(guò)32位的虛擬地址 + 二級(jí)頁(yè)表訪問(wèn)4GB的物理內(nèi)存,
- 為什么需要額外的4K的頁(yè)目錄來(lái)操作物理內(nèi)存呢?因?yàn)閷?shí)際使用中,我們并不需要用完4GB的flash, 所以并不需要4M的開銷。用多少頁(yè)表生成多少,而需要的額外開銷就是找到頁(yè)表index的頁(yè)目錄,遠(yuǎn)小于4M+4K,更加靈活。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧