彙編語言(三)——X86處理器架構

爲了深入學習計算機,我們需要了解與 x86 彙編語言相關的底層硬件知識。以及從程序員角度看到的主機系統。其中包括了所有的 Intel IA-32 和 Intel 64 處理器和高級微設備 (AMD) 處理器。而且還應該詳細的瞭解指令執行時處理器內部發生的一些基本操作,以及操作系統如何加載和執行程序,並通過樣本主板佈局來了解 x86 系統的硬件環境,最後還應該瞭解在應用程序與操作系統之間,層次化輸入輸出是如何工作的。

0.CPU架構

下圖給出了假想機的基本設計。中央處理單元(CPU)是進行算術和邏輯操作的部件,包含了有限數量的存儲位置——寄存器(register),一個高頻時鐘、一個控制單元和一個算術邏輯單元。

微計算機框圖

其中:時鐘 (clock) 對 CPU 內部操作與系統其他組件進行同步。控制單元 (control unit, CU) 協調參與機器指令執行的步驟序列。算術邏輯單元 (arithmetic logic unit, ALU) 執行算術運算,如加法和減法,以及邏輯運算,如 AND(與)、OR(或)和 NOT(非)。

CPU 通過主板上 CPU 插座的引腳與計算機其他部分相連。大部分引腳連接的是數據總線、控制總線和地址總線。內存存儲單元 (memory storage unit) 用於在程序運行時保存指令與數據。它接受來自 CPU 的數據請求,將數據從隨機存儲器 (RAM) 傳輸到 CPU,並從 CPU 傳輸到內存。由於所有的數據處理都在 CPU 內進行,因此保存在內存中的程序在執行前需要被複制到 CPU 中。程序指令在複製到 CPU 時,可以一次複製一條,也可以一次複製多條。總線 (bus) 是一組並行線,用於將數據從計算機一個部分傳送到另一個部分。一個計算機系統通常包含四類總線:數據類、I/O 類、控制類和地址類。數據總線 (data bus) 在 CPU 和內存之間傳輸指令和數據。I/O 總線在 CPU 和系統輸入 / 輸出設備之間傳輸數據。控制總線 (control bus) 用二進制信號對所有連接在系統總線上設備的行爲進行同步。當前執行指令在 CPU 和內存之間傳輸數據時,地址總線 (address bus) 用於保持指令和數據的地址。時鐘與 CPU 和系統總線相關的每一個操作都是由一個恆定速率的內部時鐘脈衝來進行同步。機器指令的基本時間單位是機器週期 (machine cycle) 或時鐘週期 (clock cycle)。個時鐘週期的時長是一個完整時鐘脈衝所需要的時間。下圖中,一個時鐘週期被描繪爲兩個相鄰下降沿之間的時間:
 

一個時鐘週期

 

時鐘週期持續時間用時鐘速度的倒數來計算,而時鐘速度則用每秒振盪數來衡量。例如,一個每秒振盪 10 億次 (1GHz) 的時鐘,其時鐘週期爲 10 億分之 1 秒 (1 納秒 )。執行一條機器指令最少需要 1 個時鐘週期,有幾個需要的時鐘則超過了 50 個(比如 8088 處理器中的乘法指令)。由於在 CPU、系統總線和內存電路之間存在速度差異,因此,需要訪問內存的指令常常需要空時鐘週期,也被稱爲等待狀態 (wait states)。

一條機器指令不會神奇地一下就執行完成。CPU 在執行一條機器指令時,需要經過一系列預先定義好的步驟,這些步驟被稱爲指令執行週期 ,假設現在指令指針寄存器中已經有了想要執行指令的地址,下面就是執行步驟:

