欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    inux操作系統的啟動過程是計算機啟動過程中的一個重要環節。在現代計算機中,UEFI(Unified Extensible Firmware Interface)和GRUB(GRand Unified Bootloader)是兩個關鍵的組件,它們共同協作以確保系統能夠順利啟動。下面,我們將詳細探討這兩個組件的配置過程,以及它們如何在Linux啟動中發揮作用。

    UEFI:統一的啟動環境

    UEFI是一種現代的固件接口,它取代了傳統的BIOS(Basic Input/Output System)。UEFI提供了一種更加靈活和安全的方式來啟動操作系統。它支持從GPT(GUID分區表)分區啟動,這使得它能夠支持更大的硬盤和更多的啟動選項。

    UEFI的優勢

    1. 安全性:UEFI提供了安全啟動功能,可以防止未授權的操作系統或引導程序加載。
    2. 靈活性:UEFI允許用戶通過圖形界面選擇啟動設備或操作系統。
    3. 速度:UEFI啟動過程通常比傳統BIOS更快。

    配置UEFI

    配置UEFI通常涉及到以下幾個步驟:

    1. 啟用UEFI模式:在計算機啟動時進入BIOS設置,并選擇啟用UEFI模式。
    2. 配置啟動順序:在UEFI設置中,可以指定啟動設備的順序,例如首先從SSD啟動,如果SSD中沒有可啟動的操作系統,則嘗試從HDD啟動。

    GRUB:Linux的引導程序

    GRUB是一個廣泛使用的開源引導程序,它支持多操作系統啟動,并允許用戶在啟動時選擇不同的內核或配置選項。

    GRUB的工作原理

    1. 菜單配置:GRUB在啟動時顯示一個菜單,列出所有可啟動的操作系統和內核選項。
    2. 自動選擇:如果沒有選擇特定的啟動項,GRUB將自動選擇默認項進行啟動。

    配置GRUB

    配置GRUB涉及到編輯/etc/default/grub和/boot/grub/grub.cfg文件。以下是一些常見的配置示例:

    # /etc/default/grub 文件配置示例
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    GRUB_CMDLINE_LINUX="root=/dev/sda1"
    GRUB_TIMEOUT=10
    
    # 更新 GRUB 配置
    sudo update-grub

    這段配置設置了Linux啟動時的默認命令行參數,設置了root分區,并定義了GRUB菜單的顯示時間。

    特殊啟動配置

    在某些情況下,可能需要進行特殊的啟動配置,例如:

    • 恢復模式:在系統出現問題時,可以通過GRUB菜單選擇進入恢復模式。
    • 特定內核參數:如果需要為特定的硬件配置內核參數,可以在GRUB配置文件中設置。

    示例

    BIOS是Basic Input/Output System的簡稱,中文基本輸入輸出系統。它早期由廠商燒錄在ROM(只讀存儲器,一般只能以只讀方式讀取,在計算機斷電后也不會丟失數據。在計算機整機裝入前寫入。)存儲芯片上的軟件程序。隨著技術的發展,現代的一般放在閃存中,允許BIOS的動態升級。

    BIOS為操作系統提供了最基礎的原始服務,操作系統來引導的時候基本會使用BIOS所提供的服務,在操作系統完全初始化后,操作系統一般就不再使用BIOS所提供的服務了。它的歷史在網上很多,可以找一些資料看看。在這里我們主要介紹BIOS的軟件功能。

    在早期的計算機中,計算機加電后執行BIOS所提供的程序,BIOS一般主要分為三個部分:

    • 加電自檢:用于檢測計算器是否存在錯誤
    • 初始化:用于創建中斷向量,設置寄存器,對一些外部設備進行初始化和檢測等
    • 引導操作系統:用于引導操作系統,在早期有些操作系統將引導程序內嵌到操作系統,BIOS負責將MBR加載到內存執行操作系統的引導,現代一般都有一個單獨的引導程序用于引導操作系統,比如GRUB

    BIOS提供了豐富的軟件服務用于和硬件交互,比如打印數據,讀取硬盤數據等等,它提供的這些服務主要為所操作系統服務,它位操作系統隔離硬件提供的一個統一的接口。具體的服務可以參考維基百科(en.wikipedia.org/wiki/BIOS_interrupt_call)

    BIOS早期通過CHS進行加載數據到內存,到現在通常都是通過LBA進行硬盤尋址。BIOS通過加載第一個扇區叫做MBR的分區表加載到內存中用于接下來的引導工作。在Linux中這個工作就交給了GRUB等引導程序。

    BIOS和MBR

    BIOS引導操作系統時,BIOS會將磁盤中的數據加載到內存中,那么它如何知道要加載什么數據呢?答案是在BIOS中加載啟動設備的第一個扇區。

    通常一個磁盤通常會將其分成幾個部分,在計算機中這個過程叫做分區,有很多分區的規范,而BIOS使用了一個叫做 MBR分區表 的格式。MRB分區表存放在磁盤的第一個扇區,這個扇區一般的大小為512字節。在BIOS的系統中,這512字節非常重要,它決定我們的系統能否啟動成功。

    MBR

    MBR全稱Master boot record,是BIOS中引入的概念,它是磁盤的第一個扇區,這個扇區大小為512字節。這個扇區是承接操作系統和BIOS的關鍵橋梁。BIOS完成所有的初始工作后,將加載磁盤的第一個分區到 0x7c00 的內存位置后,就將CPU的控制交給了 0x7c00 位置的代碼了。

    MBR中保存了重要的信息,它主要包含了用于引導操作系統的引導代碼和分區信息。我們首先來看看MBR的結構

    這個圖來自維基百科,我們重點關注第一張圖,因為第二張圖通常用于GPT。在第一張圖中我們知道開始的446個字節通過為引導程序所使用的,在Linux中,就是GRUB引導程序使用。緊接著的64個字節表示分區信息,每個分區信息占16個字節,最后的兩個字節是 0xAA55 結尾。 0xAA55 作為簽名作為這個值結束的第一個扇區表示這是一個MBR分區表。MBR分區表有很多變種,可以參考維基百科的介紹。

    每個分區有16個字節,這個4個分區是主分區,這也為為什么一個硬盤最多為什么能夠分為4個主分區的原因,為了能夠突破最多使用4個分區的限制,可以將主分區設置為擴展分區,在擴展分區進行分區劃分為多個邏輯分區,需要注意的擴展分區無法直接使用,只能夠將邏輯分區作為最終數據訪問的分區使用。我們可以將擴展分區看做一個獨立的硬盤,可以將這個擴展分區繼續進行分區,分成多個邏輯分區。邏輯分區的分區表則在每一個擴展分區的第一個扇區中。分區項極其復雜,下面我們將根據一個例子來分析MBR分區。

    首先我們需要獲取硬盤的第一個扇區的數據

    $ sudo dd if=/dev/nvme0n1 bs=512 count=1 skip=0 > lba.0
    $ hexdump -C lba.0
    00000000  eb 63 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.c..............|
    00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|
    00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|
    00000030  f3 eb 16 b4 02 b0 01 bb  00 7c b2 80 8a 74 01 8b  |.........|...t..|
    00000040  4c 02 cd 13 ea 00 7c 00  00 eb fe 00 00 00 00 00  |L.....|.........|
    00000050  00 00 00 00 00 00 00 00  00 00 00 80 01 00 00 00  |................|
    00000060  00 00 00 00 ff fa 90 90  f6 c2 80 74 05 f6 c2 70  |...........t...p|
    00000070  74 02 b2 80 ea 79 7c 00  00 31 c0 8e d8 8e d0 bc  |t....y|..1......|
    00000080  00 20 fb a0 64 7c 3c ff  74 02 88 c2 52 bb 17 04  |. ..d|<.t...R...|
    00000090  f6 07 03 74 06 be 88 7d  e8 17 01 be 05 7c b4 41  |...t...}.....|.A|
    000000a0  bb aa 55 cd 13 5a 52 72  3d 81 fb 55 aa 75 37 83  |..U..ZRr=..U.u7.|
    000000b0  e1 01 74 32 31 c0 89 44  04 40 88 44 ff 89 44 02  |..t21..D.@.D..D.|
    000000c0  c7 04 10 00 66 8b 1e 5c  7c 66 89 5c 08 66 8b 1e  |....f..\|f.\.f..|
    000000d0  60 7c 66 89 5c 0c c7 44  06 00 70 b4 42 cd 13 72  |`|f.\..D..p.B..r|
    000000e0  05 bb 00 70 eb 76 b4 08  cd 13 73 0d 5a 84 d2 0f  |...p.v....s.Z...|
    000000f0  83 d0 00 be 93 7d e9 82  00 66 0f b6 c6 88 64 ff  |.....}...f....d.|
    00000100  40 66 89 44 04 0f b6 d1  c1 e2 02 88 e8 88 f4 40  |@f.D...........@|
    00000110  89 44 08 0f b6 c2 c0 e8  02 66 89 04 66 a1 60 7c  |.D.......f..f.`||
    00000120  66 09 c0 75 4e 66 a1 5c  7c 66 31 d2 66 f7 34 88  |f..uNf.\|f1.f.4.|
    00000130  d1 31 d2 66 f7 74 04 3b  44 08 7d 37 fe c1 88 c5  |.1.f.t.;D.}7....|
    00000140  30 c0 c1 e8 02 08 c1 88  d0 5a 88 c6 bb 00 70 8e  |0........Z....p.|
    00000150  c3 31 db b8 01 02 cd 13  72 1e 8c c3 60 1e b9 00  |.1......r...`...|
    00000160  01 8e db 31 f6 bf 00 80  8e c6 fc f3 a5 1f 61 ff  |...1..........a.|
    00000170  26 5a 7c be 8e 7d eb 03  be 9d 7d e8 34 00 be a2  |&Z|..}....}.4...|
    00000180  7d e8 2e 00 cd 18 eb fe  47 52 55 42 20 00 47 65  |}.......GRUB .Ge|
    00000190  6f 6d 00 48 61 72 64 20  44 69 73 6b 00 52 65 61  |om.Hard Disk.Rea|
    000001a0  64 00 20 45 72 72 6f 72  0d 0a 00 bb 01 00 b4 0e  |d. Error........|
    000001b0  cd 10 ac 3c 00 75 f4 c3  fe 7e 7d 14 00 00 80 04  |...<.u...~}.....|
    000001c0  01 04 0b fe c2 ff 00 08  00 00 00 00 10 00 00 fe  |................|
    000001d0  c2 ff 05 fe c2 ff fe 0f  10 00 02 e8 6f 25 00 00  |............o%..|
    000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
    00000200

    這里我們使用gpt工具解析MBR

    $ pip install gpt

    安裝好后,可以通過這個命令查看MBR詳細的信息

    $ cat lba.0 | print_mbr
    <<< MBR >>>
    BootCode: 0xeb6390108ed0bc00b0b800008ed88ec0fbbe007cbf0006b90002f3a4ea21060000bebe073804750b83c61081fefe0775f3eb16b402b001bb007cb2808a74018b4c02cd13ea007c0000ebfe00000000000000000000000000000000800100000000000000fffa9090f6c2807405f6c2707402b280ea797c000031c08ed88ed0bc0020fba0647c3cff740288c252bb1704f607037406be887de81701be057cb441bbaa55cd135a52723d81fb55aa753783e101743231c0894404408844ff894402c7041000668b1e5c7c66895c08668b1e607c66895c0cc744060070b442cd137205bb0070eb76b408cd13730d5a84d20f83d000be937de98200660fb6c68864ff40668944040fb6d1c1e20288e888f4408944080fb6c2c0e80266890466a1607c6609c0754e66a15c7c6631d266f73488d131d266f774043b44087d37fec188c530c0c1e80208c188d05a88c6bb00708ec331dbb80102cd13721e8cc3601eb900018edb31f6bf00808ec6fcf3a51f61ff265a7cbe8e7deb03be9d7de83400bea27de82e00cd18ebfe47525542200047656f6d0048617264204469736b005265616400204572726f720d0a00bb0100b40ecd10ac3c0075f4c3
    UniqueMBRDiskSignature:                                         0xfe7e7d14
    Unknown:                                                            0x0000
    PartitionRecord: 0x800401040bfec2ff000800000000100000fec2ff05fec2fffe0f100002e86f250000000000000000000000000000000000000000000000000000000000000000
    Signature:                                                          0xAA55
    <<< MBR Partition #0 >>>
    #0.BootIndicator:                                                     0x80
    #0.Is Bootable? (syn):                                                 Yes
    #0.StartingCHS:                                                    4, 4, 1
    #0.OSType:                                                             0xB
    #0.OSType (syn):                                                         ?
    #0.EndingCHS:                                                255, 254, 194
    #0.StartingLBA:                                                       2048
    #0.SizeInLBA:                                                      1048576
    <<< MBR Partition #1 >>>
    #1.BootIndicator:                                                      0x0
    #1.Is Bootable? (syn):                                                  No
    #1.StartingCHS:                                              255, 254, 194
    #1.OSType:                                                             0x5
    #1.OSType (syn):                                                         ?
    #1.EndingCHS:                                                255, 254, 194
    #1.StartingLBA:                                                    1052670
    #1.SizeInLBA:                                                    628090882
    <<< MBR Partition #2 >>>
    #2.BootIndicator:                                                      0x0
    #2.Is Bootable? (syn):                                                  No
    #2.StartingCHS:                                                    0, 0, 0
    #2.OSType:                                                             0x0
    #2.OSType (syn):                                                     Empty
    #2.EndingCHS:                                                      0, 0, 0
    #2.StartingLBA:                                                          0
    #2.SizeInLBA:                                                            0
    <<< MBR Partition #3 >>>
    #3.BootIndicator:                                                      0x0
    #3.Is Bootable? (syn):                                                  No
    #3.StartingCHS:                                                    0, 0, 0
    #3.OSType:                                                             0x0
    #3.OSType (syn):                                                     Empty
    #3.EndingCHS:                                                      0, 0, 0
    #3.StartingLBA:                                                          0
    #3.SizeInLBA:                                                            0

    這里重點關注分區表的信息,從分區表中我們知道使用了兩個主分區信息。由于第一個分區設置了引導標志說明其是引導分區。同時我們使用fdisk查看一下分區信息

    $ sudo fdisk -l /dev/sda
    Disk /dev/sda: 300 GiB, 322122547200 bytes, 629145600 sectors
    Disk model: VBOX HARDDISK
    Units: sectors of 1 * 512=512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0x147d7efe
    
    Device     Boot   Start       End   Sectors   Size Id Type
    /dev/sda1  *       2048   1050623   1048576   512M  b W95 FAT32
    /dev/sda2       1052670 629143551 628090882 299.5G  5 Extended
    /dev/sda5       1052672 629143551 628090880 299.5G 83 Linux

    但在這里卻看到3個分區信息,這是為什么?之前我們也說過,磁盤一般分區分為主分區,擴展分區和邏輯分區。所以在這里我們重點看第二個主分區信息

    <<< MBR Partition #1 >>>
    #1.BootIndicator:                                                      0x0
    #1.Is Bootable? (syn):                                                  No
    #1.StartingCHS:                                              255, 254, 194
    #1.OSType:                                                             0x5
    #1.OSType (syn):                                                         ?
    #1.EndingCHS:                                                255, 254, 194
    #1.StartingLBA:                                                    1052670
    #1.SizeInLBA:                                                    628090882

    在這里我們看到OSType的值位5,通過查詢維基百科關于分區類型的信息(en.wikipedia.org/wiki/Partition_type),知道值為5說明這個分區為擴展分區。通過這個信息,可以知道這個擴展分區從 1052670 開始,那么將這個扇區的數據截取出來

    $ sudo dd if=/dev/sda bs=512 count=1 skip=1052670 > lba.1052670

    按照相同的方式將其顯示為二進制數據

    00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 fe  |................|
    000001c0  c2 ff 83 fe c2 ff 02 00  00 00 00 e8 6f 25 00 00  |............o%..|
    000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
    *
    000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
    00000200

    這個數據布置讓我們知道這個扇區也是一個MBR分區的信息,前446個字節為空,后面跟著的是分區信息,這個分區表示邏輯分區。然后我們使用gpt工具查看一下詳細信息。

    $ cat lba.1052670| print_mbr
    <<< MBR >>>
    BootCode: 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    UniqueMBRDiskSignature:                                         0x00000000
    Unknown:                                                            0x0000
    PartitionRecord: 0x00fec2ff83fec2ff0200000000e86f25000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    Signature:                                                          0xAA55
    <<< MBR Partition #0 >>>
    #0.BootIndicator:                                                      0x0
    #0.Is Bootable? (syn):                                                  No
    #0.StartingCHS:                                              255, 254, 194
    #0.OSType:                                                            0x83
    #0.OSType (syn):                                                         ?
    #0.EndingCHS:                                                255, 254, 194
    #0.StartingLBA:                                                          2
    #0.SizeInLBA:                                                    628090880
    <<< MBR Partition #1 >>>
    #1.BootIndicator:                                                      0x0
    #1.Is Bootable? (syn):                                                  No
    #1.StartingCHS:                                                    0, 0, 0
    #1.OSType:                                                             0x0
    #1.OSType (syn):                                                     Empty
    #1.EndingCHS:                                                      0, 0, 0
    #1.StartingLBA:                                                          0
    #1.SizeInLBA:                                                            0
    <<< MBR Partition #2 >>>
    #2.BootIndicator:                                                      0x0
    #2.Is Bootable? (syn):                                                  No
    #2.StartingCHS:                                                    0, 0, 0
    #2.OSType:                                                             0x0
    #2.OSType (syn):                                                     Empty
    #2.EndingCHS:                                                      0, 0, 0
    #2.StartingLBA:                                                          0
    #2.SizeInLBA:                                                            0
    <<< MBR Partition #3 >>>
    #3.BootIndicator:                                                      0x0
    #3.Is Bootable? (syn):                                                  No
    #3.StartingCHS:                                                    0, 0, 0
    #3.OSType:                                                             0x0
    #3.OSType (syn):                                                     Empty
    #3.EndingCHS:                                                      0, 0, 0
    #3.StartingLBA:                                                          0
    #3.SizeInLBA:                                                            0

    從信息中我們知道這個擴展分區只有一個邏輯分區,從扇區2開始,但需要注意的這個2有一個偏移量,也就是擴展分區的起始地址,也就是1052670,所以這個邏輯分區真正的扇區從1052670 + 2開始。和fdisk顯示的是一致的。而且類型為0x83,說明他是一個Linux分區類型。

    至此,我們學習了MBR分區格式,并且舉一個例子來分析MBR分區格式。那么前446個字節是什么,MBR分區的446個字節是GRUB的引導代碼,用于承接后續的GRUB的流程。這段代碼我們會在后續GRUB的分析中慢慢展開,在這里我們只要知道MBR分區的構造即可,MBR由446個字節的引導代碼和64字節的分區表,以及2個字節的0xAA55標志組成,總共512字節。

    接著,BIOS所提供的服務一般都是通過調用中斷服務程序來實現,它提供了極其豐富的功能,我們下面將使用一個簡單的例子來說明如何調用BIOS所提供的服務。

    一個BIOS例子

    這個例子展現了如何在 Qemu 模擬器上打印出一個 Hello World。我們使用了BIOS所提供的打印功能 **

        .code16
    start:
        mov $msg,  %si          /*將si寄存器指向打印的數據*/
        mov $0x0e, %ah          /*將ah寄存器設置為0x0e*/
    loop:
        lodsb                   /*將si的數據賦值給al,并且將si指向下一個字符*/
        or %al, %al             /*判斷字符串是否結束,這里以空作為字符串的結束字符*/
        jz halt                 /*如果字符串結束,那么跳轉到halt*/
        int $0x10               /*調用bios 0x10功能*/
        jmp loop                /*跳轉到loop,繼續執行*/
    halt:
        hlt                     /*掛起處理器*/
    msg:
        .asciz "hello world"    /*將要被打印的數據*/
    .org 510
    .word 0xaa55

    在沒有開始編譯前,看看這段代碼,注釋中詳細的說明了這段代碼調用了BIOS的0x10功能,通過維基百科BIOS中斷調用(en.wikipedia.org/wiki/BIOS_interrupt_call),可以知道0x0Eh功能用于向顯示器打印字符。通過將0x0Eh賦值給ah寄存器,al寄存器中負責真正顯示的字符。

    同時,這里還提供了一個Makefile,用于生成MBR格式的文件鏡像

    .POSIX:
    
    MAIN :=main.img
    
    .PHONY: clean run
    
    $(MAIN): main.S
    	as -o main.o '$<'
    	ld --oformat binary -o '$@' -Ttext 0x7C00 main.o
    
    clean:
    	rm -f '$(MAIN)'

    使用as將源文件編譯為二進制文件,然后使用ld進行鏈接,并將代碼的地址以0x7C00編譯,

    $ make

    運行

    $ qemu-system-x86_64 main.img

    運行的結果如下

    BIOS的缺點

    但由于BIOS是幾十年前的產物,有一些無法滿足現代操作系統的需求。

    1. BIOS運行在16位的實模式下,最大尋址空間為1M
    2. BIOS無法使用更加先進的處理器技術
    3. BIOS使用的MBR分區無法支持更大的磁盤空間,MBR分區支持最大的磁盤空間為2T
    4. BIOS的代碼由匯編編寫,降低了工作效率
    5. 由于MBR是第一個扇區,所以BIOS無法智能的選擇操作系統,這樣就無法安裝雙系統,比如同時安裝windows和linux,但在linux中有一個方案就是linux安裝的時候會使用grub引導,使用grub來引導windows和linux,讓這兩個系統共存。所以我們可以安裝好后windows,后安裝linux,linux會自動監測到windows,從而將其加到grub的啟動菜單中。這里涉及到grub的內容,后邊會有介紹關于grub的。

    為了解決這些問題,從而引入了更加先進的UEFI固件,UEFI固件規范中也規定了新的分區格式即GPT分區格式。

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有