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