?? 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(硬件基礎(chǔ)知識)</P>
<P> </P>
<P>一個操作系統(tǒng)必須和作為它的基礎(chǔ)的硬件系統(tǒng)緊密配合。操作系統(tǒng)需要使用一些只有硬件才能提供的功能。為了完整的了解Linux,你需要了解底層硬件的基礎(chǔ)知識。本章對于現(xiàn)代PC的硬件進行了。</P>
<P>1975年1月“Popular Electronics”雜志封面上印出了Altair 8080的圖片,一場革命開始了。</P>
<P>Altair 8080,跟隨早期的“Star Trek epsode”命名,只需要$397,就可由個人電子愛好者自己組裝。它擁有Intel
8080處理器和256字節(jié)內(nèi)存,但是沒有屏幕和鍵盤。以今天的標準來衡量,它太簡陋了。它的發(fā)明者,Ed Roberts,制造了名詞“personal
computer“來命名他的發(fā)明,但現(xiàn)在,PC這個名詞已經(jīng)用來命名幾乎所有你可以不依靠幫助就可以自己運行起來的計算機。用這個定義,甚至一些十分強大的Alpha
AXP系統(tǒng)也是PC。</P>
<P>愛好者們看到了Altair的潛力,開始為它寫軟件,制造硬件。對于這些早期的先驅(qū)來講,它代表著自由:從被神職人員控制和運行的大型批處理的主機系統(tǒng)中逃脫出來的自由。你可以在自己家里甚至廚桌上擁有計算機,這使學(xué)院的退學(xué)生為此著迷并通宵達旦。與此同時出現(xiàn)大量硬件,在一定程度上各自不同,而軟件專家則樂于為這些新機器撰寫軟件。有諷刺意味的是,IBM在1981年發(fā)布了IBM
PC并于1982年早期供貨,從此定義了現(xiàn)代PC的模型。它擁有Intel
8088處理器,64K內(nèi)存(可以擴充到256K),兩個軟驅(qū)和一個80x25的彩色圖卡(CGA),用今天的標準衡量,它功能不算很強,但是它銷售的不錯。1983年,緊接著推出的IBM
PC-XT,則擁有一個豪華的10M硬盤。不久大批公司如Compaq開始制造IBM
PC的復(fù)制品,PC的結(jié)構(gòu)成為了事實的標準。這個事實的標準使大批硬件公司可以在這個不斷增長的市場上一起競爭,反過來,可以遏制價格,讓用戶滿意?,F(xiàn)代PC承襲了早期PC的許多系統(tǒng)體系特征。甚至基于最強大的Intel
Pentium Pro的系統(tǒng)也可以運行Intel 8086的尋址模式。當Linus
Torvalds開始開發(fā)后來的Linux時,他選擇了當時最常見和價格最合理的硬件平臺:一臺Intel 80386 PC。</P>
<P>從PC的外面看,最明顯的部件就是機箱、鍵盤、鼠標和顯示器。在機箱的前面有一些按鈕,一個小屏幕顯示一些數(shù)字,還有一個軟驅(qū)?,F(xiàn)在的大多數(shù)系統(tǒng)還有一個CD-ROM期、驅(qū)動器。如果你需要保護你的數(shù)據(jù),那么還會有一個備份用的磁帶機。這些設(shè)備一律被看作外設(shè)。</P>
<P>雖然CPU管理整個系統(tǒng),但它并不是唯一的智能設(shè)備。所有的外設(shè)控制器,例如IDE控制器,也都擁有一定程度的智能。在PC內(nèi)部(圖1.1),你可以看到一個主板,包括CPU或微處理器、內(nèi)存和一些ISA或PCI外設(shè)控制卡的槽位。其中一些控制器,如IDE磁盤控制器可能內(nèi)置在系統(tǒng)主板上。</P>
<P> </P>
<P><BR>CPU</P>
<P> </P>
<P>CPU,或者說微處理器,是所有計算機系統(tǒng)的心臟。微處理器進行數(shù)學(xué)運算,邏輯操作并從內(nèi)存中讀取指令并執(zhí)行指令,進而控制數(shù)據(jù)流向。計算機發(fā)展的早期,微處理器的各種功能模塊是由相互分離(并且尺寸上十分巨大)的單元構(gòu)成。這也是名詞“中央處理單元”的起源。現(xiàn)代的微處理器將這些功能模塊集中在一塊非常小的硅晶片制造的集成電路上。在本書,名詞CPU、微處理器和處理器交替使用。
微處理器處理二進制數(shù)據(jù):這些數(shù)據(jù)由1和0組成。這些1和0對應(yīng)電氣開關(guān)的開或關(guān)。就好像42代表4個10和2個單元,二進制數(shù)字由一系列代表2的冪數(shù)的數(shù)字組成。這里,冪數(shù)意味著一個數(shù)字用自身相乘的次數(shù)。10
的一次冪是10,10的2次冪是10x10,10的3次冪是10x10x10,依此類推。二進制0001是十進制1是十進制2,二進制0011是十進制3,二進制0100是十進制4,等等。所以,十進制42是二進制101010或者(2+8+32或21+23+25)。在計算機程序除了使用二進制表示數(shù)字之外,另一種基數(shù),16進制,也經(jīng)常用到。在這種進制中,每一位數(shù)字表示16的冪數(shù)。因為十進制數(shù)字只是從0到9,在十六進制中10到15分別用字母A,B,C,D,E,F(xiàn)表示。例如,十六進制的E是十進制的14,而十六進制的2A是十進制的42(2個16+10)。用C語言的表示法(本書一直使用),十六進制數(shù)字使用前綴“0x”:十六進制的2A寫做0x2A。</P>
<P> </P>
<P></P>
<P>微處理器可以執(zhí)行算術(shù)運算如加、乘和除,也可以執(zhí)行邏輯操作例如“X是否大于Y”。</P>
<P>處理器的執(zhí)行由外部時鐘控制。這個時鐘,即系統(tǒng)時鐘,對處理器產(chǎn)生穩(wěn)定的時鐘脈沖,在每一個時鐘脈沖里,處理器執(zhí)行一些工作。例如,處理器可以在每一個時鐘脈沖里執(zhí)行一條指令。處理器的速度用系統(tǒng)時鐘的頻率來描述。一個100Mhz的處理器每秒鐘接受到100,000,000次時鐘脈沖。用時鐘頻率來描述CPU的能力是一種誤解,因為不同的處理器在每一次時鐘脈沖中執(zhí)行的工作量不同。雖然如此,如果所有的條件同等,越快的時鐘頻率表示處理器的能力越強。處理器執(zhí)行的指令非常簡單,例如:“把內(nèi)存位置X的內(nèi)容讀到寄存器Y中“。寄存器是微處理器的內(nèi)部存儲空間,用來存儲數(shù)據(jù)并進行操作。執(zhí)行的操作可能使處理器停止當前操作而轉(zhuǎn)去執(zhí)行內(nèi)存中其他地方的指令。正是這些微小的指令集合在一起,賦予現(xiàn)代的微處理器幾乎無限的能力,因為它每秒可以執(zhí)行數(shù)百萬甚至數(shù)十億的指令。</P>
<P> </P>
<P>執(zhí)行指令時必須從內(nèi)存中提取指令,指令自身也可能引用內(nèi)存中的數(shù)據(jù),這些數(shù)據(jù)也必須提取到內(nèi)存中并在需要的時候保存到內(nèi)存中去。</P>
<P> </P>
<P>一個微處理器內(nèi)部寄存器的大小、數(shù)量和類型完全決定于它的類型。一個Intel 80486處理器和一個Alpha
AXP處理器的寄存器組完全不同。另外,Intel是32位寬而Alpha
AXP是64位寬。但是,一般來講,所有特定的處理器都會有一些通用目的的寄存器和少量專用的寄存器。大多數(shù)處理器擁有以下特殊用途的專用的寄存器:</P>
<P> </P>
<P>Program Counter(PC)程序計數(shù)器</P>
<P>這個寄存器記錄了下一條要執(zhí)行的指令的地址。PC的內(nèi)容在每次取指令的時候自動增加。</P>
<P>Stack Pointer(SP)堆棧指針</P>
<P>處理器必須能夠存取用于臨時存儲數(shù)據(jù)的大容量的外部讀寫隨機存取內(nèi)存(RAM)。堆棧是一種用于在外部內(nèi)存中存放和恢復(fù)臨時數(shù)據(jù)的方法。通常,處理器提供了特殊的指令用于將數(shù)據(jù)壓在堆棧中,并在以后需要是取出來。堆棧使用LIFO(后進先出)的方式。換句話說,如果你壓入兩個值x和y到堆棧中,然后從堆棧中彈出一個值,那么你會得到y(tǒng)的值。</P>
<P>一些處理器的堆棧向內(nèi)存頂部增長,而另一些向內(nèi)存的底部增長。還有一些處理器兩種方式都可以支持,例如:ARM。</P>
<P> </P>
<P>Processor Status(PS)</P>
<P>指令可能產(chǎn)生結(jié)果。例如:“X寄存器的內(nèi)容是否大于Y寄存器的內(nèi)容?“可能產(chǎn)生真或假的結(jié)果。PS寄存器保留這些結(jié)果以及處理器當前狀態(tài)的其他信息。多數(shù)處理器至少有兩種模式:kernel(核心態(tài))和user(用戶態(tài)),PS寄存器會紀錄能夠確定當前模式的那些信息。</P>
<P> </P>
<P><BR>Memory(內(nèi)存)</P>
<P> </P>
<P>所有系統(tǒng)都具有分級的內(nèi)存結(jié)構(gòu),由位于不同級別的速度和容量不同的內(nèi)存組成。</P>
<P>最快的內(nèi)存是高速緩存存儲器,就象它的名字暗示的一樣-用于臨時存放或緩存主內(nèi)存的內(nèi)容。這種內(nèi)存非常快但是比較昂貴,因此多數(shù)處理器芯片上內(nèi)置有少量的高速緩沖存儲器,而大多數(shù)高速緩存存儲器放在系統(tǒng)主板上。一些處理器用一塊緩存內(nèi)存同時緩存指令和數(shù)據(jù),而另一些處理器有兩塊緩存內(nèi)存-一個用于指令,另一個用于數(shù)據(jù)。Alpha
AXP處理器有兩個內(nèi)置的內(nèi)存高速緩存存儲器:一個用于數(shù)據(jù)(D-Cache),另一個用于指令(I-Cache)。它的外部高速緩沖存儲器(或B-Cache)將兩者混在一起。</P>
<P>最后一種內(nèi)存是主內(nèi)存。相對于外部高速緩存存儲器而言速度非常慢,對于CPU內(nèi)置的高速緩存存儲器,主內(nèi)存簡直是在爬。</P>
<P>高速緩存存儲器和主內(nèi)存必須保持同步(一致)。換句話說,如果主內(nèi)存中的一個字保存在高速緩存存儲器的一個或多個位置,那么系統(tǒng)必須保證高速緩存存儲器和主內(nèi)存的內(nèi)容一樣。使高速緩沖存儲器同步的工作一部分是由硬件完成,另一部分則是由操作系統(tǒng)完成的。對于其它一些系統(tǒng)的主要任務(wù),硬件和軟件也必須緊密配合。</P>
<P> </P>
<P><BR>Buses(總線)</P>
<P>系統(tǒng)板的各個組成部分由被稱為總線的連接系統(tǒng)互連在一起。系統(tǒng)總線分為三種邏輯功能:地址總線、數(shù)據(jù)總線和控制總線。地址總線指定了數(shù)據(jù)傳輸?shù)膬?nèi)存位置(地址),數(shù)據(jù)總線保存了傳輸?shù)臄?shù)據(jù)。數(shù)據(jù)總線是雙向的,它允許CPU讀取,也允許CPU寫。控制總線包含了各種信號線用于在系統(tǒng)中發(fā)送時鐘和控制信號。有許多種不同的總線類型,ISA和PCI總線是系統(tǒng)用于連接外設(shè)的常用方式。</P>
<P> </P>
<P><BR>Controllers and Peripherals (控制器和外設(shè))</P>
<P> </P>
<P>外設(shè)指實在的設(shè)備,如由系統(tǒng)板或系統(tǒng)板插卡上的控制芯片所控制的圖形卡或磁盤。IDE控制芯片控制IDE磁盤,而SCSI控制芯片控制SCSI磁盤。這些控制器通過不同的總線連接到CPU并相互連接。現(xiàn)在制造的大多數(shù)系統(tǒng)都是用PCI或ISA總線將系統(tǒng)的主要部件連接在一起??刂破鞅旧硪彩窍驝PU一樣的處理器,它們可以看作CPU的智能助手,CPU擁有系統(tǒng)的最高控制權(quán)。</P>
<P> </P>
<P>所有的控制器都是不同的,但是通常它們都有用于控制它們的寄存器。CPU上運行的軟件必須能夠讀寫這些控制寄存器。一個寄存器可能包含描述錯誤的狀態(tài)碼,另一個寄存器可能用于控制用途,改變控制器的模式。一個總線上的每一個控制器都可以分別被CPU尋址,這樣軟件設(shè)備驅(qū)動程序就可以讀寫它的寄存器進而控制它。IDE電纜是一個好例子,它給了你分別存取總線上每一個驅(qū)動器的能力。另一個好例子是PCI總線,允許每一個設(shè)備(如圖形卡)被獨立存取。</P>
<P> </P>
<P><BR>Address Spaces(尋址空間)</P>
<P> </P>
<P>連接CPU和主內(nèi)存的系統(tǒng)總線以及連接CPU和系統(tǒng)硬件外設(shè)的總線是分離的。硬件外設(shè)所擁有的內(nèi)存空間稱為I/O空間。I/O空間本身可以再進一步劃分,但是我們現(xiàn)在先不討論。CPU可以訪問系統(tǒng)內(nèi)存空間和I/O空間,而控制器只能通過CPU間接訪問系統(tǒng)內(nèi)存。從設(shè)備的角度來看,比如軟驅(qū)控制器,它只能看到它的控制寄存器所在的地址空間(ISA),而非系統(tǒng)內(nèi)存。一個CPU用不同的指令去訪問內(nèi)存和I/O空間。例如,可能有一條指令是“從I/O地址0x3f0讀取一個字節(jié)到X寄存器“。這也是CPU通過讀寫系統(tǒng)硬件外設(shè)處于I/O地址空間的寄存器從而控制外設(shè)的方法。在地址空間中,普通外設(shè)(如IDE控制器,串行端口,軟驅(qū)控制器等等)的寄存器在PC外設(shè)的多年發(fā)展中已經(jīng)成了定例。I/O空間的地址0x3f0正是串行口(COM1)的控制寄存器的地址。</P>
<P> </P>
<P>有時控制器需要直接從系統(tǒng)內(nèi)存讀取大量內(nèi)存,或直接寫大量數(shù)據(jù)到系統(tǒng)內(nèi)存中去。比如將用戶數(shù)據(jù)寫到硬盤上去。在這種情況下,使用直接內(nèi)存存取(DMA)控制器,允許硬件設(shè)備直接存取系統(tǒng)內(nèi)存,當然,這種存取必須在CPU的嚴格控制和監(jiān)管下進行。</P>
<P> </P>
<P><BR>Timer(時鐘)</P>
<P>所有操作系統(tǒng)需要知道時間,現(xiàn)代PC包括一個特殊的外設(shè),叫做實時時鐘(RTC)。它提供了兩樣?xùn)|西:可靠的日期和精確的時間間隔。RTC有自己的電池,所以即使PC沒有加電,它仍在運行。這也是為什么PC總是“知道”正確的日期和時間。時間間隔計時允許操作系統(tǒng)精確地調(diào)度基本工作。</P>
<P> </P>
<P> </P>
<P>Chapter 2</P>
<P> </P>
<P>Software Basic(軟件基礎(chǔ))</P>
<P>程序是用于執(zhí)行特定任務(wù)的計算機指令組合。程序可以用匯編語言,一種非常低級的計算機語言來編寫,也可以使用和機器無關(guān)的高級語言,比如C語言編寫。操作系統(tǒng)是一個特殊的程序,允許用戶通過它運行應(yīng)用程序,比如電子表和文字處理等等。本章介紹了基本的編程原理,并簡介操作系統(tǒng)的目的和功能。</P>
<P> </P>
<P>2.1 Computer Languages(計算機語言)</P>
<P> </P>
<P>2.1.1.匯編語言</P>
<P> </P>
<P>CPU從內(nèi)存中讀取和執(zhí)行的指令對于人類來講無法理解。它們是機器代碼,精確的告訴計算機要做什么。比如十六進制數(shù)0x89E5,是Intel
80486的指令,將寄存器ESPEBP中。早期計算機中最初的軟件工具之一是匯編程序,它讀入人類可以閱讀的源文件,將其裝配成機器代碼。匯編語言明確地處理對寄存器和對數(shù)據(jù)的操作,而這種操作對于特定的微處理器而言是特殊的。Intel
X86微處理器的匯編語言和Alpha AXP微處理器的匯編語言完全不同。以下Alpha AXP匯編代碼演示了程序可以執(zhí)行的操作類型:</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指定的地址中的內(nèi)容加載到寄存器16中。第二條指令將緊接著的內(nèi)存中的內(nèi)容加載到寄存器17中。第三行比較寄存器16和寄存器17,如果相等,分支到標號100,否則,繼續(xù)執(zhí)行第四行,將寄存器17的內(nèi)容存到內(nèi)存中。如果內(nèi)存中的數(shù)據(jù)相同,就不必存儲數(shù)據(jù)。編寫匯編級的程序需要技巧而且十分冗長,容易出錯。Linux系統(tǒng)的核心很少的一部分是用匯編語言編寫,而這些部分之所以使用匯編語言只是為了提高效率,并且和具體的微處理器相關(guān)。</P>
<P> </P>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -