?? linu家園-linux kernel核心中文手冊.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0061)http://home.lzu.edu.cn/hx/linuxdevelop/linuxkerneldevelop.htm -->
<HTML><HEAD><TITLE>linu家園-Linux Kernel核心中文手冊</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.2668" name=GENERATOR></HEAD>
<BODY text=#000000 bgColor=#ffffff>Linux Kernel核心中文手冊<BR>Chapter 1
<P> </P>
<P>Hardware Basic(硬件基礎知識)</P>
<P> </P>
<P>一個操作系統必須和作為它的基礎的硬件系統緊密配合。操作系統需要使用一些只有硬件才能提供的功能。為了完整的了解Linux,你需要了解底層硬件的基礎知識。本章對于現代PC的硬件進行了。</P>
<P>1975年1月“Popular Electronics”雜志封面上印出了Altair 8080的圖片,一場革命開始了。</P>
<P>Altair 8080,跟隨早期的“Star Trek epsode”命名,只需要$397,就可由個人電子愛好者自己組裝。它擁有Intel
8080處理器和256字節內存,但是沒有屏幕和鍵盤。以今天的標準來衡量,它太簡陋了。它的發明者,Ed Roberts,制造了名詞“personal
computer“來命名他的發明,但現在,PC這個名詞已經用來命名幾乎所有你可以不依靠幫助就可以自己運行起來的計算機。用這個定義,甚至一些十分強大的Alpha
AXP系統也是PC。</P>
<P>愛好者們看到了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。</P>
<P>從PC的外面看,最明顯的部件就是機箱、鍵盤、鼠標和顯示器。在機箱的前面有一些按鈕,一個小屏幕顯示一些數字,還有一個軟驅。現在的大多數系統還有一個CD-ROM期、驅動器。如果你需要保護你的數據,那么還會有一個備份用的磁帶機。這些設備一律被看作外設。</P>
<P>雖然CPU管理整個系統,但它并不是唯一的智能設備。所有的外設控制器,例如IDE控制器,也都擁有一定程度的智能。在PC內部(圖1.1),你可以看到一個主板,包括CPU或微處理器、內存和一些ISA或PCI外設控制卡的槽位。其中一些控制器,如IDE磁盤控制器可能內置在系統主板上。</P>
<P> </P>
<P><BR>CPU</P>
<P> </P>
<P>CPU,或者說微處理器,是所有計算機系統的心臟。微處理器進行數學運算,邏輯操作并從內存中讀取指令并執行指令,進而控制數據流向。計算機發展的早期,微處理器的各種功能模塊是由相互分離(并且尺寸上十分巨大)的單元構成。這也是名詞“中央處理單元”的起源。現代的微處理器將這些功能模塊集中在一塊非常小的硅晶片制造的集成電路上。在本書,名詞CPU、微處理器和處理器交替使用。
微處理器處理二進制數據:這些數據由1和0組成。這些1和0對應電氣開關的開或關。就好像42代表4個10和2個單元,二進制數字由一系列代表2的冪數的數字組成。這里,冪數意味著一個數字用自身相乘的次數。10
的一次冪是10,10的2次冪是10x10,10的3次冪是10x10x10,依此類推。二進制0001是十進制1是十進制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。</P>
<P> </P>
<P></P>
<P>微處理器可以執行算術運算如加、乘和除,也可以執行邏輯操作例如“X是否大于Y”。</P>
<P>處理器的執行由外部時鐘控制。這個時鐘,即系統時鐘,對處理器產生穩定的時鐘脈沖,在每一個時鐘脈沖里,處理器執行一些工作。例如,處理器可以在每一個時鐘脈沖里執行一條指令。處理器的速度用系統時鐘的頻率來描述。一個100Mhz的處理器每秒鐘接受到100,000,000次時鐘脈沖。用時鐘頻率來描述CPU的能力是一種誤解,因為不同的處理器在每一次時鐘脈沖中執行的工作量不同。雖然如此,如果所有的條件同等,越快的時鐘頻率表示處理器的能力越強。處理器執行的指令非常簡單,例如:“把內存位置X的內容讀到寄存器Y中“。寄存器是微處理器的內部存儲空間,用來存儲數據并進行操作。執行的操作可能使處理器停止當前操作而轉去執行內存中其他地方的指令。正是這些微小的指令集合在一起,賦予現代的微處理器幾乎無限的能力,因為它每秒可以執行數百萬甚至數十億的指令。</P>
<P> </P>
<P>執行指令時必須從內存中提取指令,指令自身也可能引用內存中的數據,這些數據也必須提取到內存中并在需要的時候保存到內存中去。</P>
<P> </P>
<P>一個微處理器內部寄存器的大小、數量和類型完全決定于它的類型。一個Intel 80486處理器和一個Alpha
AXP處理器的寄存器組完全不同。另外,Intel是32位寬而Alpha
AXP是64位寬。但是,一般來講,所有特定的處理器都會有一些通用目的的寄存器和少量專用的寄存器。大多數處理器擁有以下特殊用途的專用的寄存器:</P>
<P> </P>
<P>Program Counter(PC)程序計數器</P>
<P>這個寄存器記錄了下一條要執行的指令的地址。PC的內容在每次取指令的時候自動增加。</P>
<P>Stack Pointer(SP)堆棧指針</P>
<P>處理器必須能夠存取用于臨時存儲數據的大容量的外部讀寫隨機存取內存(RAM)。堆棧是一種用于在外部內存中存放和恢復臨時數據的方法。通常,處理器提供了特殊的指令用于將數據壓在堆棧中,并在以后需要是取出來。堆棧使用LIFO(后進先出)的方式。換句話說,如果你壓入兩個值x和y到堆棧中,然后從堆棧中彈出一個值,那么你會得到y的值。</P>
<P>一些處理器的堆棧向內存頂部增長,而另一些向內存的底部增長。還有一些處理器兩種方式都可以支持,例如:ARM。</P>
<P> </P>
<P>Processor Status(PS)</P>
<P>指令可能產生結果。例如:“X寄存器的內容是否大于Y寄存器的內容?“可能產生真或假的結果。PS寄存器保留這些結果以及處理器當前狀態的其他信息。多數處理器至少有兩種模式:kernel(核心態)和user(用戶態),PS寄存器會紀錄能夠確定當前模式的那些信息。</P>
<P> </P>
<P><BR>Memory(內存)</P>
<P> </P>
<P>所有系統都具有分級的內存結構,由位于不同級別的速度和容量不同的內存組成。</P>
<P>最快的內存是高速緩存存儲器,就象它的名字暗示的一樣-用于臨時存放或緩存主內存的內容。這種內存非常快但是比較昂貴,因此多數處理器芯片上內置有少量的高速緩沖存儲器,而大多數高速緩存存儲器放在系統主板上。一些處理器用一塊緩存內存同時緩存指令和數據,而另一些處理器有兩塊緩存內存-一個用于指令,另一個用于數據。Alpha
AXP處理器有兩個內置的內存高速緩存存儲器:一個用于數據(D-Cache),另一個用于指令(I-Cache)。它的外部高速緩沖存儲器(或B-Cache)將兩者混在一起。</P>
<P>最后一種內存是主內存。相對于外部高速緩存存儲器而言速度非常慢,對于CPU內置的高速緩存存儲器,主內存簡直是在爬。</P>
<P>高速緩存存儲器和主內存必須保持同步(一致)。換句話說,如果主內存中的一個字保存在高速緩存存儲器的一個或多個位置,那么系統必須保證高速緩存存儲器和主內存的內容一樣。使高速緩沖存儲器同步的工作一部分是由硬件完成,另一部分則是由操作系統完成的。對于其它一些系統的主要任務,硬件和軟件也必須緊密配合。</P>
<P> </P>
<P><BR>Buses(總線)</P>
<P>系統板的各個組成部分由被稱為總線的連接系統互連在一起。系統總線分為三種邏輯功能:地址總線、數據總線和控制總線。地址總線指定了數據傳輸的內存位置(地址),數據總線保存了傳輸的數據。數據總線是雙向的,它允許CPU讀取,也允許CPU寫。控制總線包含了各種信號線用于在系統中發送時鐘和控制信號。有許多種不同的總線類型,ISA和PCI總線是系統用于連接外設的常用方式。</P>
<P> </P>
<P><BR>Controllers and Peripherals (控制器和外設)</P>
<P> </P>
<P>外設指實在的設備,如由系統板或系統板插卡上的控制芯片所控制的圖形卡或磁盤。IDE控制芯片控制IDE磁盤,而SCSI控制芯片控制SCSI磁盤。這些控制器通過不同的總線連接到CPU并相互連接。現在制造的大多數系統都是用PCI或ISA總線將系統的主要部件連接在一起。控制器本身也是象CPU一樣的處理器,它們可以看作CPU的智能助手,CPU擁有系統的最高控制權。</P>
<P> </P>
<P>所有的控制器都是不同的,但是通常它們都有用于控制它們的寄存器。CPU上運行的軟件必須能夠讀寫這些控制寄存器。一個寄存器可能包含描述錯誤的狀態碼,另一個寄存器可能用于控制用途,改變控制器的模式。一個總線上的每一個控制器都可以分別被CPU尋址,這樣軟件設備驅動程序就可以讀寫它的寄存器進而控制它。IDE電纜是一個好例子,它給了你分別存取總線上每一個驅動器的能力。另一個好例子是PCI總線,允許每一個設備(如圖形卡)被獨立存取。</P>
<P> </P>
<P><BR>Address Spaces(尋址空間)</P>
<P> </P>
<P>連接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)的控制寄存器的地址。</P>
<P> </P>
<P>有時控制器需要直接從系統內存讀取大量內存,或直接寫大量數據到系統內存中去。比如將用戶數據寫到硬盤上去。在這種情況下,使用直接內存存取(DMA)控制器,允許硬件設備直接存取系統內存,當然,這種存取必須在CPU的嚴格控制和監管下進行。</P>
<P> </P>
<P><BR>Timer(時鐘)</P>
<P>所有操作系統需要知道時間,現代PC包括一個特殊的外設,叫做實時時鐘(RTC)。它提供了兩樣東西:可靠的日期和精確的時間間隔。RTC有自己的電池,所以即使PC沒有加電,它仍在運行。這也是為什么PC總是“知道”正確的日期和時間。時間間隔計時允許操作系統精確地調度基本工作。</P>
<P> </P>
<P> </P>
<P>Chapter 2</P>
<P> </P>
<P>Software Basic(軟件基礎)</P>
<P>程序是用于執行特定任務的計算機指令組合。程序可以用匯編語言,一種非常低級的計算機語言來編寫,也可以使用和機器無關的高級語言,比如C語言編寫。操作系統是一個特殊的程序,允許用戶通過它運行應用程序,比如電子表和文字處理等等。本章介紹了基本的編程原理,并簡介操作系統的目的和功能。</P>
<P> </P>
<P>2.1 Computer Languages(計算機語言)</P>
<P> </P>
<P>2.1.1.匯編語言</P>
<P> </P>
<P>CPU從內存中讀取和執行的指令對于人類來講無法理解。它們是機器代碼,精確的告訴計算機要做什么。比如十六進制數0x89E5,是Intel
80486的指令,將寄存器ESPEBP中。早期計算機中最初的軟件工具之一是匯編程序,它讀入人類可以閱讀的源文件,將其裝配成機器代碼。匯編語言明確地處理對寄存器和對數據的操作,而這種操作對于特定的微處理器而言是特殊的。Intel
X86微處理器的匯編語言和Alpha AXP微處理器的匯編語言完全不同。以下Alpha AXP匯編代碼演示了程序可以執行的操作類型:</P>
<P> </P>
<P>Ldr r16, (r15) ; 第一行</P>
<P>Ldr r17, 4(r15) ; 第二行</P>
<P>Beq r16,r17,100; 第三行</P>
<P>Str r17, (r15); 第四行</P>
<P>100: ; 第五行</P>
<P> </P>
<P>第一條語句(第一行)將寄存器15指定的地址中的內容加載到寄存器16中。第二條指令將緊接著的內存中的內容加載到寄存器17中。第三行比較寄存器16和寄存器17,如果相等,分支到標號100,否則,繼續執行第四行,將寄存器17的內容存到內存中。如果內存中的數據相同,就不必存儲數據。編寫匯編級的程序需要技巧而且十分冗長,容易出錯。Linux系統的核心很少的一部分是用匯編語言編寫,而這些部分之所以使用匯編語言只是為了提高效率,并且和具體的微處理器相關。</P>
<P> </P>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -