第 1 章 微算機系統

1.1 微算機系統的構成

早期的計算機走過機械式、真空管和電晶體的時代,計算機的體積慢慢地縮小,即使是電晶體做的計算機也需要很大的機房才容納得下。 隨著半導體技術的發展,積體電路得以在半導體上實現,大大地縮小處理器的體積,從機房的體積變成一顆晶片的體積。 以積體電路製成的處理器叫做微處理器,而使用微處理器的計算機系統就叫做微算機系統。

微算機系統的構成分硬體與軟體兩部分。 硬體的構成是微處理器、程式記憶體、資料記憶體和輸出入介面。 軟體的構成就是作業系統。微處理器的功能是抓取指令和執行指令。程式記憶體就是這些指令儲存的地方。 微處理器本身必須支援一系列的指令集,包括算術運算指令集、邏輯運算指令集、資料搬移指令集、程式跳躍指令集以及其他特殊指令集。 每一種微處理器都有專屬的編譯器,負責將程式碼編譯成目的碼,再經過連結器將目的碼連結成執行檔或二進位檔,給微處理器執行。 程式設計師根據編譯器的功能和規範,撰寫適合於微處理器執行的程式碼,這些程式碼經過編譯和連結的過程後,產生執行檔或二進位檔。 二進位檔可以直接燒入唯讀記憶體,讓微處理器執行。執行檔必須經過作業系統的解讀,並轉換為二進位檔,讓微處理器執行。 程式執行的過程中,會讀寫資料,這時就會用到資料記憶體。 有些微處理器的程式記憶體和資料記憶體都放在同一個記憶體中,只是使用不同的記憶體區段,例如 80X86 就是這類的微處理器。 對一個可以用來執行程式的微算機系統來說,至少必需要有三個硬體元件,微處理器、程式記憶體、資料記憶體。 對一個完整的微算機系統來說,還必須有輸出入介面、資料儲存設備,甚至多媒體設備。 微算機系統是一個可以執行功能的作業環境,無論是編輯、或運算、或控制、或多媒體應用,都必需有輸出入的硬體設備,以滿足作業的需求。

微算機

1.2 個人電腦的微算機系統

這裡的個人電腦是指 IBM 相容個人電腦。IBM 相容個人電腦使用 INTEL 80X86 系列的微處理器做為電腦的中央處理器。 INTEL 當初發展微處理器的時候,將匯流排規劃成記憶體匯流排和 IO 匯流排。 記憶體匯流排的功能是執行程式和讀寫資料,而 IO 匯流排的功能是控制 IO 裝置。 記憶體的功能很單純,就是存放程式和資料。 IO 裝置的功能就豐富多了,個人電腦的所有輸出入裝置都必須透過 IO 裝置的控制才能達到。 而什麼樣的 IO 裝置會在 IO 匯流排上呢? 舉凡鍵盤、顯示卡、滑鼠、串列埠、並列埠、軟碟機和硬碟機等都是 IO 裝置,IO 裝置可以說是個人電腦的手與腳。

個人電腦微算機系統的輪廓

微算機

1.2.1 中央處理器

中央處理器的原文是 CENTRAL PROCESSOR UNIT,簡稱 CPU。 IBM 相容個人電腦的中央處理器是使用 INTEL 80X86 系列的微處理器,8088、80286、80386、80486、PENTIUM 等。 讀者可能會問,為什麼第一顆微處理器不是 8086,而是 8088 ? 其實 8086 出現得比 8088 更早,而且匯流排是 16 位元。 為了支援更便宜和比較多用到的週邊晶片,INTEL 把 8086 改版成外部匯流排為八位元的 8088。

8088 的內部跑 16 位元匯流排,外部跑 8 位元匯流排,地址線是 20 位元,可定址到 1MB 的位址範圍。 真實模式的位址範圍就是在這個時候定下的。 80286 是一顆從裏到外都是 16 位元的微處理器,地址線是 24 位元,可以定址到 16 MBYTES。 為了讓微處理器可以存取並執行 1MBYTES 以外的位址空間,INTEL 在 80286 上發明了保護模式。 只是此時的保護模式有一個缺點,就是 CPU 一但進入保護模式後,除非重新開機,否則無法回到真實模式。 這個缺點在 80386 以後的 CPU 就解決了。 INTEL 80386 是 INTEL 微處理器發展上的一個重要里程碑,因為微處理器正式進化到 32 位元。 此後,80486、PENTIUM、PENTIUM MMX 等微處理器都是 32 位元的架構,跑頻更快,指令集也更強大。