1) CPU 從被稱爲指令隊列 (instruction queue) 的內存區域取得指令,之後立即增加指令指針的值。2) CPU 對指令的二進制位模式進行譯碼。這種位模式可能會表示該指令有操作數(輸入值)。3) 如果有操作數,CPU 就從寄存器和內存中取得操作數。有時,這步還包括了地址計算。4) 使用步驟 3 得到的操作數,CPU 執行該指令。同時更新部分狀態標誌位,如零標誌 (Zero)、進位標誌 (Carry) 和溢出標誌 (Overflow)。5) 如果輸出操作數也是該指令的一部分,則 CPU 還需要存放其執行結果。

通常將上述聽起來很複雜的過程簡化爲三個步驟:取指 (Fetch)、譯碼 (Decode) 和執行 (Execute)。操作數 (operand) 是指操作過程中輸入或輸出的值。例如,表達式 Z=X+Y 有兩個輸入操作數 (X 和 Y),—個輸岀操作數 (Z)。下圖是一個典型 CPU 中的數據流框圖。該圖表現了在指令執行週期中相互交互部件之間的關係。在從內存讀取程序指令之前,將其地址放到地址總線上。然後,內存控制器將所需代碼送到數據總線上,存入代碼高速緩存 (code cache)。指令指針的值決定下一條將要執行的指令。指令由指令譯碼器分析,併產生相應的數值信號送往控制單元,其協調 ALU 和浮點單元。雖然圖中沒有畫出控制總線,但是其上傳輸的信號用系統時鐘協調不同 CPU 部件之間的數據傳輸。

簡化的CPU框圖

讀取內存作爲一個常見現象,計算機從內存讀取數據比從內部寄存器讀取速度要慢很多。這是因爲從內存讀取一個值,需要經過下述步驟:將想要讀取的值的地址放到地址總線上。設置處理器 RD(讀取)引腳(改變 RD 的值)。等待一個時鐘週期給存儲器芯片進行響應。將數據從數據總線複製到目標操作數。

幸運的是,CPU 設計者很早之前就已經指出,因爲絕大多數程序都需要訪問變量,計算機內存成爲了速度瓶頸。他們想出了一個聰明的方法來減少讀寫內存的時間一一將大部分近期使用過的指令和數據存放在高速存儲器 cache 中。其思想是,程序更可能希望反覆訪問相同的內存和指令,因此,cache 保存這些值就能使它們能被快速訪問到。此外,當 CPU 開始執行一個程序時,它會預先將後續(比如)一千條指令加載到 cache 中,這個行爲是基於這樣一種假設,即這些指令很快就會被用到。如果這種情況重複發生在一個代碼塊中,則 cache 中就會有相同的指令。當處理器能夠在 cache 存儲器中發現想要的數據,則稱爲 cache 命中 (cache hit)。反之,如果 CPU 在 cache 中沒有找到數據,則稱爲 cache 未命中 (cache miss)。x86 系列中的 cache 存儲器有兩種類型:一級 cache(或主 cache)位於 CPU 上;二級 cache (或次 cache)速度略慢,通過高速數據總線與 CPU 相連。這兩種 cache 以最佳方式一 起工作。還有一個原因使得 cache 存儲器比傳統 RAM 速度快,cache 存儲器是由一種被稱爲靜態 RAM (static RAM) 的特殊存儲器芯片構成的。這種芯片比較貴,但是不需要爲了保持其內容進行不斷地刷新。另一方面,傳統存儲器,即動態 RAM (dynamic RAM),就需要持續刷新。它速度慢一些,但是價格更便宜。

在程序執行之前,需要用一種工具程序將其加載到內存,這種工具程序稱爲程序加載器 (program loader)。加載後,操作系統必須將 CPU 向程序的入口,即程序開始執行的地址。以下步驟是對這一過程的詳細分解。

