精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux啟動(dòng)流程基本分析

嵌入式開發(fā)星球 ? 來源:嵌入式開發(fā)愛好者 ? 作者:嵌入式開發(fā)愛好者 ? 2024-05-11 08:49 ? 次閱讀

Linux啟動(dòng)流程總的來說可以分成三個(gè)階段

wKgaomY_EnCAZEZEAABmJsWW0ew914.png

Linux啟動(dòng)流程圖

wKgZomY_EnSAdg9lAAELRtRK-m4322.png

第一步:上電

?在 x86 系統(tǒng)中,將 1M 空間最上面的 0xF0000 到 0xFFFFF 這 64K 映射給 ROM。

?當(dāng)電腦剛加電的時(shí)候,會(huì)做一些重置的工作,將 CS 設(shè)置為 0xFFFF,將 IP 設(shè)置為 0x0000,所以第一條指令就會(huì)指向 0xFFFF0,正是在 ROM 的范圍內(nèi)。

?在這里,有一個(gè) JMP 命令會(huì)跳到 ROM 中做初始化工作的代碼,于是,BIOS 開始進(jìn)行初始化的工作

wKgaomY_EnWAFedLAAHlUjps-iQ799.png

第二步:BIOS啟動(dòng)

固件初始化:計(jì)算機(jī)開機(jī)后,UEFI固件會(huì)進(jìn)行初始化,包括硬件初始化、自檢和加載UEFI固件驅(qū)動(dòng)程序等。

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

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

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

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

wKgZomY_EnWAIVxuAAcZs3TwjpM695.png

第三步:Linux啟動(dòng)

wKgaomY_EnaAD6M3AAEsPja247Y256.png

Linux啟動(dòng)-引導(dǎo)

?我們可以通過BIOS界面選擇硬盤啟動(dòng)項(xiàng)進(jìn)入OS,那BIOS是怎么發(fā)現(xiàn)這個(gè)硬盤里有OS?

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

?MBR是放在硬盤的第一個(gè)扇區(qū),一共512字節(jié),

?可以分成兩部分:

?主引導(dǎo)記錄:安裝啟動(dòng)引導(dǎo)程序的地方,446字節(jié),

?分區(qū)表:記錄整個(gè)硬盤分區(qū)的的狀態(tài)此外,64字節(jié)

Linux啟動(dòng)-引導(dǎo)EBR/VBR

?找到MBR后下一步做啥?

?(1)如果查找分區(qū)表時(shí)發(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ū)表后會(huì)繼續(xù)查找擴(kuò)展分區(qū)表,直到找到EBR所在的分區(qū),然后MBR中的boot loader將控制權(quán)交給該EBR的boot loader

wKgZomY_EnaAEmUjAADPVmZqaSM166.png

Linux啟動(dòng)-引導(dǎo)GRUB2介紹

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

?生成配置文件:grub2-mkconfig -o /boot/grub2/grub.cfg

?安裝:grub2-install /dev/sda

Linux啟動(dòng)-引導(dǎo)GRUB2加載

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

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

wKgaomY_EnaAT7aCAAE1sD5yt_s766.png

Linux啟動(dòng)-0/1號(hào)進(jìn)程

?set_task_stack_end_magic(&init_task)。這里面有一個(gè)參數(shù) init_task,它的定義是 struct task_struct init_task = INIT_TASK(init_task)。

?它是系統(tǒng)創(chuàng)建的第一個(gè)進(jìn)程,我們稱為 0 號(hào)進(jìn)程。這是唯一一個(gè)沒有通過 fork 或者 kernel_thread 產(chǎn)生的進(jìn)程,是進(jìn)程列表的第一個(gè)。

?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)建第二個(gè)進(jìn)程,這個(gè)是 1 號(hào)進(jìn)程。1 號(hào)進(jìn)程對(duì)于操作系統(tǒng)來講,有“劃時(shí)代”的意義。

Linux啟動(dòng)-ramdisk

?init 程序是在文件系統(tǒng)上的,文件系統(tǒng)一定是在一個(gè)存儲(chǔ)設(shè)備上的,例如硬盤。Linux 訪問存儲(chǔ)設(shè)備,要有驅(qū)動(dòng)才能訪問。如果存儲(chǔ)系統(tǒng)數(shù)目很有限,那驅(qū)動(dòng)可以直接放到內(nèi)核里面,但是文件系統(tǒng)的格式有很多,全都放進(jìn)內(nèi)核那內(nèi)核就太大了。

?這該怎么辦呢?

?我們只好先弄一個(gè)基于內(nèi)存的文件系統(tǒng)。內(nèi)存訪問是不需要驅(qū)動(dòng)的,這個(gè)就是 ramdisk。這個(gè)時(shí)候,ramdisk 是根文件系統(tǒng)。