1.2.2 記憶體

記憶體的原文是 MEMORY,接在記憶體匯流排上。 記憶體匯流排使用位址線、資料線和控制線存取記憶體。 寫入記憶體時,先將位址值輸出到位址線上,再將資料放到資料線上,最後使用控制線的信號將資料寫入記憶體。 讀取記憶體時,先將位址值輸出到位址線上,再使用控制線讓記憶體的資料輸出到資料線上,最後由微處理器讀取資料線上的資料。

個人電腦使用的記憶體的硬體構成分非揮發性記憶體 (ROM) 和揮發性記憶體 (RAM)。 非揮發性記憶體如 ROM、FLASH,主要用於存放 BIOS 的程式碼。 揮發性記憶體的特性是當電源關閉時,記憶體內的資料就會消失,如 SRAM、DRAM、SDRAM、DDR、DDR2 等記憶體元件,端看記憶體控制器的支援。

在 1MBYTES 的位址範圍內,個人電腦記憶體的配置都是一樣的,有 640 KBYTES的使用者程式記憶體空間、視訊記憶體和 BIOS。 BIOS 存放電腦開機時的初始化程式碼,必須使用非揮發性記憶體儲存,早期是用 ROM 儲存,後來改用 FLASH 儲存,因為更新比較方便,不必插拔。 使用者程式記憶體空間是用來執行使用者程式的記憶體空間,視訊記憶體是螢幕控制器用來顯示螢幕文字內容的記憶體,它們的硬體構成都是揮發性記憶體。

記憶體的內容有 CODE 和 DATA。CODE 是指可以被 CPU 抓取並執行的程式。 DATA 是指程式執行時,存取的資料區域。基本上,記憶體的角色很單純,就是執行作業系統。 當執行作業系統時,CPU 從 CODE 區域抓取指令並執行指令。 當要儲存或讀取資料時,CPU 就對 DATA 區域存取資料。除非是要對 IO 裝置做控制的動作, 否則作業系統只會在 CPU 和 MEMORY 之間運作而已。


1.2.3 基本輸入輸出系統

基本輸入輸出系統的原文是 BASIC INPUT/OUTPUT SYSTEM,簡稱 BIOS。 當電腦開機時,第一時間執行的程式位址是 0xFFFF0,在這裡會放著一個跳躍指令,直接跳到 BIOS 中,執行個人電腦的開機程序。 BIOS 會依據設定,將電腦硬體逐一檢查並完成初始化的工作,完成後會將啟動磁碟的啟動磁區載入到 0x0000:0x7C00 的位址上。 之後 BIOS 便將電腦控制權交給啟動磁區。啟動磁區會呼叫 BIOS 的磁碟中斷服務,並將作業系統載入電腦執行。


1.2.3.1 記憶體配置

IBM 相容個人電腦在 1MB 內的記憶體配置是固定的。 BIOS 將電腦硬體做第一次的掃描,並將掃描結果儲存在電腦記憶體的固定位址上, 使用者程式可以讀取這些位址上的資訊,以了解硬體並控制硬體。

BIOS 記憶體配置表:

位址範圍位元組數說明
0x00000~0x003FF1024放置256個中斷向量。
0x00400~0x0044974BIOS 內部資料區,包括 COM1~4,LPT1~4,鍵盤緩衝區及其它系統資訊。
0x0044a~0x9FFFF640K-0x44A使用者程式碼區
0xA0000~0xBFFFF128K視訊記憶體
0xC0000~0xFFFFF256KBIOS 程式記憶體

1.2.3.2 中斷配置

INTEL 80X86 的中斷向量表支援 256 個中斷向量,每個中斷向量佔四個位元組。 前面 32 個中斷向量是 INTEL CPU 內定的中斷號碼和保留的中斷號碼。 第 33 個中斷向量以後的中斷號碼可以由作業系統自行設定和運用。

INTEL 80X86 CPU 中斷向量表:

中斷號碼記憶體位址功能
00x000除以 0 的錯誤中斷
10x004單步執行
20x008不可遮罩式中斷,是一個外部中斷。
30x00C單位元軟體中斷,用以設定程式的斷點。
40x010溢位中斷
50x014邊界錯誤中斷
60x018錯誤的指令
70x01CFPU 不存在
80x020雙重錯誤
90x024 FPU 節區溢位
100x028錯誤的任務狀態節區
110x02C錯誤的節區
120x030堆疊節區溢位
130x034一般保護錯誤
140x038頁錯誤
150x03C未定義的中斷向量
160x040FPU 錯誤
170x044對正錯誤
180x048機器錯誤
190x04CSIMD錯誤
20~310x050~0x07FINTEL 保留的中斷號碼
32~2550x080~0x3FF作業系統可使用的中斷號碼

IBM 相容個人電腦的外部中斷使用中斷號碼 0x08~0x0F 和 0x70~0x77。 其中 0x08~0x0F 和 INTEL CPU 的內定中斷重疊,這是 IBM 第一台個人電腦的設計。 筆者認為這是當時的軟體工程師的疏忽,沒有道理明知道和 INTEL 的內定中斷有衝突,卻硬要使用它們。 LINUX 就沒有這樣的問題,因為 LINUX 不會使用到 INTEL CPU 內定的中斷號碼。

IBM 相容個人電腦的外部中斷向量表:

中斷號碼IRQ 號碼功能
0x08IRQ 0計時器中斷
0x09IRQ 1鍵盤中斷
0x0AIRQ 2第二個 8259 的中斷
0x0BIRQ 3串列埠二中斷
0x0CIRQ 4串列埠一中斷
0x0DIRQ 5並列埠二中斷
0x0EIRQ 6軟碟機控制器中斷
0x0FIRQ 7並列埠一中斷
0x70IRQ 8 RTC 中斷
0x71IRQ 9軟體轉向到 INT 0x0A 中斷,就是被用掉的IRQ 2。
0x72IRQ 10使用者自訂
0x73IRQ 11使用者自訂
0x74IRQ 12PS/2 滑鼠中斷
0x75IRQ 13數學輔助運算器中斷
0x76IRQ 14硬碟控制器中斷
0x77IRQ 15使用者自訂

IRQ 10,11,15 在 IBM 相容個人電腦中尚未使用到,當電腦內接上擴充卡時,可以使用這些 IRQ。


1.2.4 輸出入裝置

輸出入裝置接在 IO 匯流排上。IO 匯流排和記憶體匯流排使用相同的位址線和資料線,但使用不同的控制線。 記憶體匯流排的控制線使用 MEMRD 和 MEMWR,IO 匯流排的控制線使用 IORD 和 IOWR。 相對於記憶體匯流排的功能單純,IO 匯流排的功能就顯得豐富許多。 因為輸出入裝置的功能變化很大,可以說是電腦的手腳。電腦的功能性會因為輸出入裝置的不同而天差地遠。 儘管如此,有些 IO 裝置是基本而固定的,如計時器、鍵盤、串列埠、並列埠、即時時鐘、軟碟機等。

INTEL 80X86 CPU 的 IO 定址範圍為 0x0000~0xFFFF。 其中 0x0000~0x0500 的位址範圍保留給電腦系統本身使用,而 0x0500~0xFFFF 的位址範圍可做為 IO 擴充使用。

IBM 相容電腦的 IO 裝置配置表:

位址範圍說明
0x0000~0x001FDMA控制器
0x0020~0x003F可程式中斷控制器
0x0040~0x005F計時計數器
0x0060~0x006F鍵盤控制器
0x0070~0x007F即時時鐘和 NMI 遮罩
0x0080~0x009FDMA 頁暫存器
0x00A0~0x00BF第二個中斷控制器
0x00C0~0x00DF第二個DMA控制器
0x0170~0x0177第二個ATA控制器,這是古早的ATA,現在不用了。
0x01F0~0x01F7PATA 硬碟控制器(IDE)
0x0200~0x020FGAME PORT
0x0220~0x0233音效卡
0x0278~0x027FLPT2 埠
0x02F8~0x02FFCOM2 埠
0x0300~0x031FNE100相容網路卡
0x0320~0x032FST-506 硬碟控制器
0x0370~0x0377第二個軟碟控制器
0x0378~0x037FLPT1 埠
0x03C0~0x03CFEGA 控制器
0x03D0~0x03DFCGA 控制器
0x03E8~0x03EFCOM3 埠
0x03F0~0x03F7軟碟機控制器
0x03F8~0x03FFCOM1 埠
0x0CF8~0x0CFCPCI 組態區

1.3 作業系統

