1. 程式人生 > >不管什麼程序一旦進入核心就進入了系統空間都有相同的頁面對映

不管什麼程序一旦進入核心就進入了系統空間都有相同的頁面對映

核心當然會用cr3,在每個程序的頁目錄項中,都把最後3-4G的頁目錄項對映到了同一實體記憶體空間,也就是說每個程序的頁目錄項中的3-4G的映像關係完全相同!!!!
所以從任何一個程序在執行時進入核心空間,無非就兩種情況:
1.從系統呼叫進入核心態,此時核心用的就是當前程序的CR3,就是所謂的程序上下文中,核心在執行時用的是3-4G的線性空間,在MMU處理時,找到CR3,查詢到此時的頁目錄項與頁表,因為每個程序的3-4G空間所對映的實體地址完全一樣,所以MMU一定能找到核心相應函式所對應的實體地址,並且任何一個程序在切換到核心空間時,只要它用的是同一個函式,其實體地址就完全一樣
2.在中斷髮生的情況下,比如程序A在執行時,突然發生一箇中斷,此時由於沒有程序排程,所以進入到程序A的核心態下時其CR3並沒有變化,其頁目錄項與頁目錄表也沒有變化,那麼中斷處理函式用的就完全是程序A的頁表,由於核心線性地址在3-4G空間,只要核心不刻意訪問使用者空間,它所用到的地址就與使用者空間相互隔離。假定此中斷處理程式屬於程序A所用的一個裝置驅動,此時中斷一處理完畢,退出中斷,回到使用者空間,並繼續執行,假定此時產生時鐘中斷,並且重新排程到程序B,此時CR3發生了變化,所有頁表採用了程序B的頁表,假定上次的那個中斷又到來,切換到核心態,由於其3-4G的對映完全沒有變,所以核心程式碼進行了平穩過度,但是此時0-3G的所有頁表對映與程序A不同,所以中斷處理程式不能假定此時的0-3G的線性地址就是程序A的,此時它已是程序B的,這就是所謂的中斷上下文,通過current巨集所訪問到的就不再是程序A的PCB結構了,也就不能用current巨集來訪問其內容,因為已經沒有任何意義,除非你是想知道在任一時刻所發生的中斷所處的程序上下文,這就是裝置驅動程式中為何要禁止在中斷處理程式中直接與使用這個裝置的程序進行資料互動的原因了!!!