新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > uclinux啟動(dòng)過程詳細(xì)分析

        uclinux啟動(dòng)過程詳細(xì)分析

        作者: 時(shí)間:2018-08-31 來源:網(wǎng)絡(luò) 收藏

        本文引用地址:http://www.104case.com/article/201808/388126.htm

        一 般, 在Linux中初始化腳本在/etc/inittab 文件(或稱初始化表)中可以找到關(guān)于不同運(yùn)行級別的描述。inittab是以行為單位的描述性(非執(zhí)行性)文本,每一個(gè)指令行都是固定格式。 inittab中有respawn項(xiàng),但如果一個(gè)命令運(yùn)行時(shí)失敗了,為了避免重運(yùn)行的頻率太高,init將追蹤一個(gè)命令重運(yùn)行了多少次,并且如果重運(yùn)行的 頻率太高,它將被延時(shí)五分鐘后再運(yùn)行。

        ② kernel進(jìn)程

        A》 請注意init是1號進(jìn)程,其他進(jìn)程id分別是kflushd/ bdflush, kupdate, kpiod and kswapd。這里有一個(gè)要指出的:你會(huì)注意到虛擬占用(SIZE)和實(shí)際占用(RSS)列都是0,進(jìn)程怎么會(huì)不使用內(nèi)存呢?

        這些進(jìn)程就是內(nèi)核守護(hù)進(jìn)程。大部分內(nèi)核并不顯示在進(jìn)程列表里。守護(hù)進(jìn)程在init之后啟動(dòng),所以他們和其他進(jìn)程一樣有進(jìn)程ID,但是他們的代碼和數(shù)據(jù)都存放在內(nèi)核占有的內(nèi)存中。在列表中使用中括號來區(qū)別與其他進(jìn)程。

        B》 輸入和輸出是通過內(nèi)存中的緩沖來完成的,這讓事情變得更快,程序的寫入會(huì)存放在內(nèi)存緩沖中,然后再一起寫入硬盤。守護(hù)進(jìn)程kflushd和kupdate 管理這些工作。kupdate間斷的工作(每5秒)來檢查是否有寫過的緩沖,如過有,就讓kflushd把它們寫入磁盤。

        C》 進(jìn)程有時(shí)候無事可做,當(dāng)它運(yùn)行時(shí)也不一定需要把其所有的代碼和數(shù)據(jù)都放在內(nèi)存中。這就意味著我們可以通過把運(yùn)行中程序不用的內(nèi)容切換到交換分區(qū)來更好的是利用內(nèi)存。把這些進(jìn)程數(shù)據(jù)移入/移出內(nèi)存通過進(jìn)程IO管理守護(hù)進(jìn)程kpiod和交換守護(hù)進(jìn)程kswapd,大約每隔1秒,kswapd醒來并檢查內(nèi)存情 況。如果在硬盤的東西要讀入內(nèi)存,或者內(nèi)存可用空間不足,kpiod就會(huì)被調(diào)用來做移入/移出操作。

        D》 bdflush - BUF_DIRTY, 將dirty緩存寫回到磁盤的核心守護(hù)進(jìn)程。對于有許多臟的緩沖區(qū)(包含必須同時(shí)寫到磁盤的數(shù)據(jù)的緩沖區(qū))的系統(tǒng)提供了動(dòng)態(tài)的響應(yīng)。它在系統(tǒng)啟動(dòng)的時(shí)候作為一個(gè)核心線程啟動(dòng),它叫自己為 “kflushd”,而這是你用ps顯示系統(tǒng)中的進(jìn)程的時(shí)候你會(huì)看得的名字。即定期(5秒)將臟(dirty)緩沖區(qū)的內(nèi)容寫入磁盤,以騰出內(nèi)存;

        E》 ksoftirqd_CPUx 是一個(gè)死循環(huán), 負(fù)責(zé)處理軟中斷的。它是用來對軟中斷隊(duì)列進(jìn)行緩沖處理的進(jìn)程。當(dāng)發(fā)生軟中斷時(shí),系統(tǒng)并不急于處理,只是將相應(yīng)的的中斷狀態(tài)結(jié)構(gòu)中的active 的相應(yīng)的位,置位,并將相應(yīng)的處理函數(shù)掛到相應(yīng)的隊(duì)列,然后等待調(diào)度時(shí)機(jī)來臨,再來處理。

        ksoftirqd_CPUx是由 _raise_softirq() 即觸發(fā)中斷,喚醒的內(nèi)核線程,這涉及到軟中斷,ksoftirqd的代碼參見[kernel/softirq.c]。

        F》 keventd,它的任務(wù)就是執(zhí)行 scheduler 調(diào)度器隊(duì)列中的任務(wù),keventd 為它運(yùn)行的任務(wù)提供了可預(yù)期的進(jìn)程上下文。

        G》 khubd, 是用來檢測USB hub設(shè)備的,當(dāng)usb有動(dòng)態(tài)插拔時(shí),將交由此內(nèi)核進(jìn)程來處理。在檢測到有hub事件時(shí)會(huì)有相應(yīng)的動(dòng)作(usb_hub_events())

        H》 mtdblockd是用來對flash塊設(shè)備進(jìn)行寫操作的守護(hù)進(jìn)程。NAND類型的Flash需要MTD(Memory Technology Devices 內(nèi)存技術(shù)驅(qū)動(dòng)程序)驅(qū)動(dòng)的支持才能被linux所使用。NAND的特點(diǎn)是不能在芯片內(nèi)執(zhí)行(XIP,eXecute In Place),需要把代碼讀到系統(tǒng)RAM中再執(zhí)行,傳輸效率不是最高,最大擦寫次數(shù)量為一百萬次,但寫入和擦除的速度很快,擦除單元小,是高數(shù)據(jù)存儲(chǔ)密度 的最佳選擇。NAND需要I/O接口,因此使用時(shí)需要驅(qū)動(dòng)程序。

        I》 loop0 是負(fù)責(zé)處理loop塊設(shè)備的(回環(huán)設(shè)備)。loopback device指的就是拿文件來模擬塊設(shè)備, 在我們這里,loop設(shè)備主要用來處理需要mount到板上的文件系統(tǒng),類似mount /tmp/rootfs /mnt -o loop。。我們的實(shí)例有:mount -o loop -t cramfs /xxx.bin /xxx 也就是將xxx.bin這個(gè)文件mount到板上來模擬cramfs壓縮ram文件系統(tǒng)。loop0進(jìn)程負(fù)責(zé)對loop設(shè)備進(jìn)行操作。

        loopback設(shè)備和其他的塊設(shè)備的使用方法相同。特別的是,可以在該設(shè)備上建立一個(gè)文件系統(tǒng),然后利用mount命令把該系統(tǒng)映射到某個(gè)目錄下以便訪問。這種整個(gè)建立在一個(gè)普通磁盤文件上的文件系統(tǒng),就是虛擬文件系統(tǒng) (virtual file system)。

        總結(jié)

        上面的內(nèi)容是本人為了在實(shí)際開發(fā)中更加清楚地了解uclinux的啟動(dòng)過程而做的一個(gè)總結(jié)性的文章。在對uclinux的啟動(dòng)過程做了一個(gè)詳細(xì)注釋后,大家 會(huì)對涉及到嵌入系統(tǒng)的各個(gè)概念有了一個(gè)更加明確的認(rèn)識,并能對嵌入系統(tǒng)的軟硬件環(huán)境的有關(guān)設(shè)置更加清楚。當(dāng)你自己動(dòng)手結(jié)合linux源代碼來分析時(shí),將會(huì)有一個(gè)清楚的全局觀。

        =============================================================

        1. 運(yùn)行bootloader初始化程序

        SRAM 、SDRAM等存儲(chǔ)設(shè)備屬于揮發(fā)性的存儲(chǔ)器,掉電以后其中的內(nèi)容就會(huì)全部丟失,所以必須把操作系統(tǒng)的內(nèi)核鏡像存放在Flash等不揮發(fā)性存儲(chǔ)介質(zhì)上。但是操作系統(tǒng)在運(yùn)行時(shí),需要?jiǎng)討B(tài)的創(chuàng)建一些如數(shù)據(jù)段、堆棧、頁表(針對使用虛擬地址的操作系統(tǒng))等內(nèi)容,所以需要在RAM中運(yùn)行操作系統(tǒng)。

        因此,就需要一個(gè)引導(dǎo)程序把操作系統(tǒng)的內(nèi)核鏡像從Flash存儲(chǔ)器拷貝到RAM中,然后再從RAM中執(zhí)行操作系統(tǒng)的內(nèi)核。Bootloader就是可以完成這樣一種功能的程序。

        從本質(zhì)上來講,bootloader不屬于操作系統(tǒng)內(nèi)核。它采用匯編語言編寫,因此針對不同的CPU體系結(jié)構(gòu),這一部分代碼不具有可移植性。在移植操作系統(tǒng)時(shí),這部分代碼必須加以改寫

        具體來講,bootloader在系統(tǒng)啟動(dòng)時(shí)主要完成以下幾項(xiàng)工作:

        (1) 將操作系統(tǒng)內(nèi)核從Flash拷貝到SDRAM中,如果是壓縮格式的內(nèi)核,還要將之解壓縮。

        (2) 改寫系統(tǒng)的memory map,原先flash起始地址映射為0地址,這時(shí)需要將RAM的起始地址映射為0。

        (3) 設(shè)置堆棧指針并將bss段清零。

        將來執(zhí)行C語言程序和調(diào)用子函數(shù)時(shí)要用到

        (4) 改變pc值,使得CPU開始執(zhí)行真正的操作系統(tǒng)內(nèi)核。

        2. 運(yùn)行操作系統(tǒng)內(nèi)核

        bootloader程序執(zhí)行完上述的各項(xiàng)工作后,通過一條跳轉(zhuǎn)指令,轉(zhuǎn)而執(zhí)行init目錄下C語言源文件main.c中的函數(shù)start_kernel()。

        因?yàn)樵诖酥癰ootloader已經(jīng)創(chuàng)建好一個(gè)初始化環(huán)境,C函數(shù)可以開始執(zhí)行了。

        整個(gè)操作系統(tǒng)內(nèi)核的初始化工作從這里才算是真正開始。這個(gè)函數(shù)的長度比較短,代碼如下:



        關(guān)鍵詞: uClinux cpu 控制器

        評論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 邻水| 侯马市| 淄博市| 信宜市| 德江县| 龙山县| 正蓝旗| 特克斯县| 冷水江市| 徐汇区| 驻马店市| 长武县| 广宗县| 台安县| 江西省| 西昌市| 汉中市| 房山区| 手机| 三河市| 平谷区| 绥阳县| 镇远县| 江油市| 海盐县| 洪洞县| 聂拉木县| 洛阳市| 安吉县| 盈江县| 浦城县| 抚顺市| 谷城县| 玉田县| 建宁县| 绥德县| 安泽县| 长岭县| 安仁县| 南江县| 陆良县|