?運(yùn)行 ramdisk 上的 /init,等它運(yùn)行完了就已經(jīng)在用戶態(tài)了。/init 這個(gè)程序會(huì)先根據(jù)存儲(chǔ)系統(tǒng)的類型加載驅(qū)動(dòng),有了驅(qū)動(dòng)就可以設(shè)置真正的根文件系統(tǒng)了。有了真正的根文件系統(tǒng),ramdisk 上的 /init 會(huì)啟動(dòng)文件系統(tǒng)上的 init。

Linux啟動(dòng)-init介紹

?前面0/1進(jìn)程都屬于內(nèi)核線程,ps pid=1的是init進(jìn)程

? 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

?它會(huì)嘗試運(yùn)行 ramdisk 的“/init”,或者普通文件系統(tǒng)上的“/sbin/init”“/etc/init”“/bin/init”“/bin/sh”。不同版本的 Linux 會(huì)選擇不同的文件啟動(dòng),但是只要有一個(gè)起來了就可以。

?Init類型:

?SysV:CentOS 5之前, 配置文件/etc/inittab

?Upstart:CentOS 6,配置文件/etc/inittab,/etc/init/*.conf

?Systemd:CnetOS7, 配置文件/usr/lib/system/syste,/etc/systemd/system

Linux啟動(dòng)-運(yùn)行級(jí)別

wKgZomY_EneATbXBAAIwVelTcj0039.png

Linux啟動(dòng)-fstab

?任何硬件設(shè)備連接后,操作系統(tǒng)使用硬件,即需要掛載。windows只不過是自動(dòng)“掛載”了,linux需要手動(dòng)自己搞。在Linux系統(tǒng)下,例如每次掛載/dev/sdb1(例如U盤設(shè)備文件)需要手動(dòng)使用命令mount。當(dāng)然,每次重啟,開啟時(shí),硬盤一般也是被自動(dòng)掛載的,而自動(dòng)掛載的信息,就記錄在/etc/fstab文件中。

? 系統(tǒng)每次啟動(dòng)都會(huì)讀取/etc/fstab中的配置內(nèi)容,自動(dòng)掛載該文件中被記錄的設(shè)備和分區(qū)。

? 第一列:設(shè)備文件或UUID或label(三者的區(qū)別看下面)

? 第二列:設(shè)備的掛載點(diǎn)(空目錄)

? 第三列:該分區(qū)文件系統(tǒng)的格式(可以使用特殊的參數(shù)auto,自動(dòng)識(shí)別分區(qū)的分區(qū)格式)

? 第四列:文件系統(tǒng)的參數(shù),設(shè)置格式的選項(xiàng)

? 第五列:dump備份的設(shè)置(0表示不進(jìn)行dump備份,1代表每天進(jìn)行dump備份,2代表不定日期的進(jìn)行dump備份)

? 第六列:磁盤檢查設(shè)置(其實(shí)是一個(gè)檢查順序,0代表不檢查,1代表第一個(gè)檢查,2后續(xù).一般根目錄是1,數(shù)字相同則同時(shí)檢查)

Linux啟動(dòng)-用戶登錄

一般來說:用戶登錄方式有三種

1.命令行登錄

2.ssh登錄

3.圖形登錄

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

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

總結(jié)下:

/dev/console:控制臺(tái)終端

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

/dev/ttySN:串行終端

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

Linux啟動(dòng)-用戶切換

Linux預(yù)設(shè)提供了六個(gè)命令窗口終端機(jī)讓我們來登錄。

默認(rèn)我們登錄的就是第一個(gè)窗口,也就是tty1,這個(gè)六個(gè)窗口分別為tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 來切換它們

?

?針對(duì)我的VM Virtual BOX ctrl+alt + F1是圖形終端, ctrl+alt + F2~F6命令行終端

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

wKgaomY_EneAcT_aAAM_4NRrTcg788.png

end


審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11225

    瀏覽量

    208911
  • grub2
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    4795
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    linux啟動(dòng)流程分析

    linux啟動(dòng)流程分析
    發(fā)表于 08-04 00:27

    嵌入式Linux啟動(dòng)流程簡(jiǎn)介

    目錄嵌入式 Linux 啟動(dòng)流程簡(jiǎn)介啟動(dòng)流程Bootloader 簡(jiǎn)介市面上可見的 bootloader入式
    發(fā)表于 11-04 09:04

    Linux啟動(dòng)流程是怎樣的

    本文簡(jiǎn)單的介紹了什么是嵌入式系統(tǒng),以及嵌入式Linux的系統(tǒng)結(jié)構(gòu),并且簡(jiǎn)單的介紹了Linux啟動(dòng)流程
    發(fā)表于 11-05 06:44

    詳細(xì)分析嵌入式Linux系統(tǒng)啟動(dòng)流程

    在嵌入式Linux專題(一)中已經(jīng)對(duì)嵌入式Linux系統(tǒng)的架構(gòu)及啟動(dòng)流程有了初步的介紹,本文將詳細(xì)分析嵌入式
    發(fā)表于 11-05 09:25

    Linux文件系統(tǒng)啟動(dòng)流程

    Linux 命令的結(jié)合使用Linux 文件系統(tǒng)啟動(dòng)流程sysvinit服務(wù)的管理與裁剪systemd服務(wù)的管理與裁剪了解 qt4、qt5 的移植了解 yocto構(gòu)建文件系統(tǒng)常規(guī)
    發(fā)表于 12-17 06:00

    典型ARM嵌入式Linux設(shè)備啟動(dòng)流程是怎樣的?

    典型ARM嵌入式Linux設(shè)備啟動(dòng)流程是怎樣的?
    發(fā)表于 12-23 06:25

    linux內(nèi)核啟動(dòng)內(nèi)核解壓過程分析

    linux啟動(dòng)時(shí)內(nèi)核解壓過程分析,一份不錯(cuò)的文檔,深入了解內(nèi)核必備
    發(fā)表于 03-09 13:39 ?1次下載

    linux內(nèi)核啟動(dòng)流程

    Linux啟動(dòng)代碼真的挺大,從匯編到C,從Makefile到LDS文件,需要理解的東西很多。畢竟Linux內(nèi)核是由很多人,花費(fèi)了巨大的時(shí)間和精力寫出來的。而且直到現(xiàn)在,這個(gè)世界上仍然有成千上萬(wàn)的程序員在不斷完善
    發(fā)表于 11-14 16:19 ?4339次閱讀
    <b class='flag-5'>linux</b>內(nèi)核<b class='flag-5'>啟動(dòng)</b><b class='flag-5'>流程</b>

    詳解bootloader的執(zhí)行流程與ARM Linux啟動(dòng)過程分析

    S3C2410 ARM處理器為例,詳細(xì)分析了系統(tǒng)上電后 bootloader的執(zhí)行流程及 ARM Linux啟動(dòng)過程。
    的頭像 發(fā)表于 12-21 09:24 ?1w次閱讀
    詳解bootloader的執(zhí)行<b class='flag-5'>流程</b>與ARM <b class='flag-5'>Linux</b><b class='flag-5'>啟動(dòng)</b>過程<b class='flag-5'>分析</b>

    嵌入式 Linux 啟動(dòng)流程和 bootloader 介紹

    目錄嵌入式 Linux 啟動(dòng)流程簡(jiǎn)介啟動(dòng)流程Bootloader 簡(jiǎn)介市面上可見的 bootloader入式
    發(fā)表于 11-01 16:32 ?11次下載
    嵌入式 <b class='flag-5'>Linux</b> <b class='flag-5'>啟動(dòng)</b><b class='flag-5'>流程</b>和 bootloader 介紹

    嵌入式Linux專題(一)——嵌入式Linux系統(tǒng)構(gòu)成及啟動(dòng)流程

    本文簡(jiǎn)單的介紹了什么是嵌入式系統(tǒng),以及嵌入式Linux的系統(tǒng)結(jié)構(gòu),并且簡(jiǎn)單的介紹了Linux啟動(dòng)流程
    發(fā)表于 11-02 12:36 ?15次下載
    嵌入式<b class='flag-5'>Linux</b>專題(一)——嵌入式<b class='flag-5'>Linux</b>系統(tǒng)構(gòu)成及<b class='flag-5'>啟動(dòng)</b><b class='flag-5'>流程</b>

    PyTorch文本分類任務(wù)的基本流程

    本分類是NLP領(lǐng)域的較為容易的入門問題,本文記錄文本分類任務(wù)的基本流程,大部分操作使用了**torch**和**torchtext**兩個(gè)庫(kù)。 ## 1. 文本數(shù)據(jù)預(yù)處理
    的頭像 發(fā)表于 02-22 14:23 ?1062次閱讀

    STM32的完整啟動(dòng)流程分析

    STM32的完整啟動(dòng)流程分析
    的頭像 發(fā)表于 10-25 16:00 ?1324次閱讀
    STM32的完整<b class='flag-5'>啟動(dòng)</b><b class='flag-5'>流程</b><b class='flag-5'>分析</b>

    Linux啟動(dòng)流程中console_init分析

    console_init 分析 Linux 啟動(dòng)函數(shù) start_kernel 會(huì)調(diào)用 console_init 函數(shù)。 linux4.14/kernel/printk/printk.
    的頭像 發(fā)表于 09-28 16:23 ?898次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>啟動(dòng)</b><b class='flag-5'>流程</b>中console_init<b class='flag-5'>分析</b>

    Linux整體匯編啟動(dòng)流程分析

    匯編啟動(dòng)流程 先從整體分析匯編做的事情,有個(gè)大體框架。 路徑: arch/riscv/kernel/head.S ,入口是 ENTRY(_start_kernel) 從 ENTRY
    的頭像 發(fā)表于 10-08 11:28 ?530次閱讀
    <b class='flag-5'>Linux</b>整體匯編<b class='flag-5'>啟動(dòng)</b><b class='flag-5'>流程</b><b class='flag-5'>分析</b>