實模式
在實模式下,內(nèi)存被限制為僅有1M字節(jié)(220 字節(jié))。有效的地址從00000到FFFFF (十六進(jìn)制)。這些地址需要用20位的數(shù)來表示。顯然,一個20位的數(shù)不適合任何一個8086的16位寄存器。Intel通過利用兩個16位數(shù)值來決定一個地址的方法來解決這個問題。開始的16位值稱為段地址(selector)。
段地址的值必須存儲在段寄存器中。第二個16位值稱為偏移地址(offset)。用32位段地址:
偏移地址表示的物理地址可以由下面的公式計算:
16 * selector + offset
在十六進(jìn)制中乘以16是非常容易的,只需要在數(shù)的右邊加0。例如:表示為047C:0048的物理地址通過這樣得到:
實際上,段地址的值是一節(jié)的首地址(看表1.2)。
1、一個段地址只能指向64K內(nèi)存(16位偏移的上限)。如果一個程序擁有大于64K的代碼那又怎么辦呢?在CS里的一個單一的值不能滿足整個程序執(zhí)行的需要。程序必須分成小于64K的段(segment)。當(dāng)執(zhí)行從一段移到另一段時,CS里的值必須改變。同樣的問題發(fā)生在大量的數(shù)據(jù)和DS 寄存器之間。這樣使用是非常不方便的!
2、每個字節(jié)在內(nèi)存里并不只有唯一的段地址。物理地址04808可以表示為:047C:0048,047D:0038,047E:0028 或047B:0058。這將使段地址的比較變得復(fù)雜。
16位保護(hù)模式
在80286的16位保護(hù)模式下,段地址的值與實模式相比解釋得完全不同。在實模式下,一個段地址的值是物理內(nèi)存里的一節(jié)的首地址。在保護(hù)模式下,一個段地址的值是一個指向描述符表的指針。兩種模式下,程序都是被分成段。在實模式下,這些段在物理內(nèi)存的固定位置而且段地址的值表示段開始處所在節(jié)的首地址。在保護(hù)模式下,這些段不是在物理內(nèi)存
的固定的地址。事實上,它們根本不一定需要在內(nèi)存中。
保護(hù)模式使用了一種叫做虛擬內(nèi)存的技術(shù)。虛擬內(nèi)存的基本思想是僅僅保存程序現(xiàn)在正在使用的代碼和數(shù)據(jù)到內(nèi)存中。其它數(shù)據(jù)和代碼暫時儲存在硬盤中直到它們再次需要時。當(dāng)一段從硬盤重新回到內(nèi)存中,它很有可能放在不同于它移動到硬盤之前時的位置的內(nèi)存中。所有這些都由操作系統(tǒng)透明地執(zhí)行。程序并不需要因為要讓虛擬內(nèi)存工作而使用不同的書寫方
法。
在保護(hù)模式下,每一段都分配了一條描述符表里的條目。這個條目擁有系統(tǒng)想知道的關(guān)于這段的所有信息。這些信息包括:現(xiàn)在是否在內(nèi)存中;如果在內(nèi)存中,在哪;訪問權(quán)限(例如: 只讀)。段的條目的指針是儲存在段寄存器里的段地址值。
16位保護(hù)模式的一個大的一 個 非 常 著 名 的PC專 缺點(diǎn)是偏移地址依然是16位數(shù)。這個的后果就是段的大小依然限制為最大64K。這會導(dǎo)致使用大的數(shù)組時會有問題。
32位保護(hù)模式
80386引入了32位保護(hù)模式。386 32位保護(hù)模式和286 16位保護(hù)模式之間
最主要的區(qū)別是:
1. 偏移地址擴(kuò)展成了32位。這就允許偏移地址范圍升至4G。因此,段的大小也升至4G。
2. 段可以分成較小的4K大小的單元,稱為內(nèi)存頁。虛擬內(nèi)存系統(tǒng)工作在頁的方式下,代替了段方式。這就意味著一段在任何一個時刻只有部分可能在內(nèi)存中。在28616位保護(hù)模式下,要么整個段在內(nèi)存中,要么整個不在。這樣在32位模式下允許的大的段的情況下很不實用。
在Windows 3.x系統(tǒng)中,標(biāo)準(zhǔn)模式為286 16位保護(hù)模式而增強(qiáng)模式為32位保護(hù)模式。Windows 9X,Windows NT/2000/XP,OS/2和Linux都運(yùn)行在分頁管理的32位保護(hù)模式下。
中斷
有時候普通的程序流必須可以被要求快速反應(yīng)的處理事件中斷。電腦提供了一個稱為中斷的結(jié)構(gòu)來處理這些事件。例如:當(dāng)一個鼠標(biāo)移動了,硬件鼠標(biāo)中斷現(xiàn)在的程序來處理鼠標(biāo)移動(移動鼠標(biāo),等等)。中斷導(dǎo)致控制權(quán)轉(zhuǎn)移到一個中斷處理程序。中斷處理程序是處理中斷的程序。每種類型的中斷都分配了一個中斷號。在物理內(nèi)存的開始處,存在一張包含中斷處理
程序段地址的中斷向量表。中斷號是這張表中最基本的指針。
外部中斷由CPU的外部引起。(鼠標(biāo)就是這一類型的例子。)許多I/O設(shè)備引起中斷(例如:鍵盤,時鐘,硬盤驅(qū)動器,CD-ROM和聲卡)。內(nèi)部中斷由CPU的內(nèi)部引起,要么是由一個錯誤引起,要么由中斷指令引起。錯誤中斷稱為陷阱。由中斷指令引起的中斷稱為軟中斷。DOS使用這些類型的中斷來實現(xiàn)它的API(應(yīng)用程序接口)。許多現(xiàn)代的操作系統(tǒng)(如:Windows和UNIX)使用一個基于C的接口。
許多中斷處理程序當(dāng)它執(zhí)行完成時,將控制權(quán)返回給被中斷的程序。它們恢復(fù)寄存器,里面的值與中斷發(fā)生之前的值相同。因此,被中斷的程序就像沒有任何事情發(fā)生一樣運(yùn)行(除了它失去了一些CPU周期)。陷阱通常不返回。通常它們中止程序。
更多建議: