CPU對記憶體管理二

2021-06-23 08:53:25 字數 1420 閱讀 9108

說的是頁定址機制,是上節mmu裡如何將線性位址轉化為實體地址的

32位作業系統管理的記憶體是4g,4g的大小是2的32次方得來的

將32位前10位分割,中間10位分割,後面12位再為乙份

前面的10位成為一級頁表,2的10次方,從0開始,一級頁表中有元素1024個,每個元素為二級頁表的首位址,意思是一級頁表所佔記憶體是1024*4(位址是4個位元組)=4k,意思是有1024個二級頁表

通過將前面10位換算為10進製混算為0-1023中間乙個數,找到後面第幾個二級頁表

中間的二級頁表,2的十次方,從0開始,二級頁表中有1024個元素,每個元素為頁的首位址,意思是一級頁表所佔記憶體是1024*4=4k,意思是所有的二級頁表所佔記憶體1024*1024*4=4m,意思是乙個二級頁表對應有1024個頁,意思是共有1024*1024*1024=1g個頁

通過換算中間10位為0-1023中間的乙個數,然後找到我們存放資料具體在哪個頁中

然後換算最後12位為0-4095中間乙個數,找到在頁中的具體位置

每個程序可以用不同的4g(線性位址),但總共的記憶體還是4g

每個程序必然會有乙個執行緒,每個執行緒必然會有乙個執行緒,每個執行緒必然會有乙個堆疊1m,所以每個程序有且只有乙個一級頁表

cr3暫存器,裡面放著當前程序的一級頁表的首位址

cpu執行的過程就是通過cr3找到當前程序的一級頁表的首位址,找到二級……頁……資料

問題一:共有物理記憶體4g,有1g個頁,頁裡的每個元素是實體地址,那所有頁所佔記憶體4g,所有二級頁表所佔記憶體1024(總共的二級頁表數)*1024(每個二級頁表中的元素數)*4(每個元素所佔記憶體)=4m,一級頁表所佔記憶體1*1024*4=4k,那共佔記憶體4k+4m+4g大於作業系統管理的記憶體

答:確實是這樣,如果我們即將用完二級頁表中的頁,那記憶體大於了4g,就會對4g取餘,回到4g的最上面,可能會崩,但是我們一般用的記憶體不多,而且一級頁表中的512到1023是2g,是作業系統用的,我們用不到,所以也不會出現上述問題而蹦的情況

答:實體地址。cpu的線性位址過來了,通過頁表中的實體地址解析才能找到真正存放的位置,我們反推,如果一級頁表中存放的是線性位址,那意味著還要建乙個頁表來存放實體地址。但是線性位址的後12位可以說是實體地址,因為資料存放在最後的頁中,後12位找到了在頁中的具體位置,和資料存放的實體地址掛上了鉤

問題四:頁定址的好處

解析:在之前doc的作業系統裡,使用者可以隨意訪問到系統使用的記憶體,會造成容易改寫系統所佔記憶體,導致藍屏,頁定址中一級頁表後面512到1023都為0,使用者無法訪問到,除非用cr0暫存器,那是編驅動的人使用的

2.如果我需要1m的記憶體,那只需要開闢一級頁表空間4k,二級頁表乙個且是二級頁表乙個4k,二級頁表中256個元素,每個元素4k構成1m,開闢的空間為4k+4k+1m,不用開闢多餘的二級頁表

CPU對記憶體管理四

交流一下動態陣列的邏輯 std標準模板動態庫中有乙個vector,就是動態陣列 動態陣列實現的就是在執行過程中根據使用多少增加或者減少陣列長度 vevtor有乙個引數,引數填寫的值就是以4k位單位保留的空間 在保留的空間中初始分配乙個頁,寫入資料,提交,在寫入資料在提交,提交是分配頁使用,但是寫入的...

QT中對記憶體的管理

在qt中,一切繼承自qt自有類的類,如果存在parent指標,那麼當parent指標delete時,該類中的指標 它們都屬於parent指標對應的child指標 也會被delete。綜上,如果我們的視窗對應的類所對應的parent指標為null的話,我們還是要進行一次手動的記憶體管理。我這裡舉個例子...

QT中對記憶體的管理

在qt中,一切繼承自qt自有類的類,如果存在parent指標,那麼當parent指標delete時,該類中的指標 它們都屬於parent指標對應的child指標 也會被delete。綜上,如果我們的視窗對應的類所對應的parent指標為null的話,我們還是要進行一次手動的記憶體管理。我這裡舉個例子...