1 mem_map[PAGING_PAGES]數組為什麼不直接從主存儲區開始記錄,而從1M開始記錄,然後又把1M到主存儲區之間的內容置為100
2 mem_map[i]在那些時候會大於1:同一物理頁面被n個(n>1)線性地址共享,如copy_page_table()會影響這裡的值
3 哪些地方需要執行刷新頁變換緩沖(invalidate()函數實現):
3.1 free_page_tables()
3.2 copy_page_tables()
3.3 un_wp_page()
3.4 try_to_share()
改變頁目錄項活頁表項
4 寫時復制的相關函數
4.1 copy_page_tables():負責把原始和新的頁目錄項和頁表項都設置為只讀
4.2 do_wp_page():頁寫保護處理函數
4.3 un_wp_page():判斷頁面是否被共享,若沒有共享,則把頁面設置為可寫,然後退出,若共享,則需要重新申請一新頁面並復制被寫頁面的內容,以供寫進程單獨使用共享被取消
5 COPY_SPACE(addr)不理解
6 在free_page_table()函數中,若addr(物理地址)所在的頁面由n個(n>=2)線性地址共享(copy_page_table函數可以讓一個物理頁面被多個線性地址共享),那麼在釋放addr所在頁面時,執行mem_map[addr]--(mm/memory.c Line 96)語句後,並不能讓mem_map[addr]的值變為0,而是變為n-1,這並不代表該物理頁面已被釋放,是不是應該改為mem_map [addr] = 0(mm/memory.c Line 96)呢?還是我那裡想錯了。
7 取線性地址addr所對應頁目錄項的物理地址
dir = (unsigned long*)((addr>>20)&0xffc)
說明:首先,addr>>22得出對應頁目錄項在頁目錄表中的項號,即表內偏移,因為頁目錄表的起始地址為物理地址0,而每項大小為4byte,所以,實際物理地址為addr>>20,又因為只右移了20位,最後兩位是頁表項的內容,所以和0xffc相與把最後兩位屏蔽掉,得出最終結果
8 取線性地址addr所對應頁表項的物理地址
table = ((unsigned long*)(((address >> 0) & oxffc) + (0xfffff000 & *((unsigned long*)((address>>20 & 0xffc)))))
即,偏移+基址,參考7
其中有些問題還沒有解決,若發現文中有錯,或提出相關建議,發送到: [email protected]
(內核源代碼版本為0.11)