第一章 硬件基礎與軟件基礎
1.1 硬件基礎
操作系統必須和作為起基礎的硬件系統緊密地協同工作。操作系統需要只有硬件能提供的特定服務。為了完全理解linux 操作系統,需要了解她下層的硬件基礎知識。本節將簡短介紹該硬件:現在PC。
第一章 硬件基礎與軟件基礎
1.1 硬件基礎
操作系統必須和作為起基礎的硬件系統緊密地協同工作。操作系統需要只有硬件能提供的特定服務。為了完全理解linux 操作系統,需要了解她下層的硬件基礎知識。本節將簡短介紹該硬件:現在PC。
當以Altair8080機器的圖解作為封面的1975年1月份的《大眾電子》雜志印刷時,一場“革命”開始了。家庭電子愛好者僅花397美元就可以組裝出一臺以早些時候的電影“星際履行”中的一個目的地而命名的Altair8080。它的Intel8080處理器和256字節的存儲器而沒有屏幕和鍵盤用今天的標準看來是多么弱小。它的發明者Ed.Roberts創造了“個人計算機”一詞來描述自己的新發明,但今天PC一詞被用來指幾乎任何你不需幫助就可以得到的計算機。從這個定義上說,甚至一些具有強大能力的Alpa AXP系統也是PC。
狂熱的黑客們看到Altair的潛力并開始為它寫軟件和建造硬件。對于這些早期的先行者來說,它代表著自由:不用在巨大的批處理大型機系統上運行和被“精英們”監視的自由。許多被這種新東西—— 一臺可以放在家中廚房里桌子上的計算機迷住的大學輟學者一夜之間而暴富。許多硬件出現了,在某種程度上都不相同,而軟件黑客很樂意為這些新機器寫軟件。然而IBM堅實的建造了現代PC的模型,它們1981年發布IBM PC并于1982年早期開始銷售給客戶。它有Intel8088處理器,64KB內存(可擴充至256KB)、兩個軟盤和一個25巷80字符的彩色徒刑適配器(CGA),這在今天的標準看來仍不很強大但卻銷售的很好。接著是1983年的IBM PC-XT,有了“奢侈”的10MB字節硬盤。不久,許多諸如Compaq這樣的公司在一個不斷增長的市場中一起競爭,PC的體系結構成為一個事實標準。這個事實標準有助于許多的硬件公司在一個不斷增長的市場中一起競爭,從而保持價格很低,使消費者受益。這些早期PC的許多系統結構特征一起保持到當今的PC。例如,即使是最強大的基于Intel Pentium Pro的東西時,就選擇了最普遍和合理價格的硬件,Intel80386 PC。
從PC的外面看來,最明顯的不見是機箱、鍵盤、鼠標和圖形監視器。機箱前面是一些按鈕、一個數字的小顯示器個一個軟驅?,F在的大多數系統有CD-ROM,并且如果你覺得有必要保護數據的話還可以有一臺磁帶驅動器做備份用。這些設備被統稱做外設。
盡管CPU在總體上控制系統,它并非唯一的智能設備。所有的外設控制器,比如IDE控制器,都具有一定的智能。在PC內部,有一塊主板,上面有CPU或稱微處理器、內存條插槽和一些ISA或PCI外設控制器的插槽。有些控制器,如IDE磁盤控制器可以直接建在系統主板上。
1.1.1 CPU
CPU或叫微處理器,是計算機系統的心臟。微處理器通過從內存中讀取指令并執行進行
計算、邏輯操作以及數據流管理。在早期計算中微處理器的功能部件是分離的 (物理上很大的)
單元。就是那時創造了中央處理單元 (Central Processing Units)的術語?,F代的微處理器把這
些部件組合在蝕刻于很小的硅片上的集成電路中。 CPU、微處理器(microprocessor)、處理器
(processor)三個詞在本書中通用。
微處理器操作由0和1組成的二進制數據,這些 0和1對應于電子開關的打開或關閉。如十
進制的42表示“4個10和2個1”,一個二進制數是表示 2的冪的一串二進制數。在這里冪是指
一個數乘以自身的次數。 10的1次冪(101)是10,10的2次冪(102)是10×10,10的三次冪(103)是
10×10×10,依此類推。二進制 0001是十進制 1,二進制 0010是十進制 2,二進制 0011是3,
二進制0100是4,等等。這樣,十進制 42的二進制就是101010即(2+8+32或21+23+25)。在計算
機程序中通常不用二進制表示數據,而用另一種基數,十六進制表示。在這種表示下,每個
數位表示一個16的冪。因為十進制數只有 0到9,數10到15用字母A、B、C、D、E、F表示成
單個數位。例如,十六進制 E是十進制14,十六進制2A是十進制42(兩個16加上10)。用C語言
的表示方法 (正如在本書通篇中所做的 ),十六進制要加前綴“ 0x”;十六進制數 2A被寫作
0x2A。
微處理器可以進行算術運算,如加、減、乘、除和邏輯運算,如“ X是否比Y大?”。
處理器的執行被外部時鐘所驅動。這個時鐘,即系統時鐘,產生規則的時鐘脈沖到處理
器,而處理器在每一個時鐘脈沖做一些工作。比如,處理器可以在每個時鐘脈沖執行一條指
令。處理器的速度用系統時鐘跳動的速度來描述。一個 100MHz的處理器每秒鐘將收到 100
000 000個時鐘脈沖。用時鐘脈沖來描述 CPU的能力有誤導性,因為不同的處理器在一個時鐘
脈沖期間完成不同量的工作。但是,在其它所有東西都一樣時,速度更快的時鐘意味著計算
能力更強的處理器。處理器執行的指令都很簡單,比如像“將存儲器 X位置的內容讀到Y寄存
器”。寄存器是微處理器的內部存儲區,用來存儲數據和在其上面執行操作。執行的操作可能
會引起停下它正在做的東西并跳轉到存儲器中其它地方的某條指令。這些微小的組成單元賦
予當今的微處理器幾乎無窮的能力,它們能夠每秒鐘執行數百萬條甚至上十億條指令。
指令在執行前必須先從存儲器中取出。指令自身可以引用存儲器中的數據,該數據必須
被從存儲器中取出并在適當的時候存回去。
微處理器內部的寄存器的大小、數量和類型完全取決于微處理器的類型。 Intel 80486處理
器和Alpha AXP處理器就有不同的寄存器集;首先, Intel的是32位寬,而Alpha AXP的是64位
寬。一般說來,任何微處理器都會有一定數量的通用寄存器和少量的專用寄存器。大多數處理器有以下的專用寄存器:
程序計數器(Program Counter,PC):該寄存器包含將被執行的下條指令的地址。每當一條
指令取出后PC的值將被自動增量。
棧指針(Stack Pointer,SP):處理器必須能夠存取大量的外部隨機讀 /寫存儲器(RAM),以
存儲臨時數據。棧就是一種在外部存儲器中方便地存儲和恢復數據的方式。通常處理器有專
門指令讓你把值壓到棧上,并在晚些時候將它們彈出。棧工作于后進先出 (Last In First Out,
LIFO)的基礎上。也就是說,如果你壓兩個值,即 X和Y到棧上,然后彈出一個值,將會得到
后壓進的Y的值。
有些處理器的棧朝存儲器頂端向上增長,而另一些朝存儲器底端即基端向下增長。有的
處理器支持這兩種,比如ARM。
處理器狀態(Processor Status,PS):指令可能產生結果;比如“寄存器 X的值是否大于寄存
器Y的值”將產生真或假作為結果。 PS寄存器保存這種和其它的當前處理器的狀態信息。例
如,大部分處理器至少有兩種操作模式,核心 (或管理)模式和用戶模式。 PS寄存器中保留有
識別當前操作模式的信息。
1.1.2 存儲器
所有系統都有一個存儲器層次結構,在這個層次結構的不同層上有不同速度和大小的存
儲器。速度最快的存儲器就是我們所知道的高速緩存。就像聽起來的那樣,它是用來暫時保
留或緩存主存儲器內容的存儲器。這種存儲器速度很快但也很貴,所以大多數系統有少量的
片上(on-chip)緩存和稍多的系統級(板上)緩存。有的處理器用一個緩存保存指令和數據,但其
它的處理器有兩個緩存,一個指令緩存和一個數據緩存。 Alpha AXP處理器就有兩個內部緩
存:一個是數據的(D-Cache),一個是指令的(I-Cache)。外部緩存(B-Cache)將兩者合在了一起。
最后是主存儲器,相對于外部緩存來說是很慢的。相對于 CPU片上緩存,主存慢得就像爬一
樣。
高速緩存和主存儲器必須保持同步 (一致)。也就是說,如果主存儲器的一個字保存在高速
緩存的一個或多個位置,則系統必須要保證高速緩存和主存儲器的內容是相同的。高速緩存
一致性的工作一部分由硬件完成,一部分由操作系統完成,許多主要的系統任務也是這樣,
要求硬件和軟件緊密配合來達到目標。
1.1.3 總線
系統主板上的單個部件通過被稱為總線 (bus)的許多系統連接通路相連。系統總線在邏輯
功能上分為三類:地址總線、數據總線和控制總線。地址總線用來為數據傳送指明存儲器位
置(地址)。數據總線保持傳送的數據。數據總線是雙向的,它允許數據讀入到 CPU和從CPU寫
出??刂瓶偩€包括各種各樣的線路用來在系統中傳送定時和控制信號。存在許多種總線,像
ISA和PCI就是連接外設到系統的常用總線方式。
1.1.4 控制器和外設
外設是實在的設備,像圖形卡或磁盤。它們受系統主板上的控制器芯片或插到主板上的
控制器卡的控制。IDE磁盤用IDE控制器芯片控制、SCSI磁盤用SCSI磁盤控制器芯片控制等等
這些控制器通過一組總線連接到 CPU及相互連接。大部分現在制造的系統使用 PCI和ISA總線連接主要的系統部件??刂破魇窍?CPU一樣的處理器,它們可以被看作 CPU的智能化助手。
CPU對系統整體進行控制。
所有的控制器都不相同,但通常都有一些寄存器控制它們。在 CPU上運行的軟件必須能
夠讀寫這些控制寄存器。一個寄存器可能包含描述出錯狀態的信息。另一個可能被用作控制
目的,來改變控制器的模式??偩€上的每個控制器可以被 CPU單獨尋址,這樣軟件的設備驅
動程序能夠寫到它的寄存器中以控制它。 IDE ribbon就是個很好的例子,它賦予你單獨訪問總
線上每個驅動器的能力。另一個不錯的例子是 PCI總線,允許每個設備(如圖形卡)獨立地被訪
問。
1.1.5 地址空間 系統中連接CPU和主存的總線與連接 CPU和系統的硬件外設的總線是分開的。硬件外設 所占用的存儲器空間被總稱為I/O空間。I/O空間本身可以再細分下去,但我們現在先不用考慮 那么多。CPU能夠存取系統空間存儲器和 I/O空間存儲器,而控制器自身只有在 CPU的幫助下 間接地訪問系統存儲器。從設備的角度,比如軟盤控制器,它只能看到自己的控制寄存器所 在的空間(ISA),而不能看到系統存儲器。典型情況是, CPU有分開的指令訪問存儲器和I/O空 間。例如,可能有一條指令要“從 I/O地址0x3f0讀一個字節到寄存器 X中?!盋PU就是這樣控 制系統的硬件外設—通過讀寫它們在I/O空間中的寄存器。在PC體系結構發展的這么多年里, 一般的外設(IDE控制器、串口、硬盤控制器等 )的寄存器在什么地方(地址)已經成為習慣。I/O 空間地址0x3f0正好是一個串口(COM1)的控制寄存器地址。 有時控制器需要直接讀或寫系統存儲器中的大量數據,例如用戶數據被寫到硬盤時。在 這種情況下,直接存儲器訪問 (Direct Memory Aclearcase/" target="_blank" >ccess,DMA)控制器將被使用以允許硬件外設 直接訪問內存,但這種訪問是處在 CPU的嚴格控制和管理之下的。 |
1.1.6 時鐘
所有的操作系統都需要知道時間,所以當代 PC都包含一個特殊的外設叫實時時鐘 (Real Time Clock,RTC)。它提供兩樣東西:一個可*的日期時間和一個準確的定時間隔。 RTC有自己的電池,所以當PC斷電的時候它繼續運行,這就是為什么你的 PC總是知道正確的日期和時間的原因。間隔定時器允許操作系統準確地調度必需的工作。
1.2 軟件基礎
程序是完成特定任務的計算機指令集合。程序可以用匯編,一種很低級的計算機語言寫成,也可以用高級的、與機器無關的語言比如 C語言寫成。操作系統是一個特殊的程序,使用戶能夠運行像表格或字處理這樣的應用程序。本節介紹基本編程原理并給出操作系統的功能和目標的一個概述。
1.2.1 計算機語言
1. 匯編語言
CPU從主存取出并執行的指令對于人是根本不能理解的。它們是機器代碼,精確地告訴
機器干什么。十六進制數0x89E5是一條Intel 80486指令,將ESP寄存器的內容拷貝到EBP寄存
器中。為最早的計算機發明的軟件工具之一是匯編器,一個輸入人可讀的源文件并把它匯編
成機器代碼的程序。匯編語言顯式地處理寄存器和對數據的操作,并且它們是針對特定微處
理器的。Intel X86微處理器的匯編語言與Alpha AXP微處理器的匯編語言有很大差別。下面的
Alpha AXP匯編代碼展示了一個程序可能執行的操作:
ldr r16, (r15) : 第一行
ldr r17, 4(r15) : 第二行
beq r16,r17,100 : 第三行
str r17, (r15) : 第四行
100: : 第五行
第一個語句(第一行)從寄存器15保存的地址裝載寄存器16。下一條指令從存儲器下一個位置裝載寄存器17。第三行比較寄存器16和寄存器17的內容,如果它們相等,就轉移到標號100。如果寄存器中的值不等則程序繼續執行第 4行,將寄存器17的內容存到存儲器。如果寄存器確實給相同內容則不必存儲任何數據。匯編程序冗長、難寫而又易于出錯。 Linux內核只有很少一部分是為了高效而用匯編語言寫的,那些部分是針對特定微處理器的。
2. C語言和編譯器 x - y; 執行和前面例子的匯編代碼一模一樣的操作。如果變量 x的內容和變量 y的內容不相同,
|
3. 連接器 1.2.2 什么是操作系統 1. 存儲器管理 $ ps 174 pRe 1 0:00 sh /usr/X11R6/lib/bin/stattx ...... 3270 pp6 03 0:00 ps $
3. 設備驅動程序 1.2.3 內核數據結構 1. 鏈表 (持續更新中....) |
原文轉自:http://www.anti-gravitydesign.com