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