色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從高級的視角來查看Linux引導過程

Q4MP_gh_c472c21 ? 來源:未知 ? 作者:李倩 ? 2018-08-22 14:10 ? 次閱讀

早期時,啟動一臺計算機意味著要給計算機喂一條包含引導程序的紙帶,或者手工使用前端面板地址/數據/控制開關來加載引導程序。盡管目前的計算機已經裝備了很多工具來簡化引導過程,但是這一切并沒有對整個過程進行必要的簡化。

讓我們先從高級的視角來查看Linux引導過程,這樣就可以看到整個過程的全貌了。然后將回顧一下在各個步驟到底發生了什么。在整個過程中,參考一下內核源代碼可以幫助我們更好地了解內核源代碼樹,并在以后對其進行深入分析。

1、概述

圖 1 是我們在20,000 英尺的高度看到的視圖。

當系統首次引導時,或系統被重置時,處理器會執行一個位于已知位置處的代碼。在個人計算機(PC)中,這個位置在基本輸入/輸出系統(BIOS)中,它保存在主板上的閃存中。嵌入式系統中的中央處理單元(CPU)會調用這個重置向量來啟動一個位于閃存/ROM中的已知地址處的程序。在這兩種情況下,結果都是相同的。因為PC提供了很多靈活性,BIOS必須確定要使用哪個設備來引導系統。稍后我們將詳細介紹這個過程。

當找到一個引導設備之后,第一階段的引導加載程序就被裝入RAM并執行。這個引導加載程序在大小上小于512 字節(一個扇區),其作用是加載第二階段的引導加載程序。

當第二階段的引導加載程序被裝入RAM 并執行時,通常會顯示一個動畫屏幕,并將Linux 和一個可選的初始 RAM磁盤(臨時根文件系統)加載到內存中。在加載映像時,第二階段的引導加載程序就會將控制權交給內核映像,然后內核就可以進行解壓和初始化了。在這個階段中,第二階段的引導加載程序會檢測系統硬件、枚舉系統鏈接的硬件設備、掛載根設備,然后加載必要的內核模塊。完成這些操作之后啟動第一個用戶空間程序(init),并執行高級系統初始化工作。

這就是 Linux引導的整個過程。現在讓我們深入挖掘一下這個過程,并深入研究一下Linux引導過程的一些詳細信息

2、系統啟動

系統啟動階段依賴于引導Linux系統上的硬件。在嵌入式平臺中,當系統加電或重置時,會使用一個啟動環境。這方面的例子包括U-Boot、RedBoot和Lucent的MicroMonitor。嵌入式平臺通常都是與引導監視器搭配銷售的。這些程序位于目標硬件上的閃存中的某一段特殊區域,它們提供了將Linux內核映像下載到閃存并繼續執行的方法。除了可以存儲并引導Linux映像之外,這些引導監視器還執行一定級別的系統測試和硬件初始化過程。在嵌入式平臺中,這些引導監視器通常會涉及第一階段和第二階段的引導加載程序。

在 PC 中,引導Linux 是從 BIOS 中的地址0xFFFF0 處開始的。BIOS的第一個步驟是加電自檢(POST)。POST的工作是對硬件進行檢測。BIOS的第二個步驟是進行本地設備的枚舉和初始化。

給定 BIOS 功能的不同用法之后,BIOS由兩部分組成:POST 代碼和運行時服務。當POST 完成之后,它被從內存中清理了出來,但是BIOS運行時服務依然保留在內存中,目標操作系統可以使用這些服務。

要引導一個操作系統,BIOS運行時會按照CMOS的設置定義的順序來搜索處于活動狀態并且可以引導的設備。引導設備可以是軟盤、CD-ROM、硬盤上的某個分區、網絡上的某個設備,甚至是USB閃存。

通常,Linux都是從硬盤上引導的,其中主引導記錄(MBR)中包含主引導加載程序。MBR是一個512 字節大小的扇區,位于磁盤上的第一個扇區中(0道0 柱面1 扇區)。當 MBR 被加載到RAM 中之后,BIOS 就會將控制權交給MBR。

注意:要查看 MBR的內容,請使用下面的命令:

# ddif=/dev/hda of=mbr.bin bs=512 count=1#od -xambr.bin

這 個dd 命令需要以root用戶的身份運行,它從/dev/hda(第一個IDE 盤)上讀取前 512 個字節的內容,并將其寫入mbr.bin 文件中。od命令會以十六進制和ASCII碼格式打印這個二進制文件的內容。