1) 操作系統(OS)在當前磁盤目錄下搜索程序的文件名。如果找不到,則在預定目錄列表(稱爲路徑(path))下搜索文件名。當 OS 無法檢索到文件名時,它會發出一個出錯信息。2) 如果程序文件被找到,OS 就訪問磁盤目錄中的程序文件基本信息,包括文件大小,及其在磁盤驅動器上的物理位置。3) OS 確定內存中下一個可使用的位置,將程序文件加載到內存。爲該程序分配內存塊,並將程序大小和位置信息加入表中(有時稱爲描述符表(descriptor table))。另外,OS 可能調整程序內指針的值,使得它們包括程序數據地址。4) OS 開始執行程序的第一條機器指令(程序入口)。當程序開始執行後,就成爲一個進程(process)。OS 爲這個進程分配一個標識號(進程 ID),用於在執行期間對其進行追蹤。5) 進程自動運行。OS 的工作是追蹤進程的執行,並響應系統資源的請求。這些資源包括內存、磁盤文件和輸入輸出設備等。6) 進程結束後,就會從內存中移除。

不論使用哪個版本的 Microsoft Windows,按下 Ctrl-Alt-Delete 組合鍵,可以選擇任務管理器(task manager)選項。在任務管理器窗口可以查看應用程序和進程列表。應用程序列表中列出了當前正在運行的完整程序名稱,比如,Windows 瀏覽器,或者 Microsoft Visual C++。如果選擇進程列表,則會看見一長串進程名。其中的每個進程都是一個獨立於其他進程的,並處於運行中的小程序。可以連續追蹤每個進程使用的 CPU 時間和內存容量。在某些情況下,選定一個進程名稱後,按下 Delete 鍵就可以關閉該進程。

1.32位x86處理器架構
 

這些處理器包括了 Intel IA-32 系列中的成員和所有 32 位 AMD 處理器。x86 處理器有三個主要的操作模式:保護模式、實地址模式和系統管理模式;以及一個子模式:虛擬 8086 (virtual-8086) 模式,這是保護模式的特殊情況。以下是對這些模式的簡介:

1) 保護模式 (Protected Mode):保護模式是處理器的原生狀態,在這種模式下,所有的指令和特性都是可用的。分配給程序的獨立內存區域被稱爲段,而處理器會阻止程序使用自身段範圍之外的內存。

2) 虛擬 8086 模式 (Virtual-8086 Mode):保護模式下,處理器可以在一個安全環境中,直接執行實地址模式軟件,如 MS-DOS 程序。換句話說,如果一個程序崩潰了或是試圖向系統內存區域寫數據,都不會影響到同一時間內執行的其他程序。現代操作系統可以同時執行多個獨立的虛擬 8086 會話。

3) 實地址模式 (Real-Address Mode):實地址模式實現的是早期 Intel 處理器的編程環境,但是增加了一些其他的特性,如切換到其他模式的功能。當程序需要直接訪問系統內存和硬件設備時,這種模式就很有用。

4) 系統管理模式 (System Management Mode):系統管理模式 (SMM) 向操作系統提供了實現諸如電源管理和系統安全等功能的機制。這些功能通常是由計算機制造商實現的,他們爲了一個特定的系統設置而定製處理器。

在 32 位保護模式下,一個任務或程序最大可以尋址 4GB 的線性地址空間。從 P6 處理器開始,一種被稱爲擴展物理尋址 (extended physical addressing) 的技術使得可以被尋址的物理內存空間增加到 64GB。與之相反,實地址模式程序只能尋址 1MB 空間。如果處理器在保護模式下運行多個虛擬 8086 程序,則每個程序只能擁有自己的 1MB 內存空間。

寄存器是直接位於 CPU 內的高速存儲位置,其設計訪問速度遠高於傳統存儲器。例如,當一個循環處理爲了速度進行優化時,其循環計數會保留在寄存器中而不是變量中。下圖展示的是基本程序執行寄存器(basic program execution registers)。8 個通用寄存器,6 個段寄存器,一個處理器狀態標誌寄存器(EFLAGS),和一 個指令指針寄存器(EIP)。

基本程序執行寄存器

