Linux系統下的bootloader、Linux核心、root檔案系統介紹
下面是筆者針對網上bootloader、linuxkernel(linux核心)、rootfile(根檔案系統),三者關係的一個總結,包括提問和回答。
1.LINUX中bootloader、linuxkernel、rootfile三者之間的確切關係是怎麼樣的呢?
bootloader->linuxkernel->rootfile
啟動順序。
後者需要前者提供功能支援,前者的目的就是啟動後者。
2、嵌入式linux的bootloader的啟動流程是怎樣的
一個嵌入式Linux系統從軟體角度看可以分為四個部分:引導載入程式(Bootloader),Linux核心,檔案系統,應用程式。
當系統首次引導時,或系統被重置時,處理器會執行一個位於Flash/ROM中的已知位置處的程式碼,Bootloader就是這第一段程式碼。它主要用來初始化處理器及外設,然後呼叫Linux核心。Linux核心在完成系統的初始化之後需要掛載某個檔案系統作為根檔案系統(
根檔案系統是Linux系統的核心組成部分,它可以作為Linux系統中檔案和資料的儲存區域,通常它還包括系統配置檔案和執行應用軟體所需要的庫。應用程式可以說是嵌入式系統的“靈魂”,它所實現的功能通常就是設計該嵌入式系統所要達到的目標。如果沒有應用程式的支援,任何硬體上設計精良的嵌入式系統都沒有實用意義。
從以上分析可以看出Bootloader在執行過程中雖然具有初始化系統和執行使用者輸入的命令等作用,但它最根本的功能就是為了啟動Linux核心,讓我們進一步分析Bootloader
Bootloader
1、Bootloader基本概述
Bootloader是嵌入式系統的引導載入程式,它是系統上電後執行的第一段程式,其作用類似於PC機上的BIOS。Bootloader是依賴於硬體而實現的,特別是在嵌入式領域,為嵌入式系統建立一個通用的Bootloader是很困難的,但為了能達到啟動Linux核心的目的,所有的Bootloader都必須具備以下功能:
1)初始化RAM
因為Linux核心一般都會在RAM中執行,所以在呼叫Linux核心之前Bootloader必須設定和初始化RAM,為呼叫Linux核心做好準備。初始化RAM的任務包括設定CPU的控制暫存器引數,以便能正常使用RAM以及檢測RAM大小等。
2)初始化串列埠埠
在Linux的啟動過程中有著非常重要的作用,它是Linux核心和使用者互動的方式之一。Linux在啟動過程中可以將資訊通過串列埠輸出,這樣便可清楚的瞭解Linux的啟動過程。雖然它並不是Bootloader必須要完成的工作,但是通過串列埠輸出資訊是除錯Bootloader和Linux核心的強有力的工具,所以一般的Bootloader都會在執行過程中初始化一個串列埠作為除錯埠。
3)檢測處理器型別
Bootloader在呼叫Linux核心前必須檢測系統的處理器型別,並將其儲存到某個常量中提供給Linux核心。Linux核心在啟動過程中會根據該處理器型別呼叫相應的初始化程式。
4)設定Linux啟動引數
Bootloader在執行過程中必須設定和初始化Linux的核心啟動引數。
5)呼叫Linux核心映像
Bootloader完成的最後一項工作便是呼叫Linux核心。如果Linux核心存放在Flash中,並且可直接在上面執行(這裡的Flash指NorFlash),那麼可直接跳轉到核心中去執行。但由於在Flash中執行程式碼會有種種限制,而且速度也遠不及RAM快,所以一般的嵌入式系統都是將Linux核心拷貝到RAM中,然後跳轉到RAM中去執行。
2、Bootloader啟動過程
嵌入式Linux系統通過Bootloader引導,一上電,就要執行Bootloader來初始化系統。在完成對系統的初始化任務之後,它會將非易失性儲存器(通常是Flash或DOC等)中的Linux核心拷貝到RAM中去,然後跳轉到核心的第一條指令處繼續執行,從而啟動Linux核心。Bootloader和Linux核心有著密不可分的聯絡。
Bootloader多數有兩個階段的啟動過程:
Stage1:
基本的硬體初始化
為載入stage2準備RAM空間
拷貝核心映像和檔案系統映像到RAM中
設定堆疊指標sp
跳到stage2的入口點
Stage2:
初始化本階段要使用到的硬體裝置
檢測系統的記憶體對映
載入核心映像和檔案系統映像
設定核心的啟動引數
嵌入式系統中廣泛採用的非易失性儲存器通常是Flash,而Bootloader就位於該儲存器的最前端,所以系統上電或復位後執行的第一段程式便是Bootloader。Bootloader在flash中的儲存示意圖如下:
Bootloader啟動流程圖
3、Bootloader的啟動方式
3.1網路啟動方式
這種方式的開發板不需要較大的儲存介質,跟無盤工作站有點類似,但是使用這種啟動方式之前,需要把Bootloader安裝到板上的EPROM或者Flash中。Bootloader通過乙太網介面遠端下載Linux核心映像或者檔案系統。Bootloader下載檔案一般都使用TFTP網路協議,還可以通過DHCP的方式動態配置IP地址。
3.2硬碟啟動方式
傳統的Linux系統執行在臺式機或者伺服器上,這些計算機一般都使用BIOS引導,並使用磁碟作為儲存介質。Linux傳統上是LILO(LinuxLoader)引導,後來又出現了GUN的軟體(GrandUnifiedBootloader)。這兩種Bootloader廣泛應用在X86的Linux系統上。
3.3Flash啟動方式
大多數嵌入式系統上都使用Flash儲存介質。Flash有很多型別,包括NORFlash、NANDFlash和其它半導體盤。它們之間的不同在於:NORFlash支援晶片內執行(XIP,eXecuteInPlace),這樣程式碼可以在Flash上直接執行而不必拷貝到RAM中去執行。而NANDFlash並不支援XIP,所以要想執行NANDFlash上的程式碼,必須先將其拷貝到RAM中去,然後跳到RAM中去執行。NORFlash使用最為普遍。Bootloader一般放在Flash的底端或者頂端,這需要根據處理器的復位向量來進行設定。可以配置成MTD裝置來訪問Flash分割槽
3.linux的核心是由bootloader裝載到記憶體中的?
提問:
參考書上寫的內容bootloader的作用是載入核心並將控制權轉交給核心程式,但是核心檔案本身是存放在硬碟的檔案系統中,bootloader只有512B,此時並沒有能力識別檔案系統和initrd,因此是如何在硬碟上定位核心檔案的?
對於檔案系統的一個疑問,以linux中的ext檔案系統為例,檔案是由超級塊,inode,資料塊組成的,要讀取資料必須找到inode,從中取出檔案是有哪些bloc塊組成的,但是是誰記錄inode的位置呢?是否跟硬碟的MBR一個原理?存在硬碟分割槽的前幾個固定位置,然後呼叫系統中斷來取?
回答:
linux的核心的確是由bootloader裝載到記憶體中的。linux的bootloader有2個部分組成:bootstrap和uboot。所以更準確點的說法是:linux的核心是由uboot裝載到記憶體中的。核心檔案本身是存放在硬碟的檔案系統中,這句話就是錯的。核心和檔案系統是分開儲存的。uboot讀取kernel到記憶體是從kernel開始儲存的地址開始讀取的,而讀取開始位置和讀取大小,是由環境變數決定的。所以這個時候不需要檔案系統的。
給你張圖片,便於理解吧。這張圖片是bootstrap、uboot、環境變數、kernel、檔案系統在nandflash裡面的儲存分佈。
其中rootfs.jfss2就是檔案系統。
4.請問bootloader、u-boot和linux核心的區別和關係是怎樣的?麻煩哪位大俠給小弟指導指導。
bootloader是取代mbr功能的,可以看成mbr的加強.u-boot是把usb盤做成啟動盤的,linux核心就是linux系統的核心,你用的linux就是在核心基礎上擴充套件了shell和應用程式.
mbr=masterbootrecord,主引導記錄,位置在磁碟的0磁軌0柱面1扇區。bios啟動會首先訪問他,把啟動交給mbr,mbr記錄從哪個地方開始啟動。
簡介
MBR,全稱為MasterBootRecord,即硬碟的主引導記錄。
為了便於理解,一般將MBR分為廣義和狹義兩種:廣義的MBR包含整個扇區(載入程式、分割槽表及分隔標識),也就是上面所說的主引導記錄;而狹義的MBR僅指載入程式而言。
硬碟的0柱面、0磁頭、1扇區稱為主引導扇區(也叫主引導記錄MBR)。它由三個部分組成,主載入程式、硬碟分割槽表DPT(DiskPartitiontable)和硬碟有效標誌(55AA)。在總共512位元組的主引導扇區裡主載入程式(bootloader)佔446個位元組,第二部分是Partitiontable區(分割槽表),即DPT,佔64個位元組,硬碟中分割槽有多少以及每一分割槽的大小都記在其中。第三部分是magicnumber,佔2個位元組,固定為55AA。
5.為什麼bootloader要去Flash上讀入Linux核心
你這個問題應該分為幾個部分
1bootloader主要是負責系統初始化和系統載入的嵌入式系統一般會把bootloader和系統核心分開存放,這樣的話系統核心損壞了的話還可以通過bootloader進行恢復
2linux核心一般比bootloader大很多。一個嵌入式系統,在系統剛通電的時候,根據cpu的不同,他們是從一個固定的記憶體地址開始執行的。一般情況下,這個固定地址會是一個ROM,其儲存空間一般較小,一般用來存放bootloader。而根據板子設計的不同,系統核心是保持在flash或者其他儲存介質上的。
3bootloader在完成硬體初始化後,從儲存介質上把系統核心讀入到指定的記憶體區域,然後用一個跳轉指令跳轉到系統核心處開始執行。注意,這個儲存介質不一定是flash
6.為什麼需要BootLoader?linux
引導載入程式是系統加電後執行的第一段軟體程式碼。PC機中的引導載入程式由BIOS(其本質就是一段韌體程式)和位於硬碟MBR中的OSBootLoader(比如,LILO和GRUB等)一起組成。BIOS在完成硬體檢測和資源分配後,將硬碟MBR中的BootLoader讀到系統的RAM中,然後將控制權交給OSBootLoader。BootLoader的主要執行任務就是將核心映象從硬碟上讀到RAM中,然後跳轉到核心的入口點去執行,也即開始啟動作業系統。
而在嵌入式系統中,通常並沒有像BIOS那樣的韌體程式(注,有的嵌入式CPU也會內嵌一段短小的啟動程式),因此整個系統的載入啟動任務就完全由BootLoader來完成。比如在一個基於ARM7TDMIcore的嵌入式系統中,系統在上電或復位時通常都從地址0x00000000處開始執行,而在這個地址處安排的通常就是系統的BootLoader程式。
簡單地說,BootLoader就是在作業系統核心執行之前執行的一段小程式。通過這段小程式,我們可以初始化硬體裝置、建立記憶體空間的對映圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終呼叫作業系統核心準備好正確的環境。
通常,BootLoader是嚴重地依賴於硬體而實現的,特別是在嵌入式世界。因此,在嵌入式世界裡建立一個通用的BootLoader幾乎是不可能的。儘管如此,我們仍然可以對BootLoader歸納出一些通用的概念來,以指導使用者特定的BootLoader設計與實現。
在專用的嵌入式板子執行GNU/Linux系統已經變得越來越流行。一個嵌入式Linux系統從軟體的角度看通常可以分為四個層次:
1、引導載入程式。包括固化在韌體(firmware)中的boot程式碼(可選),和BootLoader兩大部分。
2、Linux核心。特定於嵌入式板子的定製核心以及核心的啟動引數。
3、檔案系統。包括根檔案系統和建立於Flash記憶體裝置之上檔案系統。通常用ramdisk來作為rootfs。
4、使用者應用程式。特定於使用者的應用程式。有時在使用者應用程式和核心層之間可能還會包括一個嵌入式圖形使用者介面。常用的嵌入式GUI有:MicroWindows和MiniGUI等。