MBR 中的主引導加載程序是一個512 字節大小的映像,其中包含程序代碼和一個小分區表(參見圖2)。前 446個字節是主引導加載程序,其中包含可執行代碼和錯誤消息文本。接下來的64個字節是分區表,其中包含4 個分區的記錄(每個記錄的大小是16 個字節)。MBR以兩個特殊數字的字節(0xAA55)結束。這個數字會用來進行MBR的有效性檢查。

圖2. MBR剖析

主引導加載程序的工作是查找并加載次引導加載程序(第二階段)。它是通過在分區表中查找一個活動分區來實現這種功能的。當找到一個活動分區時,它會掃描分區表中的其他分區,以確保它們都不是活動的。當這個過程驗證完成之后,就將活動分區的引導記錄從這個設備中讀入RAM中并執行它。

4、第二階段引導加載程序

次引導加載程序(第二階段引導加載程序)可以更形象地稱為內核加載程序。這個階段的任務是加載Linux內核和可選的初始 RAM磁盤。

在 x86 PC環境中,第一階段和第二階段的引導加載程序一起稱為Linux Loader(LILO)或GRand Unified Bootloader(GRUB)。由于LILO有一些缺點,而 GRUB克服了這些缺點,因此下面讓我們就來看一下GRUB。

關于 GRUB,很好的一件事情是它包含了有關Linux文件系統的知識。GRUB不像LILO 一樣使用裸扇區,而是可以從ext2 或 ext3 文件系統中加載Linux 內核。它是通過將兩階段的引導加載程序轉換成三階段的引導加載程序來實現這項功能的。階段1 (MBR)引導了一個階段1.5 的引導加載程序,它可以理解包含Linux 內核映像的特殊文件系統。這方面的例子包括reiserfs_stage1_5(要從Reiser日志文件系統上進行加載)或e2fs_stage1_5(要從ext2或 ext3 文件系統上進行加載)。當階段1.5 的引導加載程序被加載并運行時,階段2的引導加載程序就可以進行加載了。

當階段2加載之后,GRUB就可以在請求時顯示可用內核列表(在/etc/grub.conf中進行定義,同時還有幾個軟符號鏈接/etc/grub/menu.lst和/etc/grub.conf)。我們可以選擇內核甚至修改附加內核參數。另外,我們也可以使用一個命令行的shell對引導過程進行高級手工控制。

GRUB階段引導加載程序:/boot/grub目錄中包含了stage1、stage1.5和stage2引導加載程序,以及很多其他加載程序(例如,CR-ROM使用的是iso9660_stage_1_5)。

將第二階段的引導加載程序加載到內存中之后,就可以對文件系統進行查詢了,并將默認的內核映像和initrd映像加載到內存中。當這些映像文件準備好之后,階段2 的引導加載程序就可以調用內核映像了。

5、內核

當內核映像被加載到內存中,并且階段2 的引導加載程序釋放控制權之后,內核階段就開始了。內核映像并不是一個可執行的內核,而是一個壓縮過的內核映像。通常它是一個zImage(壓縮映像,小于512KB)或一個bzImage(較大的壓縮映像,大于512KB),它是提前使用zlib進行壓縮過的。在這個內核映像前面是一個例程,它實現少量硬件設置,并對內核映像中包含的內核進行解壓,然后將其放入高端內存中,如果有初始RAM磁盤映像,就會將它移動到內存中,并標明以后使用。然后該例程會調用內核,并開始啟動內核引導的過程。

當 bzImage(用于i386映像)被調用時,我們從./arch/i386/boot/head.S的start 匯編例程開始執行(主要流程圖請參看圖3)。這個例程會執行一些基本的硬件設置,并調用./arch/i386/boot/compressed/head.S中的startup_32例程。此例程會設置一個基本的環境(堆棧等),并清除Block Started by Symbol(BSS)。然后調用一個叫做decompress_kernel的C 函數(在./arch/i386/boot/compressed/misc.c中)來解壓內核。當內核被解壓到內存中之后,就可以調用它了。這是另外一個startup_32函數,但是這個函數在./arch/i386/kernel/head.S中。

在這個新的 startup_32函數(也稱為清除程序或進程0)中,會對頁表進行初始化,并啟用內存分頁功能。然后會為任何可選的浮點單元(FPU)檢測CPU的類型,并將其存儲起來供以后使用。然后調用start_kernel函數(在init/main.c中),它會將您帶入與體系結構無關的Linux 內核部分。實際上,這就是Linux 內核的 main函數。