通用寄存器主要用於算術運算和數據傳輸。如下圖所示,EAX 寄存器的低 16 位在使用時可以用 AX 表示。
 

通用寄存器

 

一些寄存器的組成部分可以處理 8 位的值。例如,AX 寄存器的高 8 位被稱爲 AH,而低 8 位被稱爲 AL。同樣的重疊關係也存在於 EAX、EBX、ECX 和 EDX 寄存器中:

32位 16位 8位(高) 8位(低)
EAX AX AH AL
EBX BX BH BL
ECX CX CH CL
EDX DX DH DL

其他通用寄存器只能用 32 位或 16 位名稱來訪問,如下表所示:

32位 16位 32位 16位
ESI SI EBP BP
EDI DI ESP SP

 

某些通用寄存器有特殊用法:乘除指令默認使用EAX。它常常被稱爲擴展累加器(extended accumulator)寄存器。CPU 默認使用 ECX 爲循環計數器。ESP 用於尋址堆棧(一種系統內存結構)數據。它極少用於一般算術運算和數據傳輸,通常被稱爲擴展堆棧指針(extended stack pointer)寄存器。ESI 和 EDI 用於高速存儲器傳輸指令,有時也被稱爲擴展源變址(extended source index)寄存器和擴展目的變址(extended destination index)寄存器。高級語言通過 EBP 來引用堆棧中的函數參數和局部變量。除了高級編程,它不用於一般算術運算和數據傳輸。它常常被稱爲擴展幀指針(extended frame pointer)寄存器。

實地址模式中,16 位段寄存器表示的是預先分配的內存區域的基址,這個內存區域稱爲段。保護模式中,段寄存器中存放的是段描述符表指針。一些段中存放程序指令(代碼),其他段存放變量(數據),還有一個堆棧段存放的是局部函數變量和函數參數。指令指針(EIP)寄存器中包含下一條將要執行指令的地址。某些機器指令能控制 EIP,使得程序分支轉向到一個新位置。EFLAGS (或 Flags)寄存器包含了獨立的二進制位,用於控制 CPU 的操作,或是反映一些 CPU 操作的結果。有些指令可以測試和控制這些單獨的處理器標誌位。設置標誌位時,該標識位 =1;清除(或重置)標識位時,該標誌位 =0。控制標誌位控制 CPU 的操作。例如,它們能使得 CPU 每執行一條指令後進入中斷;在偵測到算術運算溢出時中斷執行;進入虛擬 8086 模式,以及進入保護模式。程序能夠通過設置 EFLAGS 寄存器中的單獨位來控制 CPU 的操作,比如,方向標誌位和中斷標誌位。狀態標誌位反映了 CPU 執行的算術和邏輯操作的結果。其中包括:溢出位、符號位、零標誌位、輔助進位標誌位、奇偶校驗位和進位標誌位。下述說明中,標誌位的縮寫緊跟在標誌位名稱之後:

進位標誌位(CF),與目標位置相比,無符號算術運算結果太大時,設置該標誌位。溢出標誌位(OF),與目標位置相比,有符號算術運算結果太大或太小時,設置該標誌位。符號標誌位(SF),算術或邏輯操作產生負結果時,設置該標誌位。零標誌位(ZF),算術或邏輯操作產生的結果爲零時,設置該標誌位。輔助進位標誌位(AC),算術操作在 8 位操作數中產生了位 3 向位 4 的進位時,設置該標誌位。奇偶校驗標誌位(PF),結果的最低有效字節包含偶數個 1 時,設置該標誌位,否則,清除該標誌位。一般情況下,如果數據有可能被修改或損壞時,該標誌位用於進行 錯誤檢測。

在實現高級多媒體和通信應用時,MMX 技術提高了 Intel 處理器的性能。8 個 64 位 MMX 寄存器支持稱爲 SIMD(單指令,多數據,Single-Instruction,Multiple-Data)的特殊指令。顧名思義,MMX 指令對 MMX 寄存器中的數據值進行並行操作。雖然,它們看上去是獨立的寄存器,但是 MMX 寄存器名實際上是浮點單元中使用的同樣寄存器的別名。

