電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 67|回復(fù): 0
收起左側(cè)

Linux啟動流程全梳理| 思維導(dǎo)圖 | 流程圖

[復(fù)制鏈接]

445

主題

445

帖子

3456

積分

四級會員

Rank: 4

積分
3456
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-8-28 09:01:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
轉(zhuǎn)自:網(wǎng)絡(luò)
Linux啟動流程總的來說可以分成三個階段



Linux啟動流程圖


第一步:上電?在 x86 系統(tǒng)中,將 1M 空間最上面的 0xF0000 到 0xFFFFF 這 64K 映射給 ROM。
?當(dāng)電腦剛加電的時候,會做一些重置的工作,將 CS 設(shè)置為 0xFFFF,將 IP 設(shè)置為 0x0000,所以第一條指令就會指向 0xFFFF0,正是在 ROM 的范圍內(nèi)。
?在這里,有一個 JMP 命令會跳到 ROM 中做初始化工作的代碼,于是,BIOS 開始進行初始化的工作





第二步:BIOS啟動固件初始化:計算機開機后,UEFI固件會進行初始化,包括硬件初始化、自檢和加載UEFI固件驅(qū)動程序等。

啟動設(shè)備選擇:UEFI固件會檢測并識別可啟動的設(shè)備,如硬盤、光盤、USB設(shè)備等。它會根據(jù)預(yù)設(shè)的啟動順序或用戶設(shè)置的啟動選項,選擇一個可啟動的設(shè)備作為啟動介質(zhì)。

UEFI固件驅(qū)動程序加載:UEFI固件會加載設(shè)備上的UEFI固件驅(qū)動程序,這些驅(qū)動程序負(fù)責(zé)與硬件設(shè)備進行交互,以便后續(xù)的啟動過程能夠正常進行。

UEFI應(yīng)用程序加載:UEFI固件會加載位于啟動介質(zhì)上的UEFI應(yīng)用程序,如引導(dǎo)加載程序(Bootloader)或操作系統(tǒng)的引導(dǎo)管理器。這些應(yīng)用程序通常位于EFI系統(tǒng)分區(qū)中,以.efi文件格式存在。

引導(dǎo)加載程序執(zhí)行:加載的引導(dǎo)加載程序會接管控制權(quán),負(fù)責(zé)加載操作系統(tǒng)內(nèi)核或其他引導(dǎo)組件。常見的引導(dǎo)加載程序有UEFI Shell、GRUB、rEFInd等。



第三步:Linux啟動



Linux啟動-引導(dǎo)?我們可以通過BIOS界面選擇硬盤啟動項進入OS,那BIOS是怎么發(fā)現(xiàn)這個硬盤里有OS?
?答案就是MBR(Master Boot Record),
?MBR是放在硬盤的第一個扇區(qū),一共512字節(jié),
?可以分成兩部分:
?主引導(dǎo)記錄:安裝啟動引導(dǎo)程序的地方,446字節(jié),
?分區(qū)表:記錄整個硬盤分區(qū)的的狀態(tài)此外,64字節(jié)

Linux啟動-引導(dǎo)EBR/VBR?找到MBR后下一步做啥?

?(1)如果查找分區(qū)表時發(fā)現(xiàn)操作系統(tǒng)裝在主分區(qū),然后執(zhí)行已載入的MBR中的boot loader代碼,加載該激活主分區(qū)的VBR中的boot loader,至此,控制權(quán)就交給了VBR的boot loader

?(2)如果操作系統(tǒng)不是裝在主分區(qū),那么肯定是裝在邏輯分區(qū)中,所以查找完主分區(qū)表后會繼續(xù)查找擴展分區(qū)表,直到找到EBR所在的分區(qū),然后MBR中的boot loader將控制權(quán)交給該EBR的boot loader





Linux啟動-引導(dǎo)GRUB2介紹?GNU GRUB(GRand Unified Bootloader簡稱“GRUB”)是一個來自GNU項目的多操作系統(tǒng)啟動程序。GRUB是多啟動規(guī)范的實現(xiàn),它允許用戶可以在計算機內(nèi)同時擁有多個操作系統(tǒng),并在計算機啟動時選擇希望運行的操作系統(tǒng)。GRUB可用于選擇操作系統(tǒng)分區(qū)上的不同內(nèi)核,也可用于向這些內(nèi)核傳遞啟動參數(shù)。

?生成配置文件:grub2-mkconfig -o /boot/grub2/grub.cfg
?安裝:grub2-install /dev/sda

Linux啟動-引導(dǎo)GRUB2加載?Grub2 第一個安裝的就是 boot.img,BIOS 完成任務(wù)后,會將 boot.img 從硬盤加載到內(nèi)存中的 0x7c00 來運行。boot.img會加載 core.img。如果從硬盤啟動的話,這個扇區(qū)里面是 diskboot.img,diskboot.img 的任務(wù)就是將 core.img 的其他部分加載進來,先是解壓縮程序 lzma_decompress.img,再往下是 kernel.img,最后是各個模塊 module 對應(yīng)的映像。這里需要注意,它不是 Linux 的內(nèi)核,而是 grub 的內(nèi)核。

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





Linux啟動-0/1號進程?set_task_stack_end_magic(&init_task)。這里面有一個參數(shù) init_task,它的定義是 struct task_struct init_task = INIT_TASK(init_task)。
?它是系統(tǒng)創(chuàng)建的第一個進程,我們稱為 0 號進程。這是唯一一個沒有通過 fork 或者 kernel_thread 產(chǎn)生的進程,是進程列表的第一個。

