Linux Kernel 核心中文手冊(1)--硬件基礎

Hardware Basic( 硬件基礎知識 )
 
    一個操作系統必須和作爲它的基礎的硬件系統緊密配合。操作
系統需要使用一些只有硬件才能提供的功能。爲了完整的瞭解 Linux ,
你需要了解底層硬件的基礎知識。本章對於現代 PC 的硬件進行了。
 
    1975 年 1 月“ Popular Electronics ”雜誌封面上印出了
Altair 8080 的圖片,一場革命開始了。 Altair 8080 ,跟隨早期
的“ Star Trek epsode ”命名,只需要 $397 ,就可由個人電子愛
好者自己組裝。它擁有 Intel 8080 處理器和 256 字節內存,但是
沒有屏幕和鍵盤。以今天的標準來衡量,它太簡陋了。它的發明者,
Ed Roberts ,製造了名詞“ personal computer “來命名他的發明,


但現在, PC這個名詞已經用來命名幾乎所有你可以不依靠幫助就可以
自己運行起來的計算機。用這個定義,甚至一些十分強大的 Alpha AXP
系統也是 PC 。
 
    愛好者們看到了 Altair
的潛力,開始爲它寫軟件,製造硬件。對於這些早期的先驅來講,它
代表着自由:從被神職人員控制和運行的大型批處理的主機系統中逃
脫出來的自由。你可以在自己家裏甚至廚桌上擁有計算機,這使學院
的退學生爲此着迷並通宵達旦。與此同時出現大量硬件,在一定程度
上各自不同,而軟件專家則樂於爲這些新機器撰寫軟件。有諷刺意味
的是, IBM 在 1981 年發佈了 IBM PC 並於 1982 年早期供貨,從此
定義了現代 PC 的模型。它擁有 Intel 8088 處理器, 64K 內存
(可以擴充到 256K ),兩個軟驅和一個 80x25 的彩色圖卡 (CGA)
,用今天的標準衡量,它功能不算很強,但是它銷售的不錯。 1983 年,
緊接着推出的 IBM PC-XT ,則擁有一個豪華的 10M 硬盤。不久大批公
司如 Compaq 開始製造 IBM PC 的複製品, PC 的結構成爲了事實的
標準。這個事實的標準使大批硬件公司可以在這個不斷增長的市場上
一起競爭,反過來,可以遏制價格,讓用戶滿意。現代 PC 承襲了早
期 PC 的許多系統體系特徵。甚至基於最強大的 Intel Pentium Pro
的系統也可以運行 Intel 8086 的尋址模式。當 Linus Torvalds 開
始開發後來的 Linux 時,他選擇了當時最常見和價格最合理的硬件平
臺:一臺 Intel 80386 PC 。


 
從 PC 的外面看,最明顯的部件就是機箱、鍵盤、鼠標和顯示器。在
機箱的前面有一些按鈕,一個小屏幕顯示一些數字,還有一個軟驅。現
在的大多數系統還有一個 CD-ROM 期、驅動器。如果你需要保護你的數
據,那麼還會有一個備份用的磁帶機。這些設備一律被看作外設。
 
雖然 CPU 管理整個系統,但它並不是唯一的智能設備。所有的外設控
制器,例如 IDE 控制器,也都擁有一定程度的智能。在 PC 內部
(圖 1.1 ),你可以看到一個主板,包括 CPU 或微處理器、內存和一
些 ISA 或 PCI 外設控制卡的槽位。其中一些控制器,如 IDE
磁盤控制器可能內置在系統主板上。  
 
 
CPU
 
 
CPU,或者說微處理器,是所有計算機系統的心臟。微處理器進行數學運
算,邏輯操作並從內存中讀取指令並執行指令,進而控制數據流向。計算
機發展的早期,微處理器的各種功能模塊是由相互分離(並且尺寸上十分
巨大)的單元構成。這也是名詞“中央處理單元”的起源。現代的微處
理器將這些功能模塊集中在一塊非常小的硅晶片製造的集成電路上。在本
書,名詞 CPU 、微處理器和處理器交替使用。


 
   微處理器處理二進制數據:這些數據由 1 和 0 組成。這些 1 和 0 對
應電氣開關的開或關。就好像 42 代表 4 個 10 和 2 個單元,二進制數字
由一系列代表 2 的冪數的數字組成。這裏,冪數意味着一個數字用自身相
乘的次數。 10 的一次冪是 10 , 10 的 2 次冪是 10x10 ,
10 的 3 次冪是 10x10x10 ,依此類推。二進制 0001 是十進制 1 ,二進
制數 0010 是十進制 2 ,二進制 0011 是十進制 3 ,二進制 0100 是十進
制 4 ,等等。所以,十進制 42 是二進制 101010 或者( 2+8+32 或 21+23+25
)。在計算機程序除了使用二進制表示數字之外,另一種基數, 16 進制,
也經常用到。在這種進制中,每一位數字表示 16 的冪數。因爲十進制數字
只是從 0 到 9 ,在十六進制中 10 到 15 分別用字母 A , B , C , D ,
E , F 表示。例如,十六進制的 E 是十進制的 14 ,而十六進制的 2A 是
十進制的 42 ( 2 個 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 )。堆棧是一種用於在外部內存中存放和恢復臨時數據的方法。通常,處
理器提供了特殊的指令用於將數據壓在堆棧中,並在以後需要是取出來。堆棧使用
LIFO (後進先出)的方式。換句話說,如果你壓入兩個值 x 和 y 到堆棧中,然後
從堆棧中彈出一個值,那麼你會得到 y 的值。
 
