<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>
    以文本方式查看主題

    -  曙海教育集團(tuán)論壇  (http://www.hufushizhe.com/bbs/index.asp)
    --  Linux驅(qū)動開發(fā)  (http://www.hufushizhe.com/bbs/list.asp?boardid=33)
    ----  嵌入式Linux系統(tǒng)內(nèi)核與設(shè)備驅(qū)動開發(fā)技術(shù)  (http://www.hufushizhe.com/bbs/dispbbs.asp?boardid=33&id=1703)

    --  作者:wangxinxin
    --  發(fā)布時間:2010-11-24 9:18:17
    --  嵌入式Linux系統(tǒng)內(nèi)核與設(shè)備驅(qū)動開發(fā)技術(shù)
    序言

    第一章 內(nèi)核編譯的基礎(chǔ)

    第一節(jié)內(nèi)核簡介

    第二節(jié)內(nèi)核版本

    第三節(jié)編譯原因

    第四節(jié)準(zhǔn)備工作

    第二章 內(nèi)核編譯的流程

    第一節(jié)編譯開始 

    第二節(jié)配置內(nèi)核 {核心內(nèi)容}

    1.代碼成熟等級

    2..處理器類型和特色

    3.對模塊的支持

    4.基本的選擇

    5.即插即用支持 

    6.塊設(shè)備支持

    7.網(wǎng)絡(luò)選項(xiàng)

    8.電話支持

    9.SCSI設(shè)備的支持 

    10.I2O接口適配器

    11.網(wǎng)絡(luò)設(shè)備支持 

    12.配置業(yè)余無線廣播

    13.紅外支持

    14.ISDN的文件系統(tǒng) 

    15.舊型光驅(qū)類型(非IDE界面的光驅(qū))

    16.字符設(shè)備

    17.USB支持

    18.文件系統(tǒng) 

    19.控制臺驅(qū)動

    20.聲卡驅(qū)動

    21.Kernel hacking 

    第二節(jié) 內(nèi)核版本 

    由于Linux的源程序是完全公開的,任何人只要遵循GPL,就可以對內(nèi)核加以修改并發(fā)布給他人使用。Linux的開發(fā)采用的是集市模型(bazaar,與cathedral--教堂模型--對應(yīng)),為了確保這些無序的開發(fā)過程能夠有序地進(jìn)行,Linux采用了雙樹系統(tǒng)。一個樹是穩(wěn)定樹(stable tree),另一個樹是非穩(wěn)定樹(unstable tree)或者開發(fā)樹(development tree)。一些新特性、實(shí)驗(yàn)性改進(jìn)等都將首先在開發(fā)樹中進(jìn)行。如果在開發(fā)樹中所做的改進(jìn)也可以應(yīng)用于穩(wěn)定樹,那么在開發(fā)樹中經(jīng)過測試以后,在穩(wěn)定樹中將進(jìn)行相同的改進(jìn)。一旦開發(fā)樹經(jīng)過了足夠的發(fā)展,開發(fā)樹就會成為新的穩(wěn)定樹。開發(fā)數(shù)就體現(xiàn)在源程序的版本號中;源程序版本號的形式為x.y.z:對于穩(wěn)定樹來說,y是偶數(shù);對于開發(fā)樹來說,y比相應(yīng)的穩(wěn)定樹大一(因此,是奇數(shù))。確定是以″ root ″的身份簽入,然后cd 到 /usr/src 。uname -r 這個指令將會顯示版本。內(nèi)核版本的更新可以訪問<http://www.kernel.org/>。

    第三節(jié) 編譯原因

    Linux作為一個自由軟件,在廣大愛好者的支持下,內(nèi)核版本不斷更新。新的內(nèi)核修訂了舊內(nèi)核的bug,并增加了許多新的特性。如果用戶想要使用這些新特性,或想根據(jù)自己的系統(tǒng)度身定制一個更高效,更穩(wěn)定的內(nèi)核,就需要重新編譯內(nèi)核。通常,更新的內(nèi)核會支持更多的硬件,具備更好的進(jìn)程管理能力,運(yùn)行速度更快、更穩(wěn)
    定,并且一般會修復(fù)老版本中發(fā)現(xiàn)的許多漏洞等,經(jīng)常性地選擇升級更新的系統(tǒng)內(nèi)核是Linux使用者的必要操作內(nèi)容。

    為了正確的合理地設(shè)置內(nèi)核編譯配置選項(xiàng),從而只編譯系統(tǒng)需要的功能的代碼,一般主要有下面四個考慮:

      ---自己定制編譯的內(nèi)核運(yùn)行更快(具有更少的代碼)
      ---系統(tǒng)將擁有更多的內(nèi)存(內(nèi)核部分將不會被交換到虛擬內(nèi)存中)
      ---不需要的功能編譯進(jìn)入內(nèi)核可能會增加被系統(tǒng)攻擊者利用的漏洞
      ---將某種功能編譯為模塊方式會比編譯到內(nèi)核內(nèi)的方式速度要慢一些

    以上是針對成熟的Linux套件如Redhat Linux而言,我的目的是為建造嵌入式Linux操作系統(tǒng)做準(zhǔn)備,也是必由之路。

    第四節(jié) 準(zhǔn)備工作

    第一部分 新版本內(nèi)核的獲取和更新

    Linux內(nèi)核版本發(fā)布的官方網(wǎng)站是<http://www.kernel.org/>,國內(nèi)各大ftp上一般都可以找到某些版本的內(nèi)核。新版本的內(nèi)核的發(fā)布有兩種形式,一種是完整的內(nèi)核版本,另外一種是patch文件,即補(bǔ)丁。完整的內(nèi)核版本比較大,比如linux-2.4.0- test8.tar.bz2就有18M之多。完整內(nèi)核版本一般是.tar.gz(.tgz)文件或者是.bz2文件,二者分別是使用gzip或者 bzip2進(jìn)行壓縮的文件,使用時需要解壓縮。patch文件則比較小,一般只有幾十K到幾百K,極少的會超過1M。但是patch文件是針對于特定的版本的,需要找到自己對應(yīng)的版本才能使用。編譯內(nèi)核需要root權(quán)限。把需要升級的內(nèi) 拷貝到/usr/src/下(下文中以2.2.16的內(nèi)核的 linux-2.2.16tar.gz為例),命令為

    #cp linux-2.2.16tar.gz /usr/src

    先查看當(dāng)前/usr/src的內(nèi)容,注意到有一個linux的符號鏈接,它指向一個類似于linux-2.2.14(對應(yīng)于現(xiàn)在使用的內(nèi)核版本號)的目錄。首先刪除這個鏈接:

    #cd /usr/src
    #rm -f linux 
    現(xiàn)在解壓下載的源程序文件。如果所下載的是.tar.gz(.tgz)文件,使用命令:

    #tar -xzvf linux-2.2.16tar.gz

    如果下載的是.bz2文件,例如linux-2.2.16tar.bz2,使用命令

    #bzip2 -d linux-2.2.16tar.bz2
    #tar -xvf linux-2.2.16tar

    現(xiàn)在再來看一下/usr/src下的內(nèi)容,發(fā)現(xiàn)現(xiàn)在有了一個名為linux的目錄,里面就是需要升級到的版本的內(nèi)核的源程序。還記得那個名為linux的鏈接么?之所以使用那個鏈接就是防止在升級內(nèi)核的時候會不慎把原來版本內(nèi)核的源程序給覆蓋掉了。現(xiàn)在也需要同樣處理:

    #mv linux linux-2.2.16
    #ln -s linux-2.2.16 linux

    如果還下載了patch文件,比如patch-2.2.16,就可以進(jìn)行patch操作(下面假設(shè)patch-2.2.16已經(jīng)位于/usr/src目錄下了,否則需要先把該文件拷貝到/usr/src下): 

    #patch -p0 < patch-2.2.16

    第二部分 準(zhǔn)備主機(jī)板和相關(guān)硬件的說明手冊

    其實(shí)也不用太詳細(xì),只要知道您的硬件是屬于哪一類型就行了。例如:有一張SCSI卡,那就要知道這張卡的名字,有一臺cd-rom,就要知道這臺光驅(qū)是哪一種牌子的,是否為標(biāo)準(zhǔn)的IDE/ATAPI界面,還是另有專屬接口卡呢?或者,主機(jī)版是否有支持Triton芯片(通常586以上的電腦常有),這些信息能幫助我們,使得設(shè)定變得清楚且容易。因此,不管您有什么使用手冊,準(zhǔn)備好吧。即使現(xiàn)在不用,將來還是會用到的(設(shè)X-window system時要顯示卡的手冊)。

    第三部分 檢查聲卡的IRQ設(shè)定和其種類

    如果配有一張聲卡,除了要知道卡的種類外(例如 Sound Blaster)還需要知道這張卡的IRQ地址。一般來說,盧卡的IRQ地址是5或7而IO地址則為220。DMA則l,不過,有時不同的聲卡可能會有不同的設(shè)定。因?yàn)樯院蟮倪x項(xiàng)里,就會要填入這些數(shù)字。

    第四部分 編譯核心的硬件需求

    在編譯核心時,確定您的RAM最好在8MB以上, 否則可能會很慢而且問題會很多,記得查看swap有沒有打開(用free指令)。此外,最好不要超頻,不然很有可能會發(fā)生signal 11的錯誤,使得編到一半的核心停了下來,其實(shí)編譯核心就好比編譯程序一樣,只是因?yàn)闃?gòu)成核心的程序太多了,因此我們能小心盡量小心。

    第二章 內(nèi)核編譯的流程

    概述編譯的流程:

    編譯開始----- make mrproper;檢查所需的連接
    配置核心
    編譯核心
    編輯/etc/lilo.conf
    重新啟動新核心
    重新啟動機(jī)器 
    發(fā)現(xiàn)并修理故障(仔細(xì)看我的文章,應(yīng)該沒多少問題了)

    第一節(jié) 編譯開始

    通常要運(yùn)行的第一個命令是:

    #cd /usr/src/linux 
    #make mrproper 

    該命令確保源代碼目錄下沒有不正確的目標(biāo).o文件以及文件的互相依賴。如使用剛下載的完整的源程序包進(jìn)行編譯,本步可以省略。而如果多次使用了這些源程序編譯內(nèi)核,那么最好要先運(yùn)行一下這個命令。

    確保/usr/include/目錄下的asm、linux和scsi等鏈接是指向要升級的內(nèi)核源代碼的。它們分別鏈向源代碼目錄下的真正的、該計算機(jī)體系結(jié)構(gòu)(對于PC機(jī)來說,使用的體系結(jié)構(gòu)是i386)所需要的真正的include子目錄。如:asm指向/usr/src/linux/include /asm-i386等。若沒有這些鏈接,就需要手工創(chuàng)建,按照下面的步驟進(jìn)行:

    # cd /usr/include
    # rm -r asm linux scsi
    # ln -s /usr/src/linux/include/asm-i386 asm
    # ln -s /usr/src/linux/include/linux linux
    # ln -s /usr/src/linux/include/scsi scsi

    這是配置非常重要的一部分。刪除掉/usr/include下的asm、linux和scsi鏈接后,再創(chuàng)建新的鏈接指向新內(nèi)核源代碼目錄下的同名的目錄。這些頭文件目錄包含著保證內(nèi)核在系統(tǒng)上正確編譯所需要的重要的頭文件。也是上面又在/usr/src下"多余"地創(chuàng)建了個名為linux的鏈接的原因之一. 

    一旦萬事俱備,轉(zhuǎn)到/usr/src/linux。現(xiàn)在你也許想停下細(xì)讀一下文檔文件,實(shí)際上如果你有些特別的硬件,或幾種光驅(qū)驅(qū)動程需要自己動手設(shè)置,他們通常這樣做,當(dāng)引導(dǎo)時這些驅(qū)動程序?qū)⒔o出警告,這并不礙事他們照常工作少,閱讀擴(kuò)展名為.txt .h .c的文件。通常我發(fā)現(xiàn)他們具有共性且易于配置。如果你不想冒險,你沒必要做。記住你照樣可以解開tar文件(或再次安裝.rpm文件)恢復(fù)前的文件。 

    第二節(jié) 配置內(nèi)核 核心內(nèi)容

    接下來的內(nèi)核配置過程比較煩瑣,但是配置的適當(dāng)與否與日后Linux的運(yùn)行直接相關(guān),有必要了解一下選項(xiàng)的設(shè)置。

    配置內(nèi)核可以根據(jù)需要與愛好使用下面命令中的一個:

    #make config (基于文本的最為傳統(tǒng)的配置界面,不推薦使用)
    #make menuconfig(基于文本選單的配置界面,字符終端下推薦使用,必須安裝ncurses-dev和tk4-dev庫) 
    #make xconfig (基于圖形窗口模式的配置界面,Xwindow下推薦使用)
    #make oldconfig (如果只想在原來內(nèi)核配置的基礎(chǔ)上修改一些小地方,會省去不少麻煩)

    如果不能使用Xwindow,那么就使用make menuconfig好了。界面雖然比上面一個差點(diǎn),總比make config的要好多了。選擇相應(yīng)的配置時,有三種選擇,它們分別代表的含義如下:

      Y--將該功能編譯進(jìn)內(nèi)核
      N--不將該功能編譯進(jìn)內(nèi)核
      M--將該功能編譯成可以在需要時動態(tài)插入到內(nèi)核中的模塊 
    在每一個選項(xiàng)前都有個括號, 但有的是中括號有的是尖括號,還有一種圓括號。 用空格鍵選擇時可以發(fā)現(xiàn),中括號里要么是空,要么是"*",而尖括號里可以是空,"*"和"M"。這表示前者對應(yīng)的項(xiàng)要么不要,要么編譯到內(nèi)核里;后者則多一樣選擇,可以編譯成模塊。而圓括號的內(nèi)容是要在所提供的幾個選項(xiàng)中選擇一項(xiàng)。在編譯內(nèi)核的過程中,最煩雜的事情就是這步配置工作了,不清楚到底該如何選取這些選項(xiàng)。實(shí)際上在配置時,大部分選項(xiàng)可以使用其缺省值,只有小部分需要根據(jù)用戶不同的需要選擇。選擇的原則是將與內(nèi)核其它部分關(guān)系較遠(yuǎn)且不經(jīng)常使用的部分功能代碼編譯成為可加載模塊,有利于減小內(nèi)核的長度,減小內(nèi)核消耗的內(nèi)存,簡化該功能相應(yīng)的環(huán)境改變時對內(nèi)核的影響;不需要的功能就不要選;與內(nèi)核關(guān)心緊密而且經(jīng)常使用的部分功能代碼直接編譯到內(nèi)核中。下面對選項(xiàng)分別加以介紹。



    1.Code maturity level options代碼成熟等級

    此處只有一項(xiàng):prompt for development and/or incomplete code/drivers,如果要試驗(yàn)現(xiàn)在仍處于實(shí)驗(yàn)階段的功能,比如khttpd、IPv6等,就必須把該項(xiàng)選擇為Y了;否則可以把它選擇為N。 在Linux的世界里,每天都有許多人為它發(fā)展支持的 driver和加強(qiáng)它的核心。但是有些driver還沒進(jìn)入穩(wěn)定的階段。但其作者很歡迎其他人去測試這些driver并提出一些bugs。這個問題是說,有一些drive還在做測試中,問您是否要選擇這些drive或支持的程序碼。

    如果鍵入Y,往后將會出現(xiàn)一些還在測試中的東西給您做選擇。(像Java的程序碼和PCI bridge),臺則就鍵入N。

    2. Processor type and features處理器類型和特色

    #Processor family (386, 486/Cx486, 586/K5/5x86/6x86, Pentium/K6/TSC,PPro /6x86MX) [PPro/6x86MX] ------選擇處理器類型,缺省為Ppro/6x86MX。它會對每種CPU做最佳化,讓它跑得快又好。一般來說,沒有選擇正確的CPU并不會有重大的影響(特別是選擇386 ,這樣編譯出來的核心也許會比較小但它的速度可能就會變慢了)。所以,最好要知道您的CPU是哪一種。不過,如果您的gCC編譯器是2.7.0版以前的。那么只能選擇386或是486。

    #High Memory Support------內(nèi)核支持的最大內(nèi)存數(shù),缺省為1G。可以支持到4G、6.4G,一般可以不選. 

    #Math emulation------這項(xiàng)詢問是否需L1nux核心模擬數(shù)學(xué)浮點(diǎn)運(yùn)算器。如果有486Dx、AMD以及Pentium機(jī)器的話,這個選項(xiàng)就不必選了,因?yàn)樗鼈兌加袃?nèi)建的浮點(diǎn)運(yùn)算器。協(xié)處理器是在386時代的寵兒,現(xiàn)在早已不用了。不過,對于有內(nèi)建浮點(diǎn)運(yùn)算器的人來說,選了這個選項(xiàng)并不會因此讓內(nèi)建的浮點(diǎn)運(yùn)算器失效。但它會增大核心約45KB。

    #MTTR (memory type range register)support------選擇該選項(xiàng),系統(tǒng)將生成/proc/mtrr文件對 MTRR進(jìn)行管理,供X server使用。同時用來啟動pentinum pro和pentinum II 的特殊功能,如果你用的不是這類CPU就選 N,否則也僅僅是使內(nèi)核變大而已。

    #Symmetric multi-processing support------對稱多處理支持。除非有多個CPU,否則就不用選了。

    3. Loadable module support對模塊的支持. 

    首先,了解一點(diǎn)關(guān)于模塊的知識。模塊就像你特意插入核心中的某些東西,如果辦公室有一個小網(wǎng)絡(luò)并且有時想用一下(但并不經(jīng)常),也許你想把網(wǎng)卡編譯成一個模塊。使用這個模塊,機(jī)器必運(yùn)行和存取/libs下的模塊,意思是驅(qū)動程序(IDE,SCSI等但必須是NFS支持的網(wǎng)卡),文件系統(tǒng)(通常是ext2但也可以是nfs)和核心類型(最好是elf)必須編譯在內(nèi)核并且不能是模塊,模塊只有核心引導(dǎo)時才起作用,驅(qū)動程序(來網(wǎng)絡(luò))的存取,和文件系統(tǒng)安裝。這些文件必須編譯在核心內(nèi)否則將能安裝啟動分區(qū)。如果安裝啟動分區(qū)和網(wǎng)絡(luò),你需要網(wǎng)絡(luò)系統(tǒng)文件,和己經(jīng)編譯的網(wǎng)卡。為什么要使用模塊? 模塊化使核心變的更簡捷,它減少核心釋放大量的受保護(hù)的空間。模塊的安裝和卸載使用的空間是可重復(fù)分配利用的。如果你打開機(jī)器有90%以上的時間用到一個模塊,編譯它。運(yùn)用這類模塊是浪費(fèi)內(nèi)存的,原因是一旦你編譯了模塊它們同樣將占用大量的內(nèi)存,核心需要一些代碼來掛上模塊。記住,核心在保護(hù)空間運(yùn)行,但模塊并不是。這么說,并不經(jīng)常使用我的設(shè)備,把它編譯成只支持ext2,ide和elf。而一直使用的網(wǎng)卡,把其它的編譯成模塊:如 a.out, java, floppy, iso9960, msdos, minix, vfat,smb,nfs,smcultra(ethernetcard),serial,printer,sound,ppp, 等等。它們許多只是在這或那用上那么幾分鐘。嚴(yán)格的說,這樣做會使核心增大許多而降低它的執(zhí)行速度。這時我們就可以把這些可能會用的驅(qū)動程序編譯成一個— 個的模塊,在需要用的時候才用insmod這個指令加入核心,不用的時候也能rmmod把它從核心移除,或是用lsmod察看目前所載入的模塊。這里面有三項(xiàng):

    #Enable loadable module support------除非準(zhǔn)備把所有需要的內(nèi)容都編譯到內(nèi)核里面,否則該項(xiàng)應(yīng)該是必選的。

    #Set version information on all module symbols------通常,我們更新核心版本之后,模塊耍重新的編譯。這個選項(xiàng)使您不必更新編譯模塊而能使用以前的模塊。可以不選它。但如果您選y,則按照它的說明,您必須有g(shù)enksyms這個程序(可用 whereis指令查看有無此程序)。

    #Kernel module loader------讓內(nèi)核在啟動時有自己裝入必需模塊的能力,建議選上。

    注意:在開機(jī)就會 mount 上來的 partition 的 FS 、device driver 記得要 compiler 進(jìn) kernel,不能把它弄成 modules。請不要夸張到為了完全模組化而忘了把ext2fs和IDE dirver compiler 進(jìn) kernel 里。

    #Support for hot-pluggabel devices ------熱插拔設(shè)備支持。支持的不是太好,可不選。

    #PCMCIA/CardBus support------PCMCIA/CardBus支持。有PCMCIA就必選了。

    #PCI bridge optimization (experimental) ------在某些支持BIOS上,它能讓存取速度加快,建議是選Y。

    #Backward-compatible /proc/pci------設(shè)備兼容,自己看help。

    #System V IPC 如果將來想編譯dosemu(DOS模擬器),則這個選項(xiàng)一定要選,它是一個讓各個程序(process)同步且能彼此交換數(shù)據(jù)的函數(shù)庫和一些系統(tǒng)的調(diào)用,沒它,很多的程序?qū)䶮o法執(zhí)行。

    #BSD Process Accounting------ 

    #Sysctl support------除非你的內(nèi)存少的可憐,否則你應(yīng)該啟動這個功能,啟用該選項(xiàng)后內(nèi)核會大8K,但能讓你直接改變內(nèi)核的參數(shù)而不必重新開機(jī)。

    #Kernel support for A.OUT binaries ------a.out的執(zhí)行文件是比較古老的可執(zhí)行碼,用在比較早期的 UNIX系統(tǒng)上。Linux最初也是使用這種碼來執(zhí)行程序,一直到ELF格式的可執(zhí)行碼出來后,有愈來俞多的程序碼隨著ELF格式的優(yōu)點(diǎn)而變成了ELF的可執(zhí)碼。將來勢必完全取代a.out格式的可執(zhí)行碼。但目前由于沿有許多的程序還沒有取代過來,所以只好選擇Y,等將來有一天,全部的程序都變成了ELF 的天下時,那時再disable掉。

    主站蜘蛛池模板: 少妇愉情理伦片丰满丰满| 精品小视频在线| 好男人在线社区www我在线观看 | 亚洲精品国产肉丝袜久久| 美女高清特黄a大片| 国产精品v欧美精品∨日韩| 一级在线|欧洲| 无码任你躁久久久久久| 亚洲国产精品无码久久青草| 激情伊人五月天久久综合| 国产亚洲一区二区在线观看| 91亚洲va在线天线va天堂va国产| 孕妇被迫张开腿虐孕| 久久国产三级精品| 最近2019中文免费字幕| 人妻丰满熟妇AV无码区免| 精品人妻一区二区三区四区| 国产天堂在线观看| 538国产视频| 国内精品久久久久国产盗摄| 两个人看的www视频日本| 无码国内精品人妻少妇蜜桃视频| 亚洲中久无码永久在线观看同| 欧美牲交a欧美牲交aⅴ免费真| 再深点灬舒服灬太大了69| 羞羞歪歪汗汗漫画| 国产成人不卡亚洲精品91| 666永久视频在线| 国内精品久久久久影视| 一个人www免费看的视频| 成人免费看www网址入口| 久久精品.com| 日韩人妻无码一区二区三区久久| 亚洲国产视频一区| 污污内射在线观看一区二区少妇 | 好吊妞788免费视频播放| 久久久久人妻一区精品果冻| 日美女大长腿b| 亚洲aⅴ在线无码播放毛片一线天 亚洲aⅴ在线无码播放毛片一线天 | 麻豆久久婷婷综合五月国产| 国产精品白丝AV网站|