x86 結構還包括了 8 個 128 位 XMM 寄存器,它們被用於 SIMD 流擴展指令集。浮點單元(FPU, floating-point unit)執行高速浮點算術運算。之前爲了這個目的,需要一個獨立的協處理器芯片。從 Intel486 處理器開始,FPU 已經集成到主處理器芯片上。FPU 中有 8 個浮點數據寄存器,分別命名爲 ST(0),ST(1),ST(2),ST(3),ST(4), ST(5), ST (6)和 ST(7)。其他控制寄存器和指針寄存器如下圖所示。

 

浮點單元寄存器

 

x86 處理器按照前面討論的基本操作模式來管理內存。保護模式是最可靠、最強大的,但是它對應用程序直接訪問系統硬件有着嚴格的限制。在實地址模式中,只能尋址 1MB 內存,地址從 00000H 到 FFFFFH。處理器一次只能運行一個程序,但是可以暫時中斷程序來處理來自外圍設備的請求(稱爲中斷(interrupt))。應用程序被允許訪問內存的任何位置,包括那些直接與系統硬件相關的地址。MS-DOS 操作系統在實地址模式下運行,Windows 95 和 98 能夠引導進入這種模式。在保護模式中,處理器可以同時運行多個程序,它爲每個進程(運行中的程序)分配總共 4GB 的內存。每個程序都分配有自己的保留內存區域,程序之間禁止意外訪問其他程序的代碼和數據。MS-Windows 和 Linux 運行在保護模式下。在虛擬 8086 模式中,計算機運行在保護模式下,通過創建一個帶有 1MB 地址空間的虛擬 8086 機器來模擬運行於實地址模式的 80x86 計算機。例如,在 Windows NT 和 2000 下,當打開一個命令窗口時,就創建了一個虛擬 8086 機器。同一時間可以運行多個這樣的窗口,並且窗口之間都是受到保護的。在 Windows NT,2000 和 XP 系統中,某些需要直接使用計算機硬件的 MS-DOS 程序不能運行在虛擬 8086 模式下。

2.X86-X64

對於使用 x86-64 指令集的 64 位處理器的基本架構細節。這些處理器包括 Intel 64 和 AMD64 處理器系列。指令集是已討論的 x86 指令集的 64 位擴展。以下爲一些基本特徵:1) 向後兼容 x86 指令集。2) 地址長度爲 64 位,虛擬地址空間爲 2 64 字節。按照當前芯片的實現情況,只能使用地址的低 48 位。3) 可以使用 64 位通用寄存器,允許指令具有 64 位整數操作數。4) 比 x86 多了 8 個通用寄存器。5) 物理地址爲 48 位,支持高達 256TB 的 RAM。另一方面,當處理器運行於本機 64 位模式時,是不支持 16 位實模式或虛擬 8086 模式的。(在傳統模式(legacy mode)下,還是支持 16 位編程,但是在 Microsoft Windows 64 位版本中不可用。)注意儘管 x86-64 指的是指令集,但是也可以將其看作是處理器類型。學習彙編語言時,沒有必要考慮支持 x86-64 的處理器之間的硬件實現差異。第一個使用 x86-64 的 Intel 處理器是 Xeon,之後還有許多其他的處理器,包括 Core i5 和 Core i7。AMD 處理器中使用 x86-64 的例子有 Opteron 和 Athlon 64。另一個爲人所知的 64 位 Intel 架構是 IA-64,後來被稱爲 Itanium。 IA-64 指令集與 x86 和 x86-64 完全不同,Itanium 處理器通常用於高性能數據庫和網絡服務器。