?1.trap_init()中斷初始化
?2.mm_init()內(nèi)存初始化
?3.sched_init()調(diào)度策略初始化
?4.vfs_caches_init()基于內(nèi)存文件系統(tǒng)rootfs初始化
?5.start_kernel()->rest_init()其他方面的初始化
?rest_init 的第一大工作是,用 kernel_thread(kernel_init, NULL, CLONE_FS) 創(chuàng)建第二個進程,這個是 1 號進程。1 號進程對于操作系統(tǒng)來講,有“劃時代”的意義。

Linux啟動-ramdisk?init 程序是在文件系統(tǒng)上的,文件系統(tǒng)一定是在一個存儲設(shè)備上的,例如硬盤。Linux 訪問存儲設(shè)備,要有驅(qū)動才能訪問。如果存儲系統(tǒng)數(shù)目很有限,那驅(qū)動可以直接放到內(nèi)核里面,但是文件系統(tǒng)的格式有很多,全都放進內(nèi)核那內(nèi)核就太大了。
?這該怎么辦呢?
?我們只好先弄一個基于內(nèi)存的文件系統(tǒng)。內(nèi)存訪問是不需要驅(qū)動的,這個就是 ramdisk。這個時候,ramdisk 是根文件系統(tǒng)。
?運行 ramdisk 上的 /init,等它運行完了就已經(jīng)在用戶態(tài)了。/init 這個程序會先根據(jù)存儲系統(tǒng)的類型加載驅(qū)動,有了驅(qū)動就可以設(shè)置真正的根文件系統(tǒng)了。有了真正的根文件系統(tǒng),ramdisk 上的 /init 會啟動文件系統(tǒng)上的 init。

Linux啟動-init介紹?前面0/1進程都屬于內(nèi)核線程,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”,或者普通文件系統(tǒng)上的“/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?任何硬件設(shè)備連接后,操作系統(tǒng)使用硬件,即需要掛載。windows只不過是自動“掛載”了,linux需要手動自己搞。在Linux系統(tǒng)下,例如每次掛載/dev/sdb1(例如U盤設(shè)備文件)需要手動使用命令mount。當(dāng)然,每次重啟,開啟時,硬盤一般也是被自動掛載的,而自動掛載的信息,就記錄在/etc/fstab文件中。
? 系統(tǒng)每次啟動都會讀取/etc/fstab中的配置內(nèi)容,自動掛載該文件中被記錄的設(shè)備和分區(qū)。
? 第一列:設(shè)備文件或UUID或label(三者的區(qū)別看下面)
? 第二列:設(shè)備的掛載點(空目錄)
? 第三列:該分區(qū)文件系統(tǒng)的格式(可以使用特殊的參數(shù)auto,自動識別分區(qū)的分區(qū)格式)
? 第四列:文件系統(tǒng)的參數(shù),設(shè)置格式的選項
? 第五列:dump備份的設(shè)置(0表示不進行dump備份,1代表每天進行dump備份,2代表不定日期的進行dump備份)
? 第六列:磁盤檢查設(shè)置(其實是一個檢查順序,0代表不檢查,1代表第一個檢查,2后續(xù).一般根目錄是1,數(shù)字相同則同時檢查)

Linux啟動-用戶登錄一般來說:用戶登錄方式有三種
1.命令行登錄
2.ssh登錄
3.圖形登錄

Linux是多任務(wù)多用戶的操作系統(tǒng),它允許多人同時在線工作。但每個人都必須要輸入用戶名和密碼才能驗證身份并最終登錄。但登陸時是以圖形界面的方式給用戶使用,還是以純命令行模式給用戶使用呢?這是終端決定的,也就是說在登錄前需要先加載終端。

現(xiàn)代Linux上,console終端已經(jīng)和原始的意義不太一樣了,其設(shè)備映射在/dev/console上,所有內(nèi)核輸出的信息都輸出到console終端,而其他用戶程序輸出的信息則輸出到虛擬終端或偽終端。

總結(jié)下:
/dev/console:控制臺終端
/dev/ttyN:虛擬終端,ctrl+alt+f[1-6]切換的就是虛擬終端
/dev/ttySN:串行終端
/dev/pts/N:偽終端,ssh等工具連接過去的活著圖形終端下開啟的命令行終端就是偽終端。

Linux啟動-用戶切換Linux預(yù)設(shè)提供了六個命令窗口終端機讓我們來登錄。

默認(rèn)我們登錄的就是第一個窗口,也就是tty1,這個六個窗口分別為tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 來切換它們
?
?針對我的VM Virtual BOX ctrl+alt + F1是圖形終端, ctrl+alt + F2~F6命令行終端

Linux啟動流程思維導(dǎo)圖

——EOF——你好,我是飛宇。日常分享C/C++、計算機學(xué)習(xí)經(jīng)驗、工作體會,歡迎點擊此處查看我以前的學(xué)習(xí)筆記&經(jīng)驗&分享的資源。
我組建了一些社群一起交流,群里有大牛也有小白,如果你有意可以一起進群交流。

歡迎你添加我的微信,我拉你進技術(shù)交流群。此外,我也會經(jīng)常在微信上分享一些計算機學(xué)習(xí)經(jīng)驗以及工作體驗,還有一些內(nèi)推機會。


加個微信,打開另一扇窗
經(jīng)常遇到有讀者后臺私信想要一些編程學(xué)習(xí)資源,這里分享 1T 的編程電子書、C/C++開發(fā)手冊、Github上182K+的架構(gòu)路線圖、LeetCode算法刷題筆記等精品學(xué)習(xí)資料,點擊下方公眾號會回復(fù)"編程"即可免費領(lǐng)取~

感謝你的分享,點贊,在看三  

回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表