一文搞懂嵌入式uboot、kernel、文件系統的關系


--- title: file_name date: 2019-08-22 11:19:11 categories: tags: - arm - uboot - kernel - Linux - rootfs ---

總覽

在linux系統軟件架構可以分為4個層次(從低到高分別為):

引導加載程序

引導加載程序(Bootloader)是固化在硬件Flash中的一段引導代碼,用於完成硬件的一些基本配置,引導內核啟動。

同時,Bootloader會在自身與內核分區之間存放一些可設置的參數(Boot parameters),比如IP地址,串口波特率,要傳遞給內核的命令行參數。

系統內核

系統內核(Kernel)是整個操作系統的最底層,它負責整個硬件的驅動,以及提供各種系統所需的核心功能,包括防火牆機制、是否支持LVM或Quota等文件系統等等,如果內核不認識某個最新的硬件,那么硬件也就無法被驅動,你也就無法使用該硬件。計算機真正工作的東西其實是硬件,例如數值運算要使用到CPU、數據儲存要使用到硬盤、圖形顯示會用到顯示適配器、音樂發聲要有音效芯片、連接Internet 可能需要網絡卡等等。內核就是控制這些芯片如何工作。

文件系統

Linux文件系統(File System)中的文件是數據的集合,文件系統不僅包含着文件中的數據而且還有文件系統的結構,所有Linux 用戶和程序看到的文件、目錄、軟連接及文件保護信息等都存儲在其中。

文件系統是操作系統用於明確存儲設備(常見的是磁盤,也有基於NAND Flash的固態硬盤)或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件機構稱為文件管理系統,簡稱文件系統。

用戶程序

用戶應用程序(Application)為了完成某項或某幾項特定任務而被開發運行於操作系統之上的計算機程序。

Linux啟動過程

正常啟動過程中,Bootloader首先運行,然后將內核復制到內存中(或者在固態存儲設備上直接運行,但是效率較低),並在內存某個固定的地址(包括地址與參數的結構)設置好要傳遞給內核的參數,最后運行內核。內核啟動后,掛載(mount)根文件系統(Root filesystem),啟動文件系統中的應用程序。

上電 ——> Bootloader —[傳遞參數]—> 加載內核 ——> 內核掛載根文件系統 ——>執行應用程序

img

如何理解Bootloader與Kernel

操作系統內核本身就是一個裸機程序,和我們學的uboot和其他裸機程序沒有本質的區別;事實上,不少U-Boot源碼就是根據相應的Linux內核源程序進行簡化而形成的,尤其是一些設備的驅動程序。如果我們去琢磨U-Boot源碼的注釋,便會輕易的發現這一情況。

區別就是操作系統運行起來后可以分為應用層(用戶態)和內核層(內核態),分層后,兩層的權限不同(實現的原理是基於CPU的模式切換),內存訪問和設備操作的管理上更加精細(內核可以隨便方位各種硬件,而應用程序只能被限制的訪問硬件和內存地址)。

以ARM處理器為例,除用戶模式外,其余6種工作模式都屬於特權模式:

用戶模式(USR):正常程序執行模式,不能直接切換到其他模式
系統模式(SYS):運行操作系統的特權任務,與用戶模式類似,但具有可以直接切換到其他模式等特權
快中斷模式(FIQ):支持高速數據傳輸及通道處理,FIQ異常響應時進入此模式
中斷模式(IRQ):用於通用中斷處理,IRQ異常響應時進入此模式
管理模式(SVC):操作系統保護模式,系統復位和軟件中斷響應時進入此模式(由系統調用執行軟中斷SWI命令觸發)
中止模式(ABT):用於支持虛擬內存和/或存儲器保護,在ARM7TDMI沒有大用處
未定義模式(UND):支持硬件協處理器的軟件仿真,未定義指令異常響應時進入此模式

Linux內核態是從ARM的SVC即管理模式下啟動的,但在某些情況下、如:硬件中斷、程序異常(被動)等情況下進入ARM的其他特權模式,這時仍然可以進入內核態(因為就是可以操作內核了);同樣,Linux用戶態是從ARM用戶模式啟動的,但當進入ARM系統模式時、仍然可以操作Linux用戶態程序(進入用戶態,如init進程的啟動過程)。
即:Linux內核從ARM的SVC模式下啟動,但內核態不僅僅指ARM的SVC模式(還包括可以訪問內核空間的所有ARM模式);Linux用戶程序從ARM的用戶模式啟動,但用戶態不僅僅指ARM的用戶模式。