Intel 64 架構引入了一個新模式,稱爲 IA-32e。從技術上看,這個模式包含兩個子模式:兼容模式(compatibility mode)和 64 位模式(64-bit mode)。不過它們常常被看做是模式而不是子模式,因此,先來了解這兩個模式。在兼容模式下,現有的 16 位與 32 位應用程序通常不用進行重新編譯就可以運行。但是,16 位 Windows(Win16)和 DOS 應用程序不能運行在 64 位 Microsoft Windows 下。與早期 Windows 版本不同,64 位 Windows 沒有虛擬 DOS 機器子系統來利用處理器的功能切換到虛擬 8086 模式。在 64 位模式下,處理器執行的是使用 64 位線性地址空間的應用程序。這是 64 位 Microsoft Windows 的原生模式,該模式能使用 64 位指令操作數。

64 位模式下,雖然處理器現在只能支持 48 位的地址,但是理論上,地址最大爲 64 位。從寄存器來看,64 位模式與 32 位最主要的區別如下所示:16 個 64 位通用寄存器(32 位模式只有 8 個通用寄存器),8 個 80 位浮點寄存器,1 個 64 位狀態標誌寄存器 RFLAGS (只使用低 32 位),1 個 64 位指令指針寄存器 RIP。

32 位標誌寄存器和指令指針寄存器分別稱爲 EFLAGS 和 EIP。此外,還有一些 x86 處理器用於多媒體處理的特殊寄存器:8 個 64 位 MMX 寄存器,16 個 128 位 XMM 寄存器(32 位模式只有 8 個 XMM 寄存器)。

通用寄存器是算術運算、數據傳輸和循環遍歷數據指令的基本操作數。通用寄存器可以訪問 8 位、16 位、32 位或 64 位操作數(需使用特殊前綴)。64 位模式下,操作數的默認大小是 32 位,並且有 8 個通用寄存器。但是,給每條指令加上 REX(寄存器擴展)前綴後,操作數可以達到 64 位,可用通用寄存器的數量也增加到 16 個:32 位模式下的寄存器,再加上 8 個有標號的寄存器,R8 到 R15。下表給出了 REX 前綴下可用的寄存器:

操作數大小 可用寄存器
8 位 AL、BL、CL、DL、DIL、SIL、BPL、SPL、R8L、R9L、R10L、R11L、R12L、R13L、R14L、R15L
16 位 AX、BX、CX、DX、DI、SI、BP、SP、R8W、R9W、R10W、R11W、R12W、R13W、R14W、R15W
32 位 EAX、EBX、ECX、EDX、EDI、ESI、EBP、ESP、R8D、R9D、R10D、R11D、R12D、R13D、R14D、R15D
64 位 RAX、RBX、RCX、RDX、RDI、RSI、RBP、RSP、R8、R9、R10、R11、R12、R13、R14、R15

64 位模式下,單條指令不能同時訪問寄存器高字節,如 AH、BH、CH 和 DH,以及新字節寄存器的低字節(如 DIL)。64 位模式下,32 位 EFLAGS 寄存器由 64 位 RFLAGS 寄存器取代。這兩個寄存器共享低 32 位,而 RFLAGS 的高 32 位是不使用的。32 位模式和 64 位模式具有相同的狀態標誌。

3.x86計算機組件

主板是微型計算機的心臟,它是一個平面電路板,其上集成了 CPU、支持處理器(芯片組(chipset))、主存、輸入輸出接口、電源接口和擴展插槽。各種組件通過總線即一組直接蝕刻在主板上的導線,進行互連。目前 PC 市場上有幾十種主板,它們在擴展功能、集成部件和速度方面存在着差異。但是,下述組件一般都會岀現在主板上:CPU 插座。根據其支持的處理器類型,插座具有不同的形狀和尺寸。存儲器插槽(SIMM 或 DIMM),用於直接插入小型內存條。BIOS (基本輸入輸出系統,basic input-output system)計算機芯片,保存系統軟件。CMOS RAM,用一個小型鈕釦電池爲其持續供電。大容量插槽設備接口,如硬盤和 CD-ROMS。外部設備的 USB 接口。鍵盤和鼠標接口。PCI 總線接口,用於聲卡、顯卡、數據採集卡和其他輸入輸出設備。

