目錄
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),尚義企業(yè)網(wǎng)站建設(shè),尚義品牌網(wǎng)站建設(shè),網(wǎng)站定制,尚義網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,尚義網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。物理內(nèi)存管理帶來的問題
直接映射
一級頁表
二級頁表
參考:
物理內(nèi)存管理帶來的問題(C語言內(nèi)存七)分頁機制究竟是如何實現(xiàn)的? - Smah - 博客園
直接映射
- 比如4GB的flash, 如果應(yīng)用程序可直接訪問物理內(nèi)存,那么可能一個非法的操作會導(dǎo)致程序無法正常工作,常見于跑裸機的單片機程序。
- 而操作系統(tǒng)為了保護程序可正常運行,引入了虛擬內(nèi)存的概念,換句話說:對應(yīng)用程序來講:操作的內(nèi)存是虛擬內(nèi)存。
- 而操作系統(tǒng)做的事情就是把虛擬內(nèi)存映射到物理內(nèi)存。那么如何映射就是需要設(shè)計的關(guān)鍵。即物理地址 = func_map(虛擬內(nèi)存); 這個func_map就叫頁表,以下有常見的現(xiàn)有的設(shè)計實現(xiàn)
一級頁表
- 頁表方案:比如一個4GB的flash,那么需要2^32個地址去訪問,而地址從0-2^32,這么大的數(shù)需要4字節(jié)的數(shù)據(jù)去存,也就是需要 uint64 flash[2^32];?
- 內(nèi)存開銷:這樣的數(shù)組去訪問每個物理地址。這樣的數(shù)組有多大呢? 4*4GB = 16GB, 就是說訪問4GB的flash需要16GB的內(nèi)存,這肯定是不可以的。
這一樣的實現(xiàn)是 physical_addr = flash[virtual_addr];
二級頁表
- 頁表方案:
- 為了減少內(nèi)存開銷,有了分頁機制:把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è)計虛擬地址的31-12位得到頁表數(shù),11-0得到頁內(nèi)的偏移。
這樣的實現(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; }
- 頁表的開銷:一個虛擬地址為4字節(jié),共需要4GB/4K = 2^32/ 2^12 = 2^20個虛擬地址,一共占4*2^20字節(jié)== 4M,即維護一級頁表:可訪問4G的物理內(nèi)存,開銷為4M
前人又設(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個頁表。
- 一個頁目錄下標(biāo)可訪問一組頁表(頁表下標(biāo)是10位,共2^10個),即可訪問2^10個頁表,而每個頁表配合頁內(nèi)偏移12位(?2^12的地址,即4M的內(nèi)存),所以一個頁目錄可訪問2^12 * 2^10=4M的內(nèi)存。
- 而一共可以有2^10個頁目錄,而一個頁目錄可用2^10個頁表,而一個頁表占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)存呢?因為實際使用中,我們并不需要用完4GB的flash, 所以并不需要4M的開銷。用多少頁表生成多少,而需要的額外開銷就是找到頁表index的頁目錄,遠小于4M+4K,更加靈活。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站名稱:內(nèi)存管理---分頁機制-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://www.rwnh.cn/article6/cepjog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站排名、小程序開發(fā)、做網(wǎng)站、建站公司、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容