圖3. Linux內核i386引導的主要函數流程

注意函數decompress_kernel就是顯示我們通常看到的解壓消息的地方:

Uncompressing Linux... Ok, booting thekernel.

通過調用start_kernel,會調用一系列初始化函數來設置中斷,執行進一步的內存配置,并加載初始RAM磁盤。最后,要調用kernel_thread(在arch/i386/kernel/process.c中)來啟動init函數,這是第一個用戶空間進程(user-spaceprocess)。最后,啟動空任務,現在調度器就可以接管控制權了(在調用cpu_idle之后)。通過啟用中斷,搶占式的調度器就可以周期性地接管控制權,從而提供多任務處理能力。

在內核引導過程中,初始 RAM磁盤(initrd)是由階段2引導加載程序加載到內存中的,它會被復制到RAM 中并掛載到系統上。這個initrd 會作為RAM中的臨時根文件系統使用,并允許內核在沒有掛載任何物理磁盤的情況下完整地實現引導。由于與外圍設備進行交互所需要的模塊可能是initrd的一部分,因此內核可以非常小,但是仍然需要支持大量可能的硬件配置。在內核引導之后,就可以正式裝備根文件系統了(通過pivot_root):此時會將initrd根文件系統卸載掉,并掛載真正的根文件系統。

initrd函數讓我們可以創建一個小型的Linux內核,其中包括作為可加載模塊編譯的驅動程序。這些可加載的模塊為內核提供了訪問磁盤和磁盤上的文件系統的方法,并為其他硬件提供了驅動程序。由于根文件系統是磁盤上的一個文件系統,因此initrd函數會提供一種啟動方法來獲得對磁盤的訪問,并掛載真正的根文件系統。在一個沒有硬盤的嵌入式環境中,initrd可以是最終的根文件系統,或者也可以通過網絡文件系統(NFS)來掛載最終的根文件系統。

6、Init

當內核被引導并進行初始化之后,內核就可以啟動自己的第一個用戶空間應用程序了。這是第一個調用的使用標準C庫編譯的程序。在此之前,還沒有執行任何標準的C 應用程序。

在桌面 Linux 系統上,第一個啟動的程序通常是/sbin/init。但是這不是一定的。很少有嵌入式系統會需要使用init所提供的豐富初始化功能(這是通過/etc/inittab進行配置的)。在很多情況下,我們可以調用一個簡單的shell腳本來啟動必需的嵌入式應用程序。

7、結束語

與Linux本身非常類似,Linux的引導過程也非常靈活,可以支持眾多的處理器和硬件平臺。最初,加載引導加載程序提供了一種簡單的方法,不用任何花架子就可以引導Linux。LILO引導加載程序對引導能力進行了擴充,但是它卻缺少文件系統的感知能力。最新一代的引導加載程序,例如GRUB,允許Linux 從一些文件系統(從Minix 到 Reise)上進行引導。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11322

    瀏覽量

    209867
  • 計算機
    +關注

    關注

    19

    文章

    7520

    瀏覽量

    88232
  • 源代碼
    +關注

    關注

    96

    文章

    2946

    瀏覽量

    66811

