# Linux 筆記 2 ###### tags: `Linux 讀書會` ## Bootstrap (開機載入) ### 完整的linux系統需要以下部分 - Bootloader - Device tree blob - boot.img - Linux Kernel (Linux核心) - Root Filesystem (根目錄檔案系統) ### 常見的Bootloader - Grub 一個來自GNU專案的啟動載入程式。允許用戶可以在電腦內同時擁有多個作業系統,並在電腦啟動時選擇希望執行的作業系統。 - Uboot 桌機開機時先執行BIOS,先初始化電腦周邊裝置,再從硬碟或其他儲存裝置將作業系統載入到記憶體執行。 然而在Embedded system則稱為Bootload,較為普遍使用的Bootload為u-boot。 開機時u-boot協助將Linux的Image搬到記憶體,但Image在產生時沒有提供u-boot足夠的資訊執行搬移動作與啟動核心,因此u-boot提供了mkimage工具,來將Liinux kernel的Image或zImage轉成u-boot可以識別的格式,產生的檔案稱之為uImage。 --- ### Linux開機啟動過程詳解(bootstrap) 1. 開機時計算機會透過BIOS讀取存儲設備 2. 從存儲設備讀取起始的512 bytes,這512 bytes叫做主引導記錄MBR (master boot record) MBR會告訴電腦從該設備的某一個分區(partition)來裝載引導加載程序(boot loader),Boot loader儲存有作業系統(OS)的相關信息,比如作業系統名稱,作業系統核心 (kernel)所在位置等。 3. boot loader會加載kernel kernel實際上是一個用來操作計算機的程式,它是計算機作業系統的核心,**主要的任務是管理計算機的硬體資源,充當軟體和硬體的接口**。作業系統上的任何操作都要通過kernel傳達給硬體。Windows和Linux各自有自己kernel。狹義的作業系統就是指kernel,廣義的作業系統包括kernel以及kernel之上的各種應用。 4. 如果載入的是Linux kernel,kernel會首先預留自己運行所需的儲存空間,然後通過驅動程序(driver)檢測計算機硬體,如此作業系統就可以知道自己有哪些硬體可用 **kernel會啟動一個init進程**。它是Linux系統中的1號進程(Linux系統沒有0號進程)。 5. Init process(初始化程序)會運行一系列的初始腳本(startup scripts),這些腳本是Linux中常見的shell scripts。執行如下功能 * 設置計算機名稱 * 時區 * 檢測文件系統 * 掛載硬碟 * 清空臨時文件(/tmp) * 設置網路 * …等 6. 最後init會給出登錄(login)對話框,或者是圖形化的登錄介面 **總結 BIOS -> MBR -> boot loader -> kernel -> init process -> login** --- ### Linux Kernel 電腦真正在工作的東西其實是『硬體』, 例如數值運算要使用到 CPU、資料儲存要使用到硬碟、圖形顯示會用到顯示卡、 音樂發聲要有音效晶片、連接 Internet 可能需要網路卡等等。那麼如何控制這些硬體呢? 那就是核心的工作了!也就是說,你所希望電腦幫你達成的各項工作, 都需要透過『核心』的幫助才行。 ### Root Filesystem Root filesystem的建置,即是在**建立1個基本的Linux系統(base system)**,讓kernel在完成開機後,進入user mode執行使用者程式。 嵌入式Linux的root filesystem是依照需求加入套件,當root filesystem缺少必要的library時,程式當然無法執行,甚至系統也會無法順利啟動。 --- ### 本章節練習與反思 * 一般計算機都是從 0 開始數,那為什麼文中提到的 init 的 pid 為 1 呢?那 pid 0 的行程又是什麼呢? PID為0者為idle process,沒有其他process時就會調用idle() ### 資料來源 linux process(三)——idle process ``` https://blog.csdn.net/u013686805/article/details/19905941 ```