以下是可選組件:集成聲音處理器。並行和串行設備接口。集成網卡。用於高速顯卡的 AGP 總線接口。

典型系統中還有一些重要的支持處理器:浮點單元(FPU),處理浮點數和擴展整數運算。8284/82C84 時鐘發生器,簡稱時鐘,按照恆定速率振盪。時鐘發生器同步 CPU 和計算機的其他部分。8259A 可編程中斷控制器(PIC, Programmable Interrupt Controller),處理來自硬件設備的外部中斷請求,包括鍵盤、系統時鐘和磁盤驅動器。這些設備能中斷 CPU,並使其立即響應它們的請求。8253 可編程間隔定時器 / 計數器(Programmable Interval Timer/Counter),每秒中斷系統 18.2 次,更新系統日期和時鐘,並控制揚聲器。它還負責不斷刷新內存,因爲 RAM 存儲器芯片保持其內容的時間只有幾毫秒。8255 可編程並行端口(Programmable Parallel Port),使用 IEEE 並行端口將數據輸入和輸出計算機。該端口通常用於打印機,但是也可以用於其他輸入輸出設備。

PCI(外部設備互聯,Peripheral Component Interconnect)總線爲 CPU 和其他系統設備提供了連接橋,這些設備包括硬盤驅動器、內存、顯卡、聲卡和網卡。最近,PCI Express 總線在設備、內存和處理器之間提供了雙向串行連接。如同網絡一樣,它用獨立的“通道”傳送數據包。該總線得到顯卡的廣泛支持,能以較高速度傳輸數據。

主板芯片組(motherlboard chipset)是一組處理器芯片的集合,這些芯片被設計爲在特定類型主板上一起工作。各種芯片組具有增強處理能力、多媒體功能或減少功耗等特性。以 Intel P965 Express 芯片組爲例,該芯片組與 Intel Core2 Duo 或 Pentium D 處理器一起,用於桌面系統。Intel P965 具有下述特性:Intel 高速內存訪問 (Fast Memory Access) 使用了最新內存控制中心 (MCH)。它可以 800MHz 時鐘速度來訪問雙通道 DDR2 存儲器。I/O 控制中心 (Intel ICH8/R/DH) 使用 Intel 矩陣存儲技術 (MST) 來支持多個串行 ATA 設備 ( 磁盤驅動器 ) 。支持多個 USB 端口,多個 PCI Express 插槽,聯網和 Intel 靜音系統技術。高清晰音頻芯片提供了數字聲音功能。

Intel P965 Express芯片組框圖

基於 Intel 的系統使用的是幾種基礎類型內存:只讀存儲器(ROM)、可擦除可編程只讀存儲器(EPROM)、動態隨機訪問存儲器(DRAM)、靜態 RAM (SRAM)、圖像隨機存儲器(VRAM),和互補金屬氧化物半導體(CMOS)RAM:ROM 永久燒錄在芯片上,並且不能擦除。EPROM 能用紫外線緩慢擦除,並且重新編程。DRAM,即通常的內存,在程序運行時保存程序和數據的部件。該部件價格便宜,但是每毫秒需要進行刷新,以避免丟失其內容。有些系統使用的是 ECC(錯誤檢查和糾正)存儲器。SRAM 主要用於價格高、速度快的 cache 存儲器。它不需要刷新,CPU 的 cache 存儲器就是由 SRAM 構成的。VRAM 保存視頻數據。VRAM 是雙端口的,它允許一個端口持續刷新顯示器,同時另一個端口將數據寫到顯示器。CMOS RAM 在系統主板上,保存系統設置信息。它由電池供電,因此當計算機電源關閉後,CMOS RAM 中的內容仍能保留。