直觀來看:uboot的鏡像是u-boot.bin,Linux系統的鏡像是zImage(也可以是uImage,關系不大),這兩個東西其實都是裸機程序鏡像。從系統啟動的角度來講,內核和uboot都是裸機程序。

文件系統

概念

Linux文件系統中的文件是數據的集合,文件系統不僅包含着文件中的數據而且還有文件系統的結構,所有Linux 用戶和程序看到的文件、目錄、軟連接及文件保護信息等都存儲在其中。這種機制有利於用戶和操作系統的交互。

盡管內核是 Linux 的核心,但文件卻是用戶與操作系統交互所采用的主要工具。這對 Linux 來說尤其如此,這是因為在 UNIX 傳統中,它使用文件 I/O 機制管理硬件設備和數據文件

虛擬文件系統、根文件系統和文件系統

VFS

Linux支持多種文件系統類型,因為它將底層與應用層分隔開;而提供統一的接口支持應用層對於不同實現的文件系統的訪問,這個統一的接口稱為虛擬文件系統VFS。

kernel中以VFS去支持各種文件系統,如yaffs,ext3,cramfs等等。yaffs/yaffs2是專為嵌入式系統使用NAND型閃存而設計的一種日志型文件系統。在內核中以VFS來屏蔽各種文件系統的接口不同,以VFS向kernel提供一個統一的接口。

根文件系統

文件系統指文件存在的物理空間,linux系統中每個分區都是一個文件系統,都有自己的目錄層次結構。以“/”為頂級目錄的文件系統稱為根文件系統。

Linux啟動時,第一個必須掛載的是根文件系統;若系統不能從指定設備上掛載根文件系統,則系統會出錯而退出啟動。系統正常掛載根文件系統之后可以自動或手動掛載其他的文件系統(根文件系統是其他文件的最終掛載點)。因此,一個系統中可以同時存在不同的文件系統。

也就是說:

  • 根文件系統可以是任何kernel支持的文件系統類型(ext4,yaffs等)。但它必須包含linux內核啟動時所必需的文件(根文件系統必需存在的目錄 /dev /bin /sbin 等等),不然系統啟動會失敗。
  • 根文件系統是之所以有個根(/)字,是因為它是linux系統啟動時掛載(mount,所謂掛載:就是在內存中創建一個虛擬的文件對應具體的存儲空間分區的過程,掛載時不會保存信息,下次啟動時得重新掛載)的第一個文件系統,啟動完成后可以自動(配置etc/fstab)或者手動的方式將其它文件系統(分區)掛載到根文件系統中。

其他文件系統

不同的文件系統類型有不同的特點,因而根據存儲設備的硬件特性、系統需求等有不同的應用場合。在嵌入式Linux應用中,主要的存儲設備為 RAM(DRAM, SDRAM)和ROM(常采用FLASH存儲器),常用的基於存儲設備的文件系統類型包括:jffs2, yaffs, cramfs, romfs, ramdisk,initramfs, ramfs/tmpfs,ubifs等。

uboot與根文件系統的關系

早期的uboot沒有分區的概念,uboot只知道應該將什么數據燒寫到存儲介質的什么區間中。

(也就是說,對於uboot來看,只有起始地址結束地址等,A~B地址放內核,C~D地址放文件系統,即:規定哪個地址區間放內核或者文件系統等)

雖然此后,uboot中漸漸也有了MTD等管理分區部分的功能。盡管如此,不影響我們的學習理解。

總結:

(以下是本人【Schips】的理解)

cpu首先執行位於0地址的uboot,uboot啟動以后初始化一些資源,告訴內核有關的參數並引導內核,內核通過事先添加對於某種文件系統類型的支持驅動(相當於一小段程序),讀取uboot等boot loader在指定的區域燒寫制作好的文件系統鏡像,內核解析並掛載成根文件系統,並在此基礎上,通過VFS再掛載不同的文件系統類型,完成啟動以后,再去管理有關的資源(包括應用程序)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM