在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux的啟動(dòng)和核心介紹

            Linux的啟動(dòng)和核心介紹

            作者: 時(shí)間:2011-02-24 來(lái)源:網(wǎng)絡(luò) 收藏
            這是一次對(duì)Linux介紹后的整理。
              對(duì)象是一些剛對(duì)Linux核心感興趣,并且準(zhǔn)備進(jìn)一步研究和改造的同志。
              因?yàn)槭怯商峋V整理而成,有些亂,見(jiàn)諒!
               
              四部分內(nèi)容:
              一、Linux核心源碼結(jié)構(gòu)介紹
              二、編譯和配置的過(guò)程
              三、系統(tǒng)啟動(dòng)順序的相關(guān)文件
              四、核心改造的一些經(jīng)驗(yàn)
              一、
              當(dāng)我們安裝好一個(gè)Linux系統(tǒng),通常核心源碼存放在/usr/src/linux/目錄。
              下面先看看這目錄下的各個(gè)子目錄及文件。
              [/]#cd /usr/src/linux
              [linux]#ls -aF
              ./ MAINTAINERS drivers/ kernel/ scripts/
              ../ Makefile fs/ lib/
              COPYING README include/ mm/
              CREDITS Rules.make init/ modules/
              Documentation/ arch/ ipc/ net/
              下面我們逐一描述:
              COPYING
              GPL版權(quán)申明,看后你至少應(yīng)該知道,你對(duì)具有GPL版權(quán)的源代碼改動(dòng)而形成的程序,或使用GPL工具產(chǎn)生的程序,具有使用GPL發(fā)表的義務(wù)。其中之一就是公開(kāi)源代碼。 bitsCN#com中國(guó)網(wǎng)管聯(lián)盟
              CREDITS
              光榮榜,你應(yīng)當(dāng)感謝的一些人的信息,其中的每一個(gè)人都對(duì)Linux做出過(guò)很大貢獻(xiàn)。
              Documentation/
              文檔目錄,可有選擇地看一下你感興趣的部分
              MAINTAINERS
              維護(hù)人員列表,對(duì)當(dāng)前版本的內(nèi)核各部分都有誰(shuí)負(fù)責(zé),如果你研究的夠深入,可以與他們討論
              Makefile
              如果你在UNIX編譯過(guò)程序,可以看明白R(shí)EADME,Linus 所寫(xiě),核心及其編譯配置方法簡(jiǎn)單介紹Rules.make: make時(shí)使用的一些共同規(guī)則
              arch/
              architecture(體系結(jié)構(gòu))我關(guān)心的i386啟動(dòng)過(guò)程在其中,包括Linux在多種平臺(tái)下的實(shí)現(xiàn)。如果要移植系統(tǒng)到一個(gè)新的CPU環(huán)境中,這就是你要關(guān)心的目錄
              drivers/
              驅(qū)動(dòng)程序目錄,包含大量設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn),按類(lèi)別分子目錄
              fs/
              文件系統(tǒng),實(shí)現(xiàn)了當(dāng)前流行的幾乎所有文件系統(tǒng)。Cool
              include/
              嵌入文件目錄
              init/
              初始化文件,包含main.c和version.c兩個(gè)文件。Initialize
              ipc/
              ipc的實(shí)現(xiàn),與SYS V兼容
              kernel/
              最核心代碼,調(diào)度,中斷,信號(hào)等的處理
              lib/
              一些工具。
              Mm/
              內(nèi)存管理,Memory Manager,虛擬頁(yè)、緩沖的實(shí)現(xiàn)。 中國(guó)_網(wǎng)管聯(lián)盟bitsCN.com
              Modules/
              模塊文件目錄,用于存放編譯時(shí)產(chǎn)生的模塊目標(biāo)文件(參考編譯過(guò)程)
              net/
              網(wǎng)絡(luò)實(shí)現(xiàn),包括TCP/IP在內(nèi)的大量網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)。
              Scripts/
              描述文件,腳本,用于對(duì)核心的配置。
               
              二、
              構(gòu)造內(nèi)核
              常用命令包括:
              make config, dep, clean, mrproper, zImage, bzImage, modules, modules_install
              
              (1) make config
              核心配置,調(diào)用./scripts/Configure 按照arch/i386/config.in 來(lái)進(jìn)行配置。
              命令執(zhí)行完后產(chǎn)生文件.config,其中保存著配置信息。下一次再做make config將產(chǎn)生新的.config文件,原.config被改名為.config.old
              (2)make dep
              尋找依存關(guān)系,產(chǎn)生兩個(gè)文件.depend和.hdepend。其中.hdepend表示每個(gè).h文件都包含其它哪些嵌入文件。而.depend 文件有多個(gè),在每個(gè)會(huì)產(chǎn)生目標(biāo)文件(.o)文件的目錄下均有,它表示每個(gè)目標(biāo)文件都依賴哪些嵌入文件(.h)。
               
              (3)make clean
              清出以前構(gòu)核所產(chǎn)生的所有目標(biāo)文件、模塊文件、核心以及一些臨時(shí)文件等,不產(chǎn)生任何文件。
              
              (4)make rmproper
              刪除所有因構(gòu)核過(guò)程中產(chǎn)生的所有文件,及除了做make clean外,還要?jiǎng)h除.config,.depend等文件,把核心源碼恢復(fù)到最原始的狀態(tài)。下次構(gòu)核時(shí)就必須重新配置了。

               
              (5)make, make zImage, make bzImage
              make:
              構(gòu)核。通過(guò)各目錄的Makefile文件進(jìn)行。會(huì)在各個(gè)目錄下產(chǎn)生一大堆目標(biāo)文件,若核心代碼沒(méi)有錯(cuò)誤,將產(chǎn)生文件vmlinux,這就是所構(gòu)的核心。并產(chǎn)生映射文件System.map通過(guò)各目錄的Makefile文件進(jìn)行。.version 文件中的數(shù)加1,表示版本號(hào)(又產(chǎn)生一個(gè)新的版本了),讓你明白,你已經(jīng)對(duì)核心改動(dòng)過(guò)多少次了。
              Make zImage:
              在make的基礎(chǔ)上產(chǎn)生壓縮的核心映象文件./arch/$(ARCH)/boot/zImage以及在./arch/$(ARCH)/boot/compresed/目錄下產(chǎn)生一些臨時(shí)文件。
              Make bzImage:
              在make 的基礎(chǔ)上產(chǎn)生壓縮比例更大的核心映象文件./arch/$(ARCH)/boot/bzImage以及在./arch/$(ARCH)/boot/compresed/目錄下產(chǎn)生一些臨時(shí)文件。在核心太大時(shí)進(jìn)行。
              (6)make modules
              編譯模塊文件,你在make config時(shí)所配置的所有模塊將在這時(shí)編譯,形成模塊目標(biāo)文件,并把這些目標(biāo)文件存放在modules目錄中。使用如下命令看一看。
              Ls modules
              (7)make modules_install
              把上面編譯好的模塊目標(biāo)文件目錄/lib/modules/$KERNEL_VERSION/ 中。比如我的版本是2.0.36,做完這個(gè)操作后可使用下面的命令看看:

              ls /lib/modules/2.0.36/
               
              相關(guān)的命令還有很多,有興趣可看相關(guān)資料和Makefile文件。
              另外注意,這兒我們產(chǎn)生了一些隱含文件
              .config
              .oldconfig
              .depend
              .hdepend
              .version
              它們的意義應(yīng)該很清楚了。
              三、
              系統(tǒng)的啟動(dòng)順序及相關(guān)文件
              仍在核心源碼目錄下,看以下幾個(gè)文件
              ./arch/$ARCH/boot/bootsect.s
              ./arch/$ARCH/boot/setup.s
              ./init/main.c
               
              bootsect.S 及 setup.S
               這個(gè)程序是linux kernel的第一個(gè)程序,包括了linux自己的bootstrap程序,但是在說(shuō)明這個(gè)程序前,必須先說(shuō)明一般IBM PC開(kāi)機(jī)時(shí)的動(dòng)作(此處的開(kāi)機(jī)是指"打開(kāi)PC的電源"):
                一般PC在電源一開(kāi)時(shí),是由內(nèi)存中地址FFFF:0000開(kāi)始執(zhí)行(這個(gè)地址一定在ROM BIOS中,ROM BIOS一般是在FEOOOh到FFFFFh中),而此處的內(nèi)容則是一個(gè)jump指令,jump到另一個(gè)位於ROM BIOS中的位置,開(kāi)始執(zhí)行一系列的動(dòng)作,包括了檢查RAM,keyboard,顯示器,軟硬磁盤(pán)等等,這些動(dòng)作是由系統(tǒng)測(cè)試代碼(system test code)來(lái)執(zhí)行的,隨著制作BIOS廠商的不同而會(huì)有些許差異,但都是大同小異,讀者可自行觀察自家機(jī)器開(kāi)機(jī)時(shí),螢?zāi)簧纤@示的檢查訊息。

                緊接著系統(tǒng)測(cè)試碼之后,控制權(quán)會(huì)轉(zhuǎn)移給ROM中的啟動(dòng)程序(ROM bootstrap routine),這個(gè)程序會(huì)將磁盤(pán)上的第零軌第零扇區(qū)讀入內(nèi)存中(這就是一般所謂的boot sector,如果你曾接觸過(guò)電腦病,
              毒,就大概聽(tīng)過(guò)它的大名),至於被讀到內(nèi)存的哪里呢? --絕對(duì)位置07C0:0000(即07C00h處),這是IBM系列PC的特性。而位在linux開(kāi)機(jī)磁盤(pán)的boot sector上的正是linux的bootsect程序,也就是說(shuō),bootsect是第一個(gè)被讀入內(nèi)存中并執(zhí)行的程序?,F(xiàn)在,我們可以開(kāi)始來(lái)看看到底bootsect做了什么。
              第一步
               首先,bootsect將它"自己"從被ROM BIOS載入的絕對(duì)地址0x7C00處搬到0x90000處,然后利用一個(gè)jmpi(jump indirectly)的指令,跳到新位置的jmpi的下一行去執(zhí)行,
              第二步
               接著,將其他segment registers包括DS,ES,SS都指向0x9000這個(gè)位置,與CS看齊。另外將SP及DX指向一任意位移地址( offset ),這個(gè)地址等一下會(huì)用來(lái)存放磁盤(pán)參數(shù)表(disk para- meter table )
              第三步
               接著利用BIOS中斷服務(wù)int 13h的第0號(hào)功能,重置磁盤(pán)控制器,使得剛才的設(shè)定發(fā)揮功能。
               
              第四步
               完成重置磁盤(pán)控制器之后,bootsect就從磁盤(pán)上讀入緊鄰著bootsect的setup程序,也就是setup.S,此讀入動(dòng)作是利用BIOS中斷服務(wù)int 13h的第2號(hào)功能。Setup的image將會(huì)讀入至程序所指定的內(nèi)存絕對(duì)地址0x90200處,也就是在內(nèi)存中緊鄰著bootsect 所在的位置。待setup的image讀入內(nèi)存后,利用BIOS中斷服務(wù)int 13h的第8號(hào)功能讀取目前磁盤(pán)的參數(shù)。

              第五步
               再來(lái),就要讀入真正linux的kernel了,也就是你可以在linux的根目錄下看到的"vmlinuz" 。在讀入前,將會(huì)先呼叫BIOS中斷服務(wù)int 10h 的第3號(hào)功能,讀取游標(biāo)位置,之后再呼叫BIOS 中斷服務(wù)int 10h的第13h號(hào)功能,在螢?zāi)簧陷敵鲎执?Loading",這個(gè)字串在boot linux時(shí)都會(huì)首先被看到,相信大家應(yīng)該覺(jué)得很眼熟吧。
              第六步
               接下來(lái)做的事是檢查root device,之后就仿照一開(kāi)始的方法,利用indirect jump 跳至剛剛已讀入的setup部份比較
               把大家所熟知的MS DOS 與linux的開(kāi)機(jī)部份做個(gè)粗淺的比較,MS DOS 由位於磁盤(pán)上boot sector的boot程序負(fù)責(zé)把IO.SYS載入內(nèi)存中,而IO.SYS則負(fù)有把DOS的kernel --MSDOS.SYS載入內(nèi)存的重責(zé)大任。而linux則是由位於boot sector 的
              bootsect程序負(fù)責(zé)把setup及l(fā)inux的kernel載入內(nèi)存中,再將控制權(quán)交給setup。
              ##這幾步內(nèi)容主要參照一個(gè)臺(tái)灣同胞寫(xiě)的文檔,setup.s的內(nèi)容希望有人補(bǔ)充。
               
              Start_kernel()
              當(dāng)核心被載入后,首先進(jìn)入的函數(shù)就是start_kernel。
              ./init/main.c 中函數(shù)start_kernel包含核心的啟動(dòng)過(guò)程及順序。
              通過(guò)它來(lái)看核心整個(gè)初始化過(guò)程。
              首先進(jìn)行一系列初始化,包括: [bitsCN.Com]
              trap_init(); ##./arch/i386/kernel/traps.c 陷入
              init_IRQ(); ##./arch/i386/kernel/irq.c setup IRQ
              sched_init(); ##./kernel/sched.c 調(diào)度初始化,并初始化bottom_half
              time_init(); ##./arch/i386/kernel/time.c
              init_modules(); ##


            linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)


            評(píng)論


            相關(guān)推薦

            技術(shù)專(zhuān)區(qū)

            關(guān)閉