freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

linux下的內存管理一(編輯修改稿)

2024-08-26 16:55 本頁面
 

【文章內容簡介】 管理,也就不用考慮 這些,只需要考慮如何找出一個空閑頁面。 知道了內核對主內存塊中空閑物理內存頁面的映射結構 mem_map,查找空閑頁面的工作就簡單了。 只需要在 mem_map 找出一個空閑項,并將該項映射為對應的物理頁面地址。算法如下: 算法: get_free_page 輸入:無 輸出:空閑頁面物理地址 { 從最后一項開始查找 mem_map 空閑項; if(沒有空閑項 ) renturn 0; 將空閑項內容置 1,表示已經被占用; 將空閑項對應的下標轉換為對應的物理頁面的物理地址 = (數組下標頁面實際物理起始地址。 72movl%x,%x\n\t//保存頁面實際物理起始地址。 73movl24,%x\n\t//置計數值 1024 74leal 4092(%x),%i\n\t//使 edi指向該物理頁末端 75rep; stosl\n\t//沿反方向將該頁清零。 76movl%x,%x\n//將頁面實際物 理起始地址放入 eax(返回值 )。 771: 78: =a(__res) 79: (0),i(LOW_MEM),c(PAGING_PAGES), 80D(mem_map+PAGING_PAGES1) 81: di,cx,dx); 82 return __res; //返回空閑頁面實際物理起始地址 (如果無空閑也則返回 0)。 83} 84 這個函數返回的只是物理頁面的物理地址,下一節(jié)將具體講如何將物理地址映射為線性地址。 回收: 當內核使用完一個物理頁面或者進程退出時內核歸還申請了的 物理頁面。這時就需要更改相應的信 息,以便下一次使用。在歸還頁面時可能會出現下面幾種情況: 1)頁面物理地址低于主內存塊可能的最低端,這種情況不需要處理直接退出,因為這部分內存空 間被用于內核程序和緩沖,沒有作為分配頁面的內存空間。還有一種情況會出現這種情況,當內存操作 失敗時,會調用回收頁面過程回收已經分配了的物理頁,如果因為內存分配失敗造成的,就不需要真正 的回收操作,調用回收過程時會以 0 為輸入參數。 2)頁面物理地址高于實際物理內存最高地址。這種情況是不允許的,內核將使調用對象進入死循 環(huán),這是一種簡單而有效的方法,因為這種情況要判斷出錯原因是很困難的。 3)調用對象試圖釋放一塊空閑物理內存。出現這種情況可能是因為多個對象共享該物理頁,在釋 放時出現了重復釋放。比如:進程 A、 B共享物理頁 170,由于系統(tǒng)的原因A將該頁釋放了兩次,當 B 釋放該頁時就會出現這種情況。這種情況也是不允許的,一般意味著內核出錯,內核將使調用對象進入 死循環(huán)以避免錯誤擴散。 4)要釋放的頁面正確。因為可能是共享內存,所以要將該頁對應的映射項的值減 1,表示減少了 一個引用對象。如果引用數減到 0了,并不對物理頁面的內容清 0,等到被分配時再做,因為可能這個頁 面不會在被使用,同時在分配時用匯編代碼來做效率會很高。 這樣下面的代碼就很好理解了: 85 89 void free_page(unsigned long addr) 90{ 91 if(addr=HIGH_MEMORY) //如果物理地址 addr=實際內存大小,則顯示出錯信息,調用對象死機。 93 panic(trying to free nonexistent page); 94 addr=LOW_MEM; //將物理地址換算為對應的內存映射數組下標。 95 addr=12; 96 if(mem_map[addr])return; //如果對應內存映射數組項不等于 0,則減 1,返回 97 mem_map[addr]=0; //否則置對應映射項為 0,并顯示出錯信息,調用對象死機。 98 panic(trying to free free page); 99} 100 Four: 頁面映射 如果進程請求一頁空閑內存,或者頁失效錯誤時,會出現頁面請求。在這個時候請求是以線性地址 的形式提出來的。因為對于一個進程來說,它感知不到其他進程的存在,對它自己,覺得獨占了所有資 源。操作系統(tǒng)在控制物理內存的同時又要控制進程的虛擬空間,這就需要在內存線性地址與物理地址之 間作轉換工作。比如:進程在線性地址 0x0104 F380 處產生了缺頁中斷,內核將進行一系列的處理,最 后分配一個物理頁面,但是并不能這樣返回進程執(zhí)行,因為進程仍然需要從線性地址 0x0104 F380 處讀取 數據,就像沒有發(fā)生過缺頁中斷一樣。操作系統(tǒng)就必須要做這個工作,將物理頁面映射到線性地址上。 要將物理頁面映射到線性地址上,就應該修改頁目錄表和頁表的相關內容,這樣進程才能通過線性 地址找到相應的物理頁面。回顧一下 386 頁面映射機制, cpu 通過線性地址的高 10 位尋找到相應的頁 表,再通過中間 10 位尋找到物理頁面,最后通過低 12 位在物理頁面中尋找到相應的內存單元。所以要 讓進程找到物理頁面,就必須根據線性地址設置頁目錄項和頁表項。 使用 put_page 來作這個處 理,其算法如下: 算法: put_page 輸入:物理頁面地址 page 線性地址 address 輸出:如果成功,返回 page;如果失敗,返回 0 { if(物理頁面地址低于 LOW_MEM 或者不小于 HIGH_MEMORY) 顯示出錯信息,返回 0; if(物理頁面地址對應的內存映射數組映射項的值! =1) 顯示出錯信息,返回 0; 根據線性地址高 10 位找到對應的頁目錄表項; if(頁目錄表項對應的頁表在內存中 ) 根據頁目錄表項的到頁表的物理地址; else{ 分配新的物理頁面作為新的頁表; 初始化頁目錄表項,使它指向新的頁表; 根據頁目錄表項的到頁表的物理地址; } 根據線性地址中間 10位找到對應的頁表項; if(對應的頁表項已經被使用 ) 顯示出錯信息,返回 0; 設置對應的頁表項,使它指向物理頁面; return 物理頁面地址; } put_page 操縱的是由 get_free_page()分配得到的物理頁面,所以物理頁面地址應該是在主內存塊 中,如果不在,就應該終止映射,返回失敗。然后調用 put_page 函數的對象根據自身的特性作相關處 理。同樣是因為 put_page 操縱的是新分配的物理頁面,所以物理頁面地址對應的內存映射數組映射項的 值應該是 1。如果不是 1,也應該終止映射,返回失敗。如果前面的檢查通過了,就應改進行映射了。首 先在頁目錄表中找到對應頁目錄項,如果頁目錄項有效,即對應頁表在內存中,就直接尋找頁表項。否 則就必須先分 配一個物理頁作為頁表。從理論上講,在設置對應的頁表項之前應該檢查一下該頁表項是 否已經被使用。從而確保映射的一致性,因為如果頁表
點擊復制文檔內容
研究報告相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1