當前位置: 妍妍網 > 碼農

Linux啟動流程 梳理| 思維導圖 | 流程圖 | 值得收藏

2024-05-07碼農

Linux啟動流程總的來說可以分成三個階段


Linux啟動流程圖

第一步:上電

Ø在 x86 系統中,將 1M 空間最上面的 0xF0000 到 0xFFFFF 這 64K 對映給 ROM。

Ø當電腦剛加電的時候,會做一些重設的工作,將 CS 設定為 0xFFFF,將 IP 設定為 0x0000,所以第一條指令就會指向 0xFFFF0,正是在 ROM 的範圍內。

Ø在這裏,有一個 JMP 命令會跳到 ROM 中做初始化工作的程式碼,於是,BIOS 開始進行初始化的工作



第二步:BIOS啟動

固件初始化:電腦開機後,UEFI固件會進行初始化,包括硬體初始化、自檢和載入UEFI固件驅動程式等。

啟動裝置選擇:UEFI固件會檢測並辨識可啟動的裝置,如硬碟、光碟、USB裝置等。它會根據預設的啟動順序或使用者設定的啟動選項,選擇一個可啟動的裝置作為啟動介質。

UEFI固件驅動程式載入:UEFI固件會載入裝置上的UEFI固件驅動程式,這些驅動程式負責與硬體裝置進行互動,以便後續的啟動過程能夠正常進行。

UEFI應用程式載入:UEFI固件會載入位於啟動介質上的UEFI應用程式,如引導載入程式(Bootloader)或作業系統的引導管理器。這些應用程式通常位於EFI系統分區中,以.efi檔格式存在。

引導載入程式執行:載入的引導載入程式會接管控制權,負責載入作業系統內核或其他引導元件。常見的引導載入程式有UEFI Shell、GRUB、rEFInd等。

第三步:Linux啟動


Linux啟動-引導

Ø我們可以透過BIOS界面選擇硬碟啟動項進入OS,那BIOS是怎麽發現這個硬碟裏有OS?

Ø答案就是MBR(Master Boot Record),

ØMBR是放在硬碟的第一個磁區,一共512字節,

Ø可以分成兩部份:

Ø主開機紀錄:安裝啟動載入程式的地方,446字節,

Ø分區表:記錄整個硬碟分區的的狀態此外,64字節


Linux啟動-引導EBR/VBR

Ø找到MBR後下一步做啥?

Ø(1)如果尋找分區表時發現作業系統裝在主分區,然後執行已載入的MBR中的boot loader程式碼,載入該啟用主分區的VBR中的boot loader,至此,控制權就交給了VBR的boot loader

Ø(2)如果作業系統不是裝在主分區,那麽肯定是裝在邏輯分區中,所以尋找完主分區表後會繼續尋找擴充套件分區表,直到找到EBR所在的分區,然後MBR中的boot loader將控制權交給該EBR的boot loader



Linux啟動-引導GRUB2介紹

ØGNU GRUB(GRand Unified Bootloader簡稱「GRUB」)是一個來自GNU計畫的多作業系統啟動程式。GRUB是多啟動規範的實作,它允許使用者可以在電腦內同時擁有多個作業系統,並在電腦啟動時選擇希望執行的作業系統。GRUB可用於選擇作業系統分區上的不同內核,也可用於向這些內核傳遞啟動參數。

Ø生成配置檔:grub2-mkconfig -o /boot/grub2/grub.cfg

Ø安裝:grub2-install /dev/sda


Linux啟動-引導GRUB2載入

ØGrub2 第一個安裝的就是 boot.img,BIOS 完成任務後,會將 boot.img 從硬碟載入到記憶體中的 0x7c00 來執行。boot.img會載入 core.img。如果從硬碟啟動的話,這個磁區裏面是 diskboot.img,diskboot.img 的任務就是將 core.img 的其他部份載入進來,先是解壓縮程式 lzma_decompress.img,再往下是 kernel.img,最後是各個模組 module 對應的映像。這裏需要註意,它不是 Linux 的內核,而是 grub 的內核。

Ø隨著我們載入的東西越來越大,真實模式這 1M 的地址空間實在放不下了,所以在真正的解壓縮之前,lzma_decompress.img 做了一個重要的決定,就是呼叫 real_to_prot,切換到保護模式,這樣就能在更大的尋址空間裏面,載入更多的東西。



Linux啟動-0/1號行程

Øset_task_stack_end_magic(&init_task)。這裏面有一個參數 init_task,它的定義是 struct task_struct init_task = INIT_TASK(init_task)。

Ø它是系統建立的第一個行程,我們稱為 0 號行程。這是唯一一個沒有透過 fork 或者 kernel_thread 產生的行程,是行程列表的第一個。

Ø1.trap_init()中斷初始化

Ø2.mm_init()記憶體初始化

Ø3.sched_init()排程策略初始化

