亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 核心源碼的物理布局.htm

?? Linux內(nèi)核編程經(jīng)典教材
?? HTM
?? 第 1 頁 / 共 4 頁
字號:
          <TD width="8%" height=4>
            <DIV align=center><A href="mailto:joyfire@sina.com"><FONT 
            color=#ffffff>聯(lián)系</FONT></A></DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE borderColor=#666666 cellPadding=2 width="90%" align=center border=2>
  <TBODY>
  <TR>
    <TD bgColor=#000000>
      <P align=center><A href="http://joyfire.net/lsdp/index.htm"><FONT 
      color=#ffffff size=2>目錄頁</FONT></A> | <A 
      href="http://joyfire.net/lsdp/19.htm"><FONT color=#ffffff 
      size=2>上一頁</FONT></A> | <A href="http://joyfire.net/lsdp/21.htm"><FONT 
      color=#ffffff size=2>下一頁</FONT></A></P>
      <P align=center><FONT face=黑體 color=#ffffff size=6>(LDD) Ch09-中斷處理(下)(轉(zhuǎn)載) 
      </FONT></P><SPAN style="LINE-HEIGHT: 1; LETTER-SPACING: 0pt"><FONT 
      color=#ffffff size=3>
      <P>發(fā)信人:&nbsp;Altmayer&nbsp;(alt),&nbsp;信區(qū):&nbsp;GNULinux<BR>標&nbsp;&nbsp;題:&nbsp;(LDD)&nbsp;Ch16-核心源碼的物理布局(轉(zhuǎn)載)<BR>發(fā)信站:&nbsp;飲水思源&nbsp;(2001年12月13日08:58:03&nbsp;星期四),&nbsp;站內(nèi)信件<BR>&nbsp;<BR>【&nbsp;以下文字轉(zhuǎn)載自&nbsp;<FONT 
      color=#00ff00>UNIXpost&nbsp;</FONT>討論區(qū)&nbsp;】<BR>【&nbsp;原文由<FONT 
      color=#00ff00>&nbsp;altmayer.bbs@bbs.nju.edu.cn,</FONT>&nbsp;所發(fā)表&nbsp;】<BR>&nbsp;<BR>【&nbsp;以下文字轉(zhuǎn)載自&nbsp;<FONT 
      color=#00ff00>altmayer&nbsp;</FONT>的信箱&nbsp;】<BR>&nbsp;<BR>&nbsp;<BR>第十六章&nbsp;&nbsp;&nbsp;&nbsp;核心源碼的物理布局<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>到目前為止,我們從寫設(shè)備驅(qū)動程序的角度討論了Linux核心。但一旦你開始研究核心,<BR>你會發(fā)現(xiàn)你想“全面理解它”。事實上,你可能整天在瀏覽源碼,搜索源碼樹,目的只<BR>是想搞清楚核心不同部分之間的關(guān)系。<BR>&nbsp;<BR>這種“沉重的搜索”是我在家里專門設(shè)一臺計算機的任務之一,并且這是從源碼中獲取<BR>信息的一個有效的辦法。然而,在坐在你喜歡的shell提示符之前若能得到一些知識基礎(chǔ)<BR>將會很有幫助。本章基于版本2.0.x,對Linux核心源文件提供一個快速的概覽。文件布<BR>局在版本之間的改變并不大,盡管我不能保證將來會不會變。因此下面的信息對瀏覽核<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>心的其它版本應該也很有用,即使它不是權(quán)威。<BR>&nbsp;<BR>在本章中,每個給出的路徑名都是相對于源碼的根(通常是/usr/src/linux),而沒有<BR>目錄部分的文件名一般假設(shè)它居于“當前”目錄----即正在討論的哪個。頭文件(當以<BR>角括弧的形式命名時----&lt;和&gt;)是相對于源碼樹的include目錄給出的。我不想介紹Docu<BR>mantation目錄,因為它的作用應該很清楚。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>引導核心<BR>&nbsp;<BR>看一個程序的一般方法是從執(zhí)行開始的地方著手。至于Linux,很難說執(zhí)行是從那里開始<BR>的----它取決于你是如何定義“開始”的。<BR>&nbsp;<BR>體系結(jié)構(gòu)相關(guān)的開始點是start_kernel,在init/main.c中。這個函數(shù)是從體系結(jié)構(gòu)特定<BR>的代碼中被調(diào)用的,但它并不返回到那里。它掌管著轉(zhuǎn)動輪子,因此可以被認為是“所<BR>有函數(shù)的母親”,計算機生命的第一次呼吸。在start_kernel之前是一片混沌。<BR>&nbsp;<BR>在start_kernel被調(diào)用時,處理器已經(jīng)被初始化了,保護模式(如果有)也被激活了,<BR>處理器在最高的優(yōu)先級執(zhí)行(通常被稱為“管理員模式”),中斷被關(guān)閉了。start_ker<BR>nel函數(shù)負責初始化所有的核心數(shù)據(jù)結(jié)構(gòu)。這個通過調(diào)用外部函數(shù)來執(zhí)行子任務,因為每<BR>個設(shè)置函數(shù)都在合適的核心子系統(tǒng)定義。start_kernel也調(diào)用parse_options(也在init/<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>main.c文件中)來對從用戶或引導系統(tǒng)的程序處傳來的命令行進行解碼。<BR>&nbsp;<BR>命令行(與memory_start,memory_end一道)用setup_arch從計算機內(nèi)存中獲取。setup<BR>_arch,如它的名字提示,是體系結(jié)構(gòu)特定的代碼。<BR>&nbsp;<BR>init/main.c中的代碼主要由#ifdefs組成。這是因為初始化是按步發(fā)生的,很多步可能<BR>被運行或跳過,這依賴于核心的編譯時配置。命令行的解釋也嚴重地依賴于條件,因為<BR>很多參數(shù)只有在被編譯的核心含有特定的驅(qū)動程序時才有意義。<BR>&nbsp;<BR>由start_kernel調(diào)用的初始化函數(shù)有兩種風格。一些函數(shù)沒有參數(shù),返回void;而另一<BR>些需要兩個unsigned&nbsp;long參數(shù),并返回另一個unsigned&nbsp;long值。其參數(shù)是memory_star<BR>t和&nbsp;memory_end的當前值,即未分配的物理內(nèi)存的邊界。返回值是新的memory_start值<BR>(如你所已知的,核心用unsigned&nbsp;long表達內(nèi)存地址)。這個技術(shù)允許子系統(tǒng)在物理內(nèi)<BR>存的開始處分配一個持續(xù)的(和連續(xù)的)內(nèi)存區(qū)域,如在第七章“把握內(nèi)存”中“playi<BR>ng&nbsp;dirty”一節(jié)中提到的。這種技術(shù)的最大的缺點是它只能在引導時使用,對那些需要<BR>用于DMA的巨大內(nèi)存區(qū)段的模塊并不可用。<BR>&nbsp;<BR>初始化完成后,start_kernel打印出旗幟字符串,包括Linux版本號和編譯時間,接著通<BR>過調(diào)用kernel_thread派生出(fork)一個init進程。<BR>&nbsp;<BR>start_kernel函數(shù)接著以任務0(所謂的“空閑”任務)的形式繼續(xù),并調(diào)用cpu_idle,<BR>它是一個調(diào)用idle的無限循環(huán)。在這一點,SMP(對稱多處理器)的工作方式略有不同,但<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>我不打算講述這個不同。idle函數(shù)的真正行為是體系結(jié)構(gòu)相關(guān)的,對源碼的簡單搜索可<BR>以把你帶到可以研究其功能的位置。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>引導之前<BR>&nbsp;<BR>在前一節(jié),我把start_kernel看作第一個核心函數(shù)。不過,你可能對這點之前發(fā)生的事<BR>情感興趣。<BR>&nbsp;<BR>在start_kernel之前運行的代碼是低級的,包含匯編碼,因此你可能對其細節(jié)不感興趣<BR>。不過,我將介紹一下固件(在PC世界稱為BIOS)將控制交給Linux后計算機中發(fā)生了什<BR>么。<BR>&nbsp;<BR>如果你對鉆研低級代碼沒有興趣,你可以直接跳到“Init進程”。下面提供了關(guān)于Intel<BR>,Alpha,Sparc引導代碼的一些提示,因為這是我能訪問的僅有的系統(tǒng)。(如果有人肯<BR>捐一些硬件,我將在下一版覆蓋更多的平臺)。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>設(shè)置X86處理器<BR>&nbsp;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>個人計算機是基于一個老的設(shè)計,后向兼容性一直有很高的優(yōu)先級。因此,PC固件還是<BR>以一種老方式引導操作系統(tǒng)。一旦引導設(shè)備被選擇,它的第一個扇區(qū)被加載到內(nèi)存的0x7<BR>C00處,然后讓出控制。<BR>&nbsp;<BR>剛加電的處理器處于實模式(也就是說,它象8086)并只能尋址物理內(nèi)存的前640KB。其<BR>中一部分已經(jīng)被固件管理的數(shù)據(jù)表格占用了。由于核心要比這個大,Linux的開發(fā)者必須<BR>找到一個不一般的方法將核心影響加載到內(nèi)存。結(jié)果就是zImage,即核心的壓縮映象,<BR>它可以被裝入底端內(nèi)存(但愿如此),并在進入保護模式后自解壓縮到高端內(nèi)存。<BR>&nbsp;<BR>這樣引導扇區(qū)發(fā)現(xiàn)它面對著五百字節(jié)的代碼,和半兆字節(jié)的空閑內(nèi)存。引導代碼真正做<BR>的依賴于系統(tǒng)是如何引導的。引導扇區(qū)可以是第一個核心扇區(qū)(如果你直接從軟盤上引<BR>導zImage)或者lilo。如果Linux由loadlin引導,則沒有引導扇區(qū)什么事,因為在loadl<BR>in運行時,系統(tǒng)已經(jīng)被引導了。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>引導一個bare-bones&nbsp;zImage核心<BR>&nbsp;<BR>如果被引導的系統(tǒng)是軟盤上的核心映象,在引導扇區(qū)執(zhí)行的代碼是arch/i386/boot/boot<BR>..S(一個實模式的匯編文件)。它將自己移到地址0x90000,從可引導設(shè)備上加載另外幾<BR>個扇區(qū),把它們放在緊挨自己的后面(也就是0x90200)。接著核心映象的其余部分被加<BR>載到地址0x10000(64KB:固件數(shù)據(jù)空間之后)。<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P><BR>位于0x90200的代碼是所謂的“設(shè)置”代碼(arch/i386/boot/setup.S和arch/i386/boot<BR>/video.S),它負責各種硬件的初始化,以及對視頻板子的初步檢測,以便可以切換到<BR>不同的文本模式分辨率。這些任務在實模式中進行(使用loadlin時則是在VM86模式),<BR>因此可以使用BIOS調(diào)用,避免處理硬件特定的細節(jié)。<BR>&nbsp;<BR>setup.S接著把整個核心從0x10000(64KB)移到0x1000(4KB);這樣在核心代碼之前只有一<BR>頁被浪費了----這頁其實并沒有真的浪費;它在系統(tǒng)中自有它的用處。代碼的這種來回<BR>復制是為了擺脫被BIOS強加的內(nèi)存布局,還能不至于覆蓋重要的數(shù)據(jù)。最后setup.S進入<BR>保護模式,跳轉(zhuǎn)到0x1000。<BR>&nbsp;<BR>arch/i386/boot/compressed/head.S(用gas寫成,因為我們已經(jīng)在保護模式了)設(shè)置棧。<BR>接著調(diào)用decompress_kernel,它把已解開的代碼放在地址0x100000(1M)并跳轉(zhuǎn)到那里。<BR>&nbsp;<BR>arch/i386/kernel/head.S是被解壓縮核心的頭;它建立最后的處理器設(shè)置(與硬件換頁<BR>有關(guān)的寄存器處理)并調(diào)用start_kernel。這就是所有需要的----已經(jīng)完成了。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>引導一個bare-bones&nbsp;bzImage核心<BR>&nbsp;<BR>隨著越來越多的驅(qū)動程序為Linux核心開發(fā)出來,一個全特征的壓縮核心不再能放入低端<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>內(nèi)存。例如,這種情況對安裝核心就可能發(fā)生,因為它為了能適應各種配置,塞滿了不<BR>同的驅(qū)動程序。因此,必須設(shè)計另一種加載方法。bzImage就是大的zImage,它在不能放<BR>入低端內(nèi)存時也可以被加載。<BR>&nbsp;<BR>有幾種加載bzImage的辦法,這取決于使用的引導加載程序(boot&nbsp;loader)。核心負責<BR>每種情況,現(xiàn)在我打算從原始軟盤上是如何引導的。<BR>&nbsp;<BR>一個bzImage核心的引導扇區(qū)不能簡單地將所有的壓縮數(shù)據(jù)加載到低端內(nèi)存,所以它必須<BR>欺騙(如多數(shù)實模式x86程序所做的那樣)。如果被加載的映象是大的,引導扇區(qū)象往常<BR>一樣加載“設(shè)置”扇區(qū),但在主引導循環(huán)的每次疊代都有一個“助手”例程被調(diào)用。助<BR>手例程在setup.S中定義,因為引導扇區(qū)太小無法放下它。這個例程用一個BIOS調(diào)用將數(shù)<BR>據(jù)從低端移到高端內(nèi)存,一次移動64KB,它還要重置目的地址,引導扇區(qū)用來從盤上傳<BR>送下一次的數(shù)據(jù)。這樣,在bootsect.S中的一般加載例程就不會用盡低端內(nèi)存。<BR>&nbsp;<BR>在核心被加載后,setup.S象往常一樣被調(diào)用。它除了改變上一個跳轉(zhuǎn)指令的目的地址外<BR>,并不做任何特殊的工作。由于我們加載了一個大映象,處理器通過使用一臺特殊的機<BR>器指令(它允許386在實模式段使用32位偏移)跳到0x100000而不是0x1000。<BR>&nbsp;<BR>解壓縮和往常一樣工作,但輸出不能放在0x100000(1M),因為壓縮的映象已經(jīng)在那兒<BR>了。解壓的數(shù)據(jù)被寫到低端的內(nèi)存直到用盡;接著被寫到越過壓縮映象的地方。這兩個<BR>解壓的片段通過執(zhí)行另外的內(nèi)存移動在0x100000處裝配起來。但復制例程也居于高端內(nèi)<BR>存,它必須首先將自己復制到低端內(nèi)存已防止被覆蓋;然后它把整個映象移到0x100000<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>。<BR>&nbsp;<BR>到這兒,游戲就結(jié)束了。但kernel/head.S并沒有注意到發(fā)生的額外工作,所有事情照常<BR>進行。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>使用lilo<BR>&nbsp;<BR>lilo,Linux加載程序,居于引導扇區(qū)----或者是主引導扇區(qū),或者是磁盤分區(qū)的第一個<BR>扇區(qū)。它使用BIOS調(diào)用從一個文件系統(tǒng)中加載核心。<BR>&nbsp;<BR>這個程序與核心映象面對同樣的問題:在機器引導時,僅有半KB的代碼被裝入內(nèi)存,而<BR>且只用幾打的指令解碼一個文件系統(tǒng)結(jié)構(gòu)也是不可能的。lilo通過在安裝時構(gòu)造一個磁<BR>盤映射來解決這個問題。它用這個映射告訴BIOS從正確的地方獲取每個核心塊。這個技<BR>術(shù)很有效,但你在替換或者重寫一個核心映象后必須重新安裝lilo----你必須調(diào)用lilo<BR>命令,用一個新的核心塊表來重新安裝引導加載程序。<BR>&nbsp;<BR>實際上,lilo擴展了加載機制,它允許用戶在引導時選擇加載哪個映象。這個選擇是通<BR>過一個映象的安裝定義表來做到的。它用從不同的分區(qū)中取出的引導扇區(qū)代替它自己的<BR>引導扇區(qū)來實現(xiàn)。<BR>&nbsp;<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>lilo比一個barebone引導的最大好處(除了能從硬驅(qū)直接引導外)是它允許用戶象核心<BR>傳遞一個命令行。這個命令行可以在lilo配置文件中指定,也可以在引導時交互給出。l<BR>ilo把命令行放在零頁(我們將其在boot/head.S之前保持空閑)的后一半。這一頁以后<BR>由setup_arch(在arch/i386/kernel/setup.c中定義)取得。<BR>&nbsp;<BR>lilo的最近版本(18版本甚至更新)可以加載bzImage,而老的發(fā)布是不能的。較新的版<BR>本可以用BIOS調(diào)用將數(shù)據(jù)加載到高端內(nèi)存,象bootsect.S做的那樣。<BR>&nbsp;<BR>當lilo完成加載,它跳到setup.S,事情就象我們以前看到的那樣繼續(xù)進行。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>使用loadlin<BR>&nbsp;<BR>loadlin用來將Linux從一個實模式操作系統(tǒng)中引導起來。與lilo類似,都是加載數(shù)據(jù),<BR>傳遞命令行,跳至setup.S。但它有一個優(yōu)點就是它可以在FAT分區(qū)中從一個指定的文件<BR>名加載核心,而不需要一個塊的映射。這使得它比較穩(wěn)定。如果你想加載bzImage,你需<BR>要loadlin的版本1.6或更新*。有趣的是注意到loadlin可能需要玩一些臟活才能加載整<BR>個核心,同時又不至于搞亂宿主操作系統(tǒng)。只有在核心的所有部分都被加載了,loadlin<BR>才能在合適的地址重新裝配它,并調(diào)用它的入口點。<BR>&nbsp;<BR>其它引導方式<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P><BR>還有一些程序可以引導Linux核心。其中的兩個是Etherboot和syslinux,當然還有很多<BR>。不過我不打算在這里講述它們,因為它們與我已經(jīng)講過的類似,至少與核心相關(guān)的部<BR>分如此。<BR>&nbsp;<BR>但要注意,引導一個Linux核心并不是象我說的這么簡單。要進行大量的檢測,版本號經(jīng)<BR>常出現(xiàn)在特別的地方,以抓住用戶的錯誤,并友好的回復。意思是如果發(fā)生了什么問題<BR>,系統(tǒng)可以在掛起前打印一條信息。局限在x86實模式的執(zhí)行環(huán)境下很難完全避免發(fā)生錯<BR>誤時掛起,打印一條消息總比什么都沒有強。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>設(shè)置Alpha處理器<BR>&nbsp;<BR>讓一個Alpha到達能運行start_kernel這一點要比Intel處理器容易的多,因為在Alpha上<BR>不需要和實模式或內(nèi)存限制做斗爭。而且,Alpha工作站通常配有比PC好的固件,可以從<BR>文件系統(tǒng)裝載一個完整的文件。我不想討論裝載一個文件時的實際步驟,因為這個代碼<BR>沒有隨Linux發(fā)布,這樣你無法檢查它----我也不能,因此就無法談論它。<BR>&nbsp;<BR>milo(迷你加載程序)程序是引導的一般選擇。milo比固件要聰明,因為它理解Linux和<BR>它的文件系統(tǒng),但又比核心笨,因為它不能運行進程。milo由固件從FAT分區(qū)執(zhí)行,可以<BR>從ext2或ISO9660塊設(shè)備上加載核心。象lilo和loadlin,milo也向核心傳遞一個命令行<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>。在Linux被加載到內(nèi)存中正確的虛地址后,milo轉(zhuǎn)向核心,自己消失。<BR>&nbsp;<BR>milo的有些特征依賴于核心源碼,因為它需要訪問設(shè)備,理解文件系統(tǒng)布局。配有驅(qū)動<BR>程序和文件系統(tǒng)類型,它可以根據(jù)文件名從硬盤或CD-ROM上取得核心映象。這個設(shè)計后<BR>面的想法與loadlin類似,只是milo使用Linux核心的代碼,而不是取自別的操作系統(tǒng)環(huán)<BR>境。<BR>&nbsp;<BR>在Alpha上引導Linux并不總是可用milo。如果你的系統(tǒng)有SRM固件,就不能安裝milo。相<BR>反,你可以使用arch/alpha/boot中的原始加載程序。這個加載程序很簡單,能從硬盤或<BR>軟驅(qū)中讀取一個順序區(qū)域,這與PC上zImage前面的引導扇區(qū)所做的工作一樣。使用原始<BR>加載程序要求核心映象必須(在任何文件系統(tǒng)之外)被復制到磁盤上的連續(xù)區(qū)域。<BR>&nbsp;<BR>如果不考慮系統(tǒng)是如何引導的,控制被傳遞給arch/alpha/kernel/head.S,但Linus說:<BR>“沒什么需要我們做的了”。源碼只是設(shè)置幾個指針,然后就跳到start_kernel。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>設(shè)置Sparc處理器<BR>&nbsp;<BR>Sparc計算機用一個稱為silo的程序引導Linux。與lilo,milo命名方法類似,只是用“s<BR>”表示Sparc。引導Sparc比Alpha要簡單一些;它的固件可以訪問設(shè)備,silo只需要訪問<BR>Linux文件系統(tǒng),并與用戶交互。出于這個目的,silo被鏈接到libext2,這是支持對未<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>安裝分區(qū)上的文件進行處理的一個庫。<BR>&nbsp;<BR>若不使用silo,也可以從軟盤或網(wǎng)絡上引導計算機。固件可以用RARP(反向ARP)和tftp<BR>協(xié)議從以太網(wǎng)上裝載一個核心。事實上,我從未用軟盤引導過我自己的工作站,因為Lin<BR>ux的Sparc發(fā)布允許通過網(wǎng)絡引導來完成系統(tǒng)安裝。<BR>&nbsp;<BR>對Sparc來說,的確沒有什么特別的要求。沒有實模式,也沒有需要復制的內(nèi)存。一旦核<BR>心被加載到RAM,它便開始執(zhí)行。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>Init進程<BR>&nbsp;<BR>由start_kernel生成的線程派生出bdflush(源碼見fs/buffer.c)和kswapd(在mm/vmsc<BR>an.c中定義),它們因此被賦予進程號2和3。init進程(pid&nbsp;1)接著進行進一步的初始<BR>化,這在之前不可能完成;也就是,它運行與SMP相關(guān)的函數(shù),如果需要,還有initrd引<BR>導技巧,以另一個核心線程的形式。在initrd結(jié)束后,init線程激活UMSDOS文件系統(tǒng)的<BR>“偽根(pseudo-root)”。<BR>&nbsp;<BR>在完成初始化后,init的實際作用是進入用戶空間并執(zhí)行一個程序(因此變成一個進程<BR>)。這樣三個stdio通道被連到第一個虛擬控制臺,核心試圖從/etc執(zhí)行init。如果失敗<BR>,它將查看/bin和/sbin(在所有最近的發(fā)布中,init一定居于此)。如果init從這三個<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>目錄的執(zhí)行都失敗了,進程將會執(zhí)行/etc/rc,如果這個也失敗了,它就循環(huán),執(zhí)行/bin<BR>/sh。在大多數(shù)情況下,函數(shù)能運行init成功;其它選項的目的是為了在init不能執(zhí)行時<BR>允許系統(tǒng)恢復。<BR>&nbsp;<BR>如果核心命令行指定了一條要執(zhí)行的命令,使用init=some_program導語,進程1就執(zhí)行<BR>指定的命令,而不是調(diào)用init。<BR>&nbsp;<BR>不管系統(tǒng)是怎么設(shè)置的,init最終在用戶空間執(zhí)行,以后的核心操作都是對來自用戶程<BR>序的系統(tǒng)調(diào)用的響應。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>kernel目錄<BR>&nbsp;<BR>大多數(shù)關(guān)鍵的核心功能都是在這個目錄實現(xiàn)的。這里最重要的源文件是sched.c,它值得<BR>特別對待。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>sched.c<BR>&nbsp;<BR>正如源文件自己表明的,這是“主核心文件”。它由調(diào)度程序和相關(guān)操作組成,例如讓<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>進程睡眠和喚醒它們,以及核心計時器的管理(見第六章“時間流”中“核心計時器”<BR>一節(jié)),間隔計時器(它與計帳和性能刻劃有關(guān)),以及預定義任務隊列(見第六章“<BR>預定義任務隊列”)。<BR>&nbsp;<BR>如果你對Linux調(diào)度程序的實時策略感興趣,你可以在schedule函數(shù)及其相關(guān)者中找到低<BR>級的信息。其中一個相關(guān)者是goodness,它給進程賦優(yōu)先值,并幫助調(diào)度程序選擇下一<BR>個要運行的進程。<BR>&nbsp;<BR>與調(diào)度程序控制相關(guān)的函數(shù)(及系統(tǒng)調(diào)用)也在這個文件中定義。這包括設(shè)置和取得調(diào)<BR>度策略及優(yōu)先級。在除Alpha外的其它體系結(jié)構(gòu)上,系統(tǒng)調(diào)用nice也在這個源文件中。<BR>&nbsp;<BR>另外,取得和設(shè)置用戶及組id也在sched.c中定義(除了Alpha),同時還有alarm調(diào)用*<BR>。<BR>&nbsp;<BR>在sched.c中還能找到的其它好東西包括show_tasks和show_state函數(shù),它們實現(xiàn)了在第<BR>四章“調(diào)試技巧”中“系統(tǒng)掛起”一節(jié)所描述的“魔幻”鍵中的兩個。<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>進程控制<BR>&nbsp;<BR>目錄的其它主要部分都是管理進程的。fork和exit系統(tǒng)調(diào)用在兩個同名源文件中實現(xiàn),<BR></P></FONT><FONT 
      color=#ffffff size=3>
      <P>信號控制在signal.c中實現(xiàn)。大多數(shù)信號處理的調(diào)用在Alpha中實現(xiàn)的方法是不同的,以<BR>保證Alpha的移植與Digital&nbsp;Unix二進制兼容。<BR>&nbsp;<BR>fork的實現(xiàn)包括clone系統(tǒng)調(diào)用的代碼,fork.c顯示了clone的標志是如何使用的。應該<BR>注意sys_fork并不在fork.c中定義,因為Sparc的實現(xiàn)與其它的版本稍有不同;不過,多<BR>數(shù)sys_fork的實現(xiàn)只是調(diào)用do_fork,它在fork.c中定義。提供一個缺省實現(xiàn)(通常叫做<BR>do_fnct),而真正的系統(tǒng)調(diào)用(sys_fnct)則在各個移植中聲明,這是Linux常用的一<BR>個技巧,隨著新的移植的出現(xiàn),這個技巧很可能擴展到其它的系統(tǒng)調(diào)用。<BR>&nbsp;<BR>exit.c實現(xiàn)sys_exit和不同的wait函數(shù),以及信號的實際發(fā)送。(signal.c專用于信號<BR>處理,而不是發(fā)送。)<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>模塊化<BR>&nbsp;<BR>文件module.c和ksyms.c包含了在第二章“構(gòu)造和運行模塊”中描述的機制。module.c含<BR>有被insmod及相關(guān)程序使用的系統(tǒng)調(diào)用,ksyms.c聲明不屬于特定子系統(tǒng)的核心中的公共<BR>符號。其它的公共符號由特定核心子系統(tǒng)的初始化函數(shù)使用register_symtab聲明。例如<BR>,fs/proc/procfs_syms.c為注冊新文件聲明/proc接口。<BR>&nbsp;<BR>&nbsp;<BR></P></FONT><FONT 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本色道久久综合狠狠躁的推荐| 免费在线观看日韩欧美| 欧美色图12p| 不卡的电视剧免费网站有什么| 欧美国产日韩在线观看| 欧美日韩在线免费视频| 色女孩综合影院| 成人精品电影在线观看| 久草在线在线精品观看| 国产精品久久精品日日| 久久久久久毛片| 6080亚洲精品一区二区| www国产精品av| 欧美一区国产二区| 91麻豆精品91久久久久久清纯| 国产精品一区二区久久不卡| 看电影不卡的网站| 夜夜嗨av一区二区三区| 亚洲黄色av一区| 亚洲毛片av在线| 亚洲自拍偷拍九九九| 国产精品视频在线看| 久久日韩粉嫩一区二区三区 | 久久国产免费看| 免费看日韩精品| 天堂久久一区二区三区| 国产精品嫩草影院com| 在线观看日韩国产| 欧美日韩国产综合草草| 91.麻豆视频| 日韩美女在线视频| 久久综合色8888| 日本一区二区三区高清不卡 | 久久精品国产久精国产爱| 蜜臀av性久久久久蜜臀av麻豆 | 视频一区二区欧美| 免费看日韩精品| 国产精品一二三四| av在线综合网| thepron国产精品| 欧美综合一区二区三区| 欧美精品成人一区二区三区四区| 北条麻妃国产九九精品视频| 久久草av在线| 国产成人精品免费在线| 91丝袜美腿高跟国产极品老师 | 美女网站视频久久| 国产另类ts人妖一区二区| av在线播放不卡| 欧美日韩大陆在线| caoporn国产精品| 欧美天天综合网| 精品欧美一区二区久久| 欧美国产在线观看| 亚洲国产欧美一区二区三区丁香婷| 国产无人区一区二区三区| 一区二区中文字幕在线| 国产精品美女久久久久av爽李琼| 精品剧情v国产在线观看在线| 欧美美女网站色| 国产婷婷一区二区| 亚洲小说春色综合另类电影| 久久精品国产99| 91视频在线看| 精品三级在线观看| 亚洲欧美日韩国产成人精品影院| 国产精品美女久久久久aⅴ| 亚洲国产精品传媒在线观看| 亚洲午夜久久久久久久久久久| 久久精品一区四区| av电影在线观看不卡| 91精品国产欧美日韩| 日韩免费观看2025年上映的电影 | 亚洲国产成人va在线观看天堂 | 欧美午夜精品久久久久久超碰 | 亚洲午夜久久久久久久久电影网| 亚洲成人精品在线观看| 波多野结衣视频一区| 国产日韩精品一区二区三区| 久草在线在线精品观看| 欧美人成免费网站| 一区二区三区在线观看欧美| 国产精品99久| 精品电影一区二区三区 | 一区二区三区在线不卡| 成+人+亚洲+综合天堂| 欧美日韩综合在线免费观看| 中文字幕日韩av资源站| 天天综合天天做天天综合| 一本色道a无线码一区v| 中文字幕一区二区三区乱码在线 | 中文幕一区二区三区久久蜜桃| 亚洲三级电影网站| 99精品久久99久久久久| 国产丝袜美腿一区二区三区| 九九国产精品视频| 精品国产乱码久久久久久牛牛| **性色生活片久久毛片| 免费成人深夜小野草| 欧美一区二区三区男人的天堂| 国产欧美精品一区二区色综合朱莉 | 在线视频欧美精品| 亚洲欧美日韩精品久久久久| 色综合久久综合| 欧美一区二区三区在线视频 | 久久超碰97人人做人人爱| 日韩一区二区高清| 久久www免费人成看片高清| 日韩女优av电影在线观看| 精品制服美女丁香| 久久久亚洲午夜电影| 亚洲精品国久久99热| 色香蕉久久蜜桃| 久久久久九九视频| 国产精品 欧美精品| 国产精品福利在线播放| 色悠悠亚洲一区二区| 亚洲一区二区高清| 欧美一区二区在线视频| 亚洲蜜臀av乱码久久精品| 国产一区二区0| 亚洲欧洲国产日韩| 欧美亚洲日本一区| 日韩vs国产vs欧美| 欧美色男人天堂| 亚洲人123区| 欧美精品国产精品| 国产高清精品网站| 精品国产精品网麻豆系列| 午夜激情久久久| 精品sm在线观看| 99综合影院在线| 国产精品对白交换视频| 欧美午夜精品电影| 久久成人精品无人区| 日韩视频一区二区三区在线播放| 午夜精品久久久| 久久免费偷拍视频| 色哟哟一区二区在线观看| 日本视频免费一区| 日本一区二区视频在线| 色偷偷久久人人79超碰人人澡| 中文字幕中文字幕在线一区| 欧美日韩精品综合在线| 国产成人午夜精品影院观看视频 | 精品一区二区三区免费观看| 国产精品久久久久永久免费观看| 国产精品亚洲人在线观看| 精品久久久久久最新网址| 99精品视频在线观看免费| 日韩专区一卡二卡| 欧美国产1区2区| 成人自拍视频在线观看| 亚洲va韩国va欧美va| 久久精品一区二区三区不卡| 欧日韩精品视频| 国产成人精品一区二区三区网站观看 | 日韩午夜激情免费电影| 美女视频黄免费的久久| 国产精品卡一卡二卡三| 日韩女优av电影| 在线视频你懂得一区| 国产白丝网站精品污在线入口| 国产蜜臀av在线一区二区三区| 不卡的看片网站| 久久不见久久见免费视频7| 夜色激情一区二区| 欧美肥胖老妇做爰| 91亚洲精品久久久蜜桃网站 | 91麻豆产精品久久久久久| 美女一区二区久久| 国产色婷婷亚洲99精品小说| jiyouzz国产精品久久| 亚洲主播在线观看| 国产精品私人影院| 精品国产乱码久久久久久图片 | 国产在线视频一区二区三区| 亚洲成人av资源| 亚洲精品一二三四区| 久久久国际精品| 欧美一区二区在线不卡| 欧美日韩亚洲高清一区二区| 91视频你懂的| 菠萝蜜视频在线观看一区| 亚洲国产一区二区a毛片| 亚洲色图在线播放| 91精品国产综合久久国产大片| 国产一区二区毛片| 久久精品国产澳门| 日韩成人伦理电影在线观看| 亚洲电影一区二区| 亚洲成a人片在线观看中文| 亚洲综合色成人| 亚洲宅男天堂在线观看无病毒| 一区二区三区在线视频播放| 国产精品成人一区二区艾草| 337p亚洲精品色噜噜| 99麻豆久久久国产精品免费| 视频一区二区欧美| 天堂在线一区二区|