一些處理器的堆棧向內存頂部增長,而另一些向內存的底部增長。還有一些處理器
兩種方式都可以支持,例如: ARM 。
 
Processor Status ( PS )
 
    指令可能產生結果。例如:“ X 寄存器的內容是否大於 Y 寄存器的內容?“
可能產生真或假的結果。 PS 寄存器保留這些結果以及處理器當前狀態的其他信息。
多數處理器至少有兩種模式: kernel (核心態)和 user (用戶態), PS
寄存器會紀錄能夠確定當前模式的那些信息。
 
Memory( 內存 )
    所有系統都具有分級的內存結構,由位於不同級別的速度和容量不同的內存組成。
 
    最快的內存是高速緩存存儲器,就象它的名字暗示的一樣 -


用於臨時存放或緩存主內存的內容。這種內存非常快但是比較昂貴,因此多數處理器
芯片上內置有少量的高速緩衝存儲器,而大多數高速緩存存儲器放在系統主板上。一
些處理器用一塊緩存內存同時緩存指令和數據,而另一些處理器有兩塊緩存內存 - 一
個用於指令,另一個用於數據。 Alpha AXP 處理器有兩個內置的內存高速緩存存儲器:
一個用於數據( D-Cache ),另一個用於指令( I-Cache )。它的外部高速緩衝存
儲器(或 B-Cache )將兩者混在一起。
 
    最後一種內存是主內存。相對於外部高速緩存存儲器而言速度非常慢,對於 CPU
內置的高速緩存存儲器,主內存簡直是在爬。
高速緩存存儲器和主內存必須保持同步(一致)。換句話說,如果主內存中的一個字
保存在高速緩存存儲器的一個或多個位置,那麼系統必須保證高速緩存存儲器和主內
存的內容一樣。使高速緩衝存儲器同步的工作一部分是由硬件完成,另一部分則是由
操作系統完成的。對於其它一些系統
的主要任務,硬件和軟件也必須緊密配合。
 
Buses (總線)
 
    系統板的各個組成部分由被稱爲總線的連接系統互連在一起。系統總線分爲三種
邏輯功能:地址總線、數據總線和控制總線。地址總線指定了數據傳輸的內存位置(
地址),數據總線保存了傳輸的數據。數據總線是雙向的,它允許 CPU 讀取,也允許
CPU 寫。控制總線包含了各種信號線用於在系統中發送時鐘和控制信號。有許多種不
同的總線類型, ISA 和 PCI 總線是系統用於連接外設的常用方式。


 
Controllers and Peripherals (控制器和外設)
    外設指實在的設備,如由系統板或系統板插卡上的控制芯片所控制的圖形卡或磁盤。
 IDE 控制芯片控制 IDE 磁盤,而 SCSI 控制芯片控制 SCSI 磁盤。這些控制器通過不
同的總線連接到 CPU 並相互連接。現在製造的大多數系統都是用 PCI 或 ISA 總線將
系統的主要部件連接在一起。控制器本身也是象 CPU 一樣的處理器,它們可以看作
CPU 的智能助手, CPU 擁有系統的最高控制權。
 
    所有的控制器都是不同的,但是通常它們都有用於控制它們的寄存器。 CPU 上運
行的軟件必須能夠讀寫這些控制寄存器。一個寄存器可能包含描述錯誤的狀態碼,另一
個寄存器可能用於控制用途,改變控制器的模式。一個總線上的每一個控制器都可以分
別被 CPU 尋址,這樣軟件設備驅動程序就可以讀寫它的寄存器進而控制它。 IDE 電
纜是一個好例子,它給了你分別存取總線上每一個驅動器的能力。另一個好例子是 PCI
總線,允許每一個設備(如圖形卡)被獨立存取。
 
Address Spaces (尋址空間)
    連接 CPU 和主內存的系統總線以及連接 CPU 和系統硬件外設的總線是分離的。
硬件外設所擁有的內存空間稱爲 I/O 空間。 I/O 空間本身可以再進一步劃分,但是
我們現在先不討論。 CPU 可以訪問系統內存空間和 I/O 空間,而控制器只能通過
CPU 間接訪問系統內存。從設備的角度來看,比如軟驅控制器,它只能看到它的控制
寄存器所在的地址空間( ISA ),而非系統內存。一個 CPU 用不同的指令去訪問內存
和 I/O 空間。例如,可能有一條指令是“從 I/O 地址 0x3f0 讀取一個字節到 X 寄存


器“。這也是 CPU 通過讀寫系統硬件外設處於 I/O 地址空間的寄存器從而控制外設的
方法。在地址空間中,普通外設(如 IDE 控制器,串行端口,軟驅控制器等等)的寄
存器在 PC 外設的多年發展中已經成了定例。 I/O 空間的地址 0x3f0 正是串行口
( COM1 )的控制寄存器的地址。
 
    有時控制器需要直接從系統內存讀取大量內存,或直接寫大量數據到系統內存中
去。比如將用戶數據寫到硬盤上去。在這種情況下,使用直接內存存取( DMA )控制
器,允許硬件設備直接存取系統內存,當然,這種存取必須在 CPU 的嚴格控制和監管
下進行。
 
 
Timer( 時鐘 )
 
    所有操作系統需要知道時間,現代 PC 包括一個特殊的外設,叫做實時時鐘
( RTC )。它提供了兩樣東西:可靠的日期和精確的時間間隔。 RTC 有自己的電池,
所以即使 PC 沒有加電,它仍在運行。這也是爲什麼 PC 總是“知道”正確的日期
和時間。時間間隔計時允許操作系統精確地調度基本工作。
 

發佈了0 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章