色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

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

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

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

          本文引用地址:http://cafeforensic.com/article/201808/388126.htm

          一 般, 在Linux中初始化腳本在/etc/inittab 文件(或稱初始化表)中可以找到關(guān)于不同運(yùn)行級(jí)別的描述。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》 請(qǐng)注意init是1號(hào)進(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)存中。在列表中使用中括號(hào)來區(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)程。對(duì)于有許多臟的緩沖區(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ì)軟中斷隊(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, 是用來檢測(cè)USB hub設(shè)備的,當(dāng)usb有動(dòng)態(tài)插拔時(shí),將交由此內(nèi)核進(jìn)程來處理。在檢測(cè)到有hub事件時(shí)會(huì)有相應(yīng)的動(dòng)作(usb_hub_events())

          H》 mtdblockd是用來對(duì)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é)對(duì)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é)性的文章。在對(duì)uclinux的啟動(dòng)過程做了一個(gè)詳細(xì)注釋后,大家 會(huì)對(duì)涉及到嵌入系統(tǒng)的各個(gè)概念有了一個(gè)更加明確的認(rèn)識(shí),并能對(duì)嵌入系統(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ù)段、堆棧、頁(yè)表(針對(duì)使用虛擬地址的操作系統(tǒng))等內(nèi)容,所以需要在RAM中運(yùn)行操作系統(tǒng)。

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

          從本質(zhì)上來講,bootloader不屬于操作系統(tǒng)內(nèi)核。它采用匯編語言編寫,因此針對(duì)不同的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ù)的長(zhǎng)度比較短,代碼如下:



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

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