原文標題:從高級視角查看Linux引導過程,高手帶你揭開Linux過程內幕

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式Linux引導過程是怎樣的?

    歡迎關注公眾號,文章會同步發布在嵌入式客棧引言:本文簡明扼要的介紹了嵌入式Linux引導過程,X86體系的引導過程以及幾種常見嵌入式處理器
    發表于 12-17 07:25

    LINUX系統引導和初始化-LINUX內核解讀

    Linux 的系統引導和初始化 ----------Linux2.4.22內核解讀之一 一、 系統引導和初始化概述 相關代碼(引導扇區的程序
    發表于 11-03 22:31 ?53次下載

    Linux開機引導和啟動過程詳解

    。啟動階段接管了剩余工作,直到操作系統進入可操作狀態。總體來說,Linux 的開機引導和啟動過程是相當容易理解,下文將分節對于不同步驟進行詳細說明。BIOS 上電自檢(POST)引導
    發表于 04-02 14:46 ?521次閱讀

    簡述Linux文本查看命令

    Linux 常用命令中,除了 cat 還有很多其他用于文本查看的命令。
    的頭像 發表于 08-11 11:17 ?3578次閱讀

    使用Linux命令lsof查看進程打開和查看文件的說明

    linux命令 — lsof 查看進程打開那些文件 或者 查看文件給那個進程使用對調試文件有很好的幫助和精準定位問題
    發表于 10-28 08:00 ?0次下載

    Linux服務的內容如何查看

     ps是進程查看命令,netstat是端口查看命令,在Linux系統中,服務一定是有進程的,所以使用ps命令可以查看服務運行情況,另外,Linux
    發表于 05-20 09:09 ?764次閱讀
    <b class='flag-5'>Linux</b>服務的內容如何<b class='flag-5'>查看</b>

    linux的主機名如何查看

    linux如何查看主機名?
    發表于 06-15 08:59 ?5351次閱讀
    <b class='flag-5'>linux</b>的主機名如何<b class='flag-5'>查看</b>

    如何在Linux查看隱藏文件

    在windows可以查看隱藏的文件。在Linux中也可以查看隱藏文件且非常容易。要查看隱藏文件運行`ls -a`命令即可。
    的頭像 發表于 01-04 17:31 ?1.6w次閱讀

    Linux程序被Killed,查看原因

    Linux程序被Killed,查看原因
    的頭像 發表于 01-11 10:17 ?2261次閱讀

    ARMv7安全引導過程

    一樣使用BootLoader引導Linux內核和TEE OS。安全引導的啟動流程如圖下所示。 安全引導的啟動流程 系統啟動
    的頭像 發表于 11-07 15:25 ?880次閱讀
    ARMv7安全<b class='flag-5'>引導</b>的<b class='flag-5'>過程</b>

    linux 查看網卡狀態是否開啟

    如何查看 Linux 網卡狀態是否開啟 在 Linux 系統中,我們可以使用一些命令查看網卡狀態是否開啟。本文將詳細介紹如何使用這些命令
    的頭像 發表于 11-17 10:31 ?2665次閱讀

    linux查看網卡是down還是up

    Linux系統上,可以通過多種方式查看網卡的狀態是否為down或up。下面將詳細介紹這些方法,并給出具體的步驟和示例。 ifconfig命令 ifconfig命令是Linux系統上
    的頭像 發表于 11-17 10:34 ?9272次閱讀

    python如何查看運行過程

    常用的方法查看Python程序的運行過程。 使用print語句輸出信息: 最簡單的方法是在代碼中使用print語句輸出信息。我們可以在程序的關鍵位置插入一些print語句,以便在運
    的頭像 發表于 11-22 11:13 ?2080次閱讀

    linux查看weblogic進程

    Linux操作系統中,WebLogic是一種常用的Java應用服務器,用于部署和管理企業級Java應用程序。為了確保WebLogic服務器正常運行,有時我們需要查看WebLogic進程以了解其狀態
    的頭像 發表于 12-05 16:07 ?1940次閱讀

    linux怎么查看網卡的收光功率?

    linux怎么查看網卡的收光功率? 在Linux系統中,可以使用一些命令和工具查看網卡的收光功率。本文將介紹如何使用這些命令和工具
    的頭像 發表于 01-31 14:24 ?3810次閱讀
    主站蜘蛛池模板: 岛国电影网址| 午夜在线视频国产极品片 | 男女高潮又爽又黄又无遮挡 | 处初女处夜情视频在线播放| 亚洲色图19p| 色婷婷99综合久久久精品| 老女老肥熟国产在线视频| 国产精品久久久久久人妻精品流| 18岁末年禁止观看免费1000个| 邪恶肉肉全彩色无遮盖| 啪啪后入内射日韩| 玖玖爱在线播放| 国产综合欧美区在线| 俄罗斯bbbb| 99视频在线免费观看| 一本道手机无码在线看| 涩涩视频www在线观看入口| 久久精品国产eeuss| 国产毛片AV久久久久精品| 扒开老师大腿猛进AAA片| 伊人亚洲综合青草青草久热| 色欲档案之麻雀台上淫| 妻中蜜在线播放| 久久99re6国产在线播放| 国产成人精视频在线观看免费| 正在播放国产尾随丝袜美女| 午夜免费无码福利视频麻豆| 欧美成人免费观看久久| 寂寞骚妇女被后入式抽插| 俄罗斯女人Z0ZOZO| 97超碰射射射| 尤蜜网站在线进入免费| 午夜精品久久久久久99热蜜桃| 欧美精品XXXXBBBB| 久久毛片基地| 国精产品一区一区三区有限公司| 99热在线视频| 相声flash| 亚洲国产精品无码2019| 日日夜夜影院在线播放| 欧美激情视频在线观看一区二区三区|