第一代個人電腦出現時,作業系統的構成是比較簡單的單工作業系統,只能執行單一的任務,也因為記憶體很小,能負責的工作有限。 經過幾十個年頭的發展過程,計算機已經成為一個獨立學門,而作業系統更是這個學門裡面的重要課題。 多工的作業系統讓 CPU 的效能能夠得到更完全的利用,也衍生出更多管理上的問題,有專書在探討多工作業系統。 只是筆者有讀沒有懂,所以乾脆自己寫一個。筆者認為惟有透過實現的過程,才能經歷問題的核心,也才能真正的吸收書本中理論的知識。

本作業系統分成二個版本 FORMOSA_V1 和 FORMOSA_V2。 這二個版本的作業系統都有系統區、多工核心、驅動程式、中介軟體、應用程式和任務群。


1.3.1 FORMOSA_V1

FORMOSA_V1 提供一個命令列介面,讓使用者可以下指令。

微算機

FORMOSA_V1 的內容:

名稱說明
系統區 (SYSTEM)作業系統的入口。系統區程式的工作有保護模式設定、全域描述子設定、中斷描述子設定並執行多工核心。
多工核心 (OS)工作有任務管理、任務排程、事件管理、資源管理和時間管理。
驅動程式 (DRIVERS)目前支援數種硬體裝置,有中斷控制器、計時計數器、串列埠控制器、並列埠控制器、鍵盤控制器、軟碟機控制器、即時時鐘控制器和螢幕控制器。
中介軟體 (MIDDLEWARE)目前有 CONSOLE、XMODEN、GUI。
任務群 (TASKS)SHELLTASK、TASKA、TASKB、COM2TASK、LPTTASK、RTCTASK、MOUSETASK。


1.3.2 FORMOSA_V2

FORMOSA_V2 是 FORMOSA_V1 的視窗版本,提供一個桌面視窗系統。

微算機

FORMOSA_V2 的內容:

名稱說明
系統區 (SYSTEM)作業系統的入口。系統區程式的工作有保護模式設定、全域描述子設定、中斷描述子設定並執行多工核心。
多工核心 (OS)工作有任務管理、任務排程、事件管理、資源管理和時間管理。
驅動程式 (DRIVERS)目前支援數種硬體裝置,有中斷控制器、計時計數器、串列埠控制器、並列埠控制器、鍵盤控制器、軟碟機控制器、即時時鐘控制器和螢幕控制器。
中介軟體 (MIDDLEWARE)目前有 CONSOLE、XMODEN。
應用程式 (APPLICATIONS)目前有 DESK、CALCULATOR、BOMB、BEE。
任務群 (TASKS)DESKTASK、SHELLTASK、BOMBTASK、BEETASKB、CALCULATORTASK。

筆者思考著該如何說明多工作業系統,想了想,決定以執行的先後次序來說明作業系統工作的方式和原理。 作業系統的啟動次序是啟動磁區,中央處理器工作模式轉換,運行作業系統核心。 本作業系統有三個啟動磁區程式,二個負責啟動作業系統和一個負責安裝作業系統。 中央處理器工作模式轉換是真實模式轉換到保護模式的過程。 作業系統核心包含系統區程式、多工核心、驅動程式、中介軟體和應用程式等部分。 在後面的章節中,會以程式碼為主角,說明的文字為配角,解說作業系統的每個部分。


1.4 作業系統的啟動程序

當電腦的電源按鍵按下,開始啟動電腦時,電腦會先從 BIOS 開始執行。 CPU 會跳到 0x000FFFF0 的位址上執行 BIOS。BIOS 啟動完成後,會依據設定,到啟動磁碟載入啟動磁區。 啟動磁碟可以是軟碟機、光碟機、硬碟機、USB磁碟機。 啟動磁區會繼續載入作業系統的映像,執行作業系統的映像。


1.4.1 作業系統映像的啟動

作業系統映像的啟動次序是模式轉換、啟動多工核心、執行作業系統的任務。

模式轉換將CPU從真實模式轉換成保護模式,最後跳入作業系統核心的入口點,準備執行多工核心。

多工核心的啟動是在 C 語言入口點呼叫多工核心初始化函式,建立多工核心根任務,並呼叫啟動函式啟動多工核心。 啟動多工核心就是執行多工核心根任務。

多工核心根任務會執行驅動程式的初始化工作。 之後,建立 SHELL 任務,完成 FORMOSA_V1 多工作業系統的啟動。 或者建立 DESK 任務,完成 FORMOSA_V2 視窗多工作業系統的啟動。