為什麼中斷向量表重對映到高位址**)
2013-04-13 09:51:33
分類: linux
mmu給我感覺是個很複雜的東西,網上看了一些資料,勉強知道了一些表面的東西。它有兩個作用:1、把虛擬位址對映到實體地址;2、對記憶體訪問提供控制機制。
我主要記錄下我對對映表變換的理解。
在arm中,mmu另外提供了一張對映表(mva),用於程式虛擬位址(va)到實體地址(pa)的對映。mva稱為變換後的va。在程式執行時,cpu只看到va,而mmu和cache們只看到pa和mva。應該說,在程序執行切換過程中,對映關係是動態變化的,因為不同程序和記憶體之間需要不同的對映關係,就需要不斷的重做對映表,這個代價是很大的。所以,有必要讓對映表中需要更新的內容很少,以減少效能開支,這就出現了「變換後的」va,即mva,如果va<32m,需要使用程序標識號pid(通過讀cp15的c13獲得)來轉換為mva。
va與mva的轉換方法如下(這是硬體自動完成的):
if
(va < 32m)
mva = va |
(pid<
<25)
;//va<32m,即pid*0x02000000作為該程序起始位址
else
mva = va;
//va>=32m
如:假設兩個程序1、2執行時的va都是0-32m,則他們的mva分別是0x02000000-0x03ffffff、0x04000000-0x05ffffff,這樣程序切換就省事多了,不必進行重建頁表等工作。
但是,這同時帶來了中斷跳轉的問題。當發生異常時,需要跳到0x0位置的異常向量表,這個0x0應該是va,且小於32m,如果開啟了mmu,就會被轉換為mva,而不同的pid產生不同的mva,這就導致異常向量表的位址不統一了。所以,linux採取了將0x0位置的向量表對映到高位址0xffff0000處,就沒有上述的問題了,看了半天原來是這麼回事。。。
接下來,就是mva如何對映pa的工作。s3c2410的datasheet中說到4中對映方案,其中最方便的是段(section)操作,具體見《s3c2410 mmu》的後半文。
中斷向量表
中斷向量表 中斷源的識別標誌,可用來形成相應的中斷服務程式的入口位址或存放中斷服務程式的首位址 稱為中斷向量。在pc at中由硬體產生的中斷標識碼被稱為中斷型別號 當然,中斷型別號還有其他的產生方法,如指令中直接給出 cpu自動形成等 即在中斷響應期間 8259a 產生的是當前請求中斷的最高優先順序...
中斷向量表
關於中斷向量的幾點注釋 1.系統引導時,中斷向量表放在記憶體何處?系統剛引導時,記憶體0x00000到0x0003ff共1kb的空間用於存放中斷向量表。每個中斷向量占用4個位元組,共可儲存256個中斷向量。2.系統引導時,處在實模式下,只可定址1mb,為什麼要用4個位元組來定址中斷呢處理程式?剛看到...
中斷向量錶小計
1.系統引導時,中斷向量表放在記憶體何處?系統剛引導時,記憶體0x00000到0x0003ff共1kb的空間用於存放中斷向量表。每個中斷向量占用4個位元組,共可儲存256個中斷向量。2.系統引導時,處在實模式下,只可定址1mb,為什麼要用4個位元組來定址中斷呢處理程式?剛看到的時候,我也很納悶。我們...