4.計算機I/O輸入輸出系統

由於計算機遊戲與內存和 I/O 有着非常密切的關係,因此,它們推動計算機達到其最大性能。善於遊戲編程的程序員通常很瞭解視頻和音頻硬件,並會優化代碼的硬件特性。

應用程序通常從鍵盤和磁盤文件讀取輸入,而將輸出寫到顯示器和文件中。完成 I/O 不需要直接訪問硬件——相反,可以調用操作系統的函數。高級編程語言,如 C++ 或 Java,包含了執行輸入輸出的函數。由於這些函數要在各種不同的計算機系統中工作,並不依賴於任何一個操作系統,因此,這些函數具有可移植性。程序員能夠從被稱爲 API(應用程序編程接口,Application Programming Interface)的庫中調用操作系統函數。操作系統提供高級操作,比如,向文件寫入字符串,從鍵盤讀取字符串,和分配內存塊。基本輸入輸出系統是一組能夠直接與硬件設備通信的低級子程序集合。BIOS 由計算機制造商安裝並定製,以適應機器硬件。操作系統通常與 BIOS 通信。

設備驅動程序允許操作系統與硬件設備和系統 BIOS 直接通信。例如,設備驅動程序可能接收來自 OS 的請求來讀取一些數據,而滿足該請求的方法是,通過執行設備固件中的代碼,用設備特有的方式來讀取數據。設備驅動程序有兩種安裝方法:一種是在特定硬件設備連接到系統之前,或者設備已連接並且識別之後。對於後一種方法,OS 識別設備名稱和簽名,然後在計算機上定位並安裝設備驅動軟件。

現在,通過展示應用程序在屏幕上顯示字符串的過程,來了解 I/O 層次結構如下圖所示:

輸入輸出操作的訪問層次

該過程包含以下步驟:應用程序調用 HLL 庫函數,將字符串寫入標準輸出。庫函數(第 3 層)調用操作系統函數,傳遞一個字符串指針。操作系統函數(第 2 層)用循環的方法調用 BIOS 子程序,向其傳遞每個字符的 ASCII 碼和顏色。操作系統調用另一個 BIOS 子程序,將光標移動到屏幕的下一個位置上。BIOS 子程序(第 1 層)接收一個字符,將其映射到一個特定的系統字體,並把該字符發送到與視頻控制卡相連的硬件端口。視頻控制卡(第 0 層)爲視頻顯示產生定時硬件信號,來控制光柵掃描並顯示像素。

 

彙編語言程序在輸入輸出編程領域有着強大的能力和靈活性。它們可以從以下訪問層次進行選擇 (如下圖所示):第 3 層:調用庫函數來執行通用文本 I/O 和基於文件的 I/O。第 2 層:調用操作系統函數來執行通用文本 I/O 和基於文件的 I/O。如果 OS 使用了圖形用戶界面,它就能用與設備無關的方式來顯示圖形。第 1 層:調用 BIOS 函數來控制設備具體特性,如顏色、圖形、聲音、鍵盤輸入和底層磁盤 I/O。第 0 層:從硬件端口發送和接收數據,對特定設備擁有絕對控制權。這個方式沒有廣泛用於各種硬件設備,因此不具可移植性。不同設備通常使用不同硬件端口,因此,程序代碼必須根據每個設備的特定類型來進行定製。

彙編語言訪問層次

通用操作系統極少允許應用程序直接訪問系統硬件,因爲這樣做會使得它幾乎無法同時運行多個程序。相反,硬件只能由設備驅動程序按照嚴格控制的方式進行訪問。另一方面,專業設備的小型操作系統則常常直接與硬件相連。這樣做是爲了減少操作系統代碼佔用的內存空間,並且這些操作系統幾乎總是一次只運行單個程序。Microsoft 最後一個允許程序直接訪問硬件的操作系統是 MS-DOS,它一次只能運行一個程序。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章