Ø4.vfs_caches_init()基於記憶體檔案系統rootfs初始化

Ø5.start_kernel()->rest_init()其他方面的初始化

Ørest_init 的第一大工作是,用 kernel_thread(kernel_init, NULL, CLONE_FS) 建立第二個行程,這個是 1 號行程。1 號行程對於作業系統來講,有「劃時代」的意義。


Linux啟動-ramdisk

Øinit 程式是在檔案系統上的,檔案系統一定是在一個儲存裝置上的,例如硬碟。Linux 存取儲存裝置,要有驅動才能存取。如果儲存系統數目很有限,那驅動可以直接放到內核裏面,但是檔案系統的格式有很多,全都放進內核那內核就太大了。

Ø這該怎麽辦呢?

Ø我們只好先弄一個基於記憶體的檔案系統。記憶體存取是不需要驅動的,這個就是 ramdisk。這個時候,ramdisk 是根檔案系統。

Ø執行 ramdisk 上的 /init,等它執行完了就已經在使用者態了。/init 這個程式會先根據儲存系統的型別載入驅動,有了驅動就可以設定真正的根檔案系統了。有了真正的根檔案系統,ramdisk 上的 /init 會啟動檔案系統上的 init。


Linux啟動-init介紹

Ø前面0/1行程都屬於內核執行緒,ps pid=1的是init行程

Ø if (ramdisk_execute_command) {

Øret = run_init_process(ramdisk_execute_command);

Ø...... }

Ø......

Øif (!try_to_run_init_process("/sbin/init") ||

Ø!try_to_run_init_process("/etc/init") ||

Ø !try_to_run_init_process("/bin/init") ||

Ø!try_to_run_init_process("/bin/sh")) return 0

Ø它會嘗試執行 ramdisk 的「/init」,或者普通檔案系統上的「/sbin/init」「/etc/init」「/bin/init」「/bin/sh」。不同版本的 Linux 會選擇不同的檔啟動,但是只要有一個起來了就可以。


ØInit型別:

ØSysV:CentOS 5之前, 配置檔/etc/inittab

ØUpstart:CentOS 6,配置檔/etc/inittab,/etc/init/*.conf

ØSystemd:CnetOS7, 配置檔/usr/lib/system/syste,/etc/systemd/system


Linux啟動-執行級別


Linux啟動-fstab

Ø任何硬體裝置連線後,作業系統使用硬體,即需要掛載。windows只不過是自動「掛載」了,linux需要手動自己搞。在Linux系統下,例如每次掛載/dev/sdb1(例如U槽裝置檔)需要手動使用命令mount。當然,每次重新開機,開啟時,硬碟一般也是被自動掛載的,而自動掛載的資訊,就記錄在/etc/fstab檔中。

Ø 系統每次啟動都會讀取/etc/fstab中的配置內容,自動掛載該檔中被記錄的裝置和分區。

Ø 第一列:裝置檔或UUID或label(三者的區別看下面)

Ø 第二列:裝置的掛載點(空目錄)

Ø 第三列:該分區檔案系統的格式(可以使用特殊的參數auto,自動辨識分區的分區格式)

Ø 第四列:檔案系統的參數,設定格式的選項

Ø 第五列:dump備份的設定(0表示不進行dump備份,1代表每天進行dump備份,2代表不定日期的進行dump備份)

Ø 第六列:磁盤檢查設定(其實是一個檢查順序,0代表不檢查,1代表第一個檢查,2後續.一般根目錄是1,數位相同則同時檢查)


Linux啟動-使用者登入

一般來說:使用者登入方式有三種

1.命令列登入

2.ssh登入

3.圖形登入

Linux是多工多使用者的作業系統,它允許多人同時線上工作。但每個人都必須要輸入使用者名稱和密碼才能驗證身份並最終登入。但登陸時是以圖形界面的方式給使用者使用,還是以純命令列模式給使用者使用呢?這是終端決定的,也就是說在登入前需要先載入終端。

現代Linux上,console終端已經和原始的意義不太一樣了,其裝置對映在/dev/console上,所有內核輸出的資訊都輸出到console終端,而其他使用者程式輸出的資訊則輸出到虛擬終端或偽終端。

總結下:

/dev/console:控制台終端

/dev/ttyN:虛擬終端,ctrl+alt+f[1-6]切換的就是虛擬終端

/dev/ttySN:序列終端

/dev/pts/N:偽終端,ssh等工具連線過去的活著圖形終端下開啟的命令列終端就是偽終端。


Linux啟動-使用者切換

Linux預設提供了六個命令視窗終端機讓我們來登入。

預設我們登入的就是第一個視窗,也就是tty1,這個六個視窗分別為tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 來切換它們

Ø

Ø針對我的VM Virtual BOX ctrl+alt + F1是圖形終端, ctrl+alt + F2~F6命令列終端


Linux啟動流程思維導圖