linux內核啟動關於先有雞再有蛋的問題?

linux內核映像:

用戶選擇要載入的內核之後,次引導載入程序(GRUB)就會根據

/boot/grub.conf

配置文件中所設置的信息,從/boot/所在的分區上讀取Linux內核映像,然後把內核映像載入到內存中並把控制權交給Linux內核。

linux內核獲得控制權之後開始干自己的事

  • 檢測硬體
  • 解壓縮自己並安裝必要驅動
  • 初始化與文件系統相關的虛擬設備,LVM或RAID
  • 裝載根文件系統,掛在根目錄下面
  • 完成之後,linux在進程空間裡面載入init程序,下面輪到init幹活
  • init進程

問題:在載入內核時, 還未載入根文件系統,如何讀取/boot/grub.conf ,是怎麼載入/boot中的內核映像的。 所提變成先有雞還是先有蛋:要載入內核,就要去讀取/boot,而這就需要文件系統的支持。 文件系統要載入, 就需要內核啟動區載入文件系統??


grub 本身就是一個系統,它與 linux 無關,你可以用 grub 啟動 windows。

grub 系統在引導區,它從引導區直接啟動,並內置了文件系統,所以不存在雞蛋問題。

在 grub 中選擇內核的過程,全部都由 grub 這個系統控制,與 linux 無關,此時 linux 還根本沒有啟動。

grub 這個系統讀取了 /boot/grub.conf,然後引導了 linux 內核之後,才把控制權交給 linux 系統,之後才是 linux 的事,所以讀取 grub.conf 與 linux 內核沒有任何關係。


謝邀,GRUB內置文件系統訪問支持,雖然是極度精簡的,但已經具備根據路徑讀取相應文件的二進位流。換句話說,GRUB在不依賴Linux內核的情況下具有讀取配置文件內核映像的能力。這就解決了先有雞還是先有蛋的問題。

另外說句題外話,早在GRUB之前,普遍使用LILO引導Linux內核,而LILO不具備文件系統訪問能力。那麼,這個時代是怎麼解決Linux引導先有雞還是先有蛋的問題呢?

答案是:

1,LILO沒有配置文件,所以不需要讀取配置文件。

2,Linux內核映像在硬碟物理位置(柱面、磁軌、扇區)被硬編碼在程序中,利用BIOS提供的服務直接由磁碟載入。

3,因為沒有文件系統支持,LILO還弱弱的要求內核映像必須是連續的,不能有碎片。

====關於LILO的補充====

之前的答案有誤,LILO其實也有配置文件,但在系統啟動時並不會讀取配置文件。每次修改LILO配置文件後,需要生成新的MBR引導記錄,也就是把配置文件的內容硬編碼到引導程序中。


題主可能進入了一個誤區:並不是所有軟體都是由軟體啟動或載入的,所以不存在先有雞先有蛋的問題。

對一般Linux系統而言,其由grub引導程序引導載入。那麼問題來了,又是誰啟動了grub呢,是硬體。硬體啟動則是因為電。是由一系列的順序動作組成。


花一個月時間自己寫個bootloader就什麼都清楚了,這裡是有教程和代碼實現,供參考:http://heguangyu5.github.io/my-linux/html/1-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E5%87%86%E5%A4%87.html


根本上說,是BIOS調用裝載GRUB,BIOS調用裝載kernel image

GRUB內部包含微型的文件系統訪問信息

Linux啟動的總體階段

以下引自《Understanding the Linux Kernel》 Daniel P. Bovet

Appendix A. System Startup

A.1 The BIOS

The moment after a computer is powered on, it is practically useless because the RAM chips

contain random data and no operating system is running. After RESET is

asserted, some registers of the processor (including cs and eip) are set to fixed values, and

the code found at physical address 0xfffffff0 is executed. This address is mapped by the

hardware to a certain read-only, persistent memory chip that is often called Read-Only

Memory (ROM). The set of programs stored in ROM is traditionally called Basic Input/Output

System (BIOS), since it includes several interrupt-driven low-level procedures used by some

operating systems to handle the hardware devices that make up the computer.

Linux is forced to use BIOS in the bootstrapping phase, when it must retrieve the kernel

image from disk or from some other external device. The BIOS bootstrap procedure

essentially performs the following four operations:

  1. Executes a series of tests on the computer hardware
  2. Initializes the hardware devices.
  3. Searches for an operating system to boot. Actually, depending on the BIOS setting,the procedure may try to access (in a predefined, customizable order) the first sector(boot sector) of any floppy disk, hard disk, and CD-ROM in the system.
  4. As soon as a valid device is found, copies the contents of its first sector into RAM, starting from physical address 0x00007c00, and then jumps into that address and executes the code just loaded.

Once initialized, Linux does not use BIOS, but provides its own device driver for every

hardware device on the computer.

A.2 The Boot Loader

The boot loader is the program invoked by the BIOS to load the image of an operating system kernel into RAM. The first sector of the hard disk, named the Master Boot Record (MBR), includes the partition table and a small program, which loads the first sector of the partition containing the operating system to be started. Following this approach, only the operating

system whose kernel image is stored in the active partition can be booted. As we shall see

later, Linux is more flexible because it replaces the rudimentary program included in the

MBR with a sophisticated program such as LILO or GRand Unified Bootloader (GRUB) that

allows users to select the operating system to be booted.

…………

中間省略一大段

…………

  • Invokes a BIOS procedure to load the setup( ) code of the kernel image from the disk and puts it in RAM starting from address 0x00090200.
  • Invokes a BIOS procedure to load the rest of the kernel image from the disk and puts the image in RAM starting from either low address 0x00010000 or high address 0x00100000

以下內容引自6 Stages of Linux Boot Process (Startup Sequence)

  • GRUB has the knowledge of the filesystem (the older Linux loader LILO didn』t understand filesystem).

而BIOS程序是由硬體實現了ROM地址到CPU定址空間的映射,不需要「驅動程序」裝載。

BIOS調用之所以能「通吃」地訪問所有可啟動的存儲設備,是因為晶元組給存儲設備介面制定了標準,所有的存儲設備都要符合這個標準。

由於GRUB訪問配置文件依賴於內部包含的文件系統信息,勢必導致其對於文件系統的支持範圍與其自身體積的矛盾。目前GRUB支持從哪些文件系統上裝載, @孫建希 說的很詳細。


就像上面說過的了... 現在的引導裝載程序(例如 GRUB)已經是一個獨立的能夠管理硬碟讀取分區的微型系統了,如果你進入 GRUB 的命令行的話,還可以使用 GRUB 自己實現的一些類 Bash 命令和類 Unix 工具... 而這些跟內核都無關的。所以自主讀取硬碟上的配置和啟動硬碟上的內核鏡像都綽綽有餘。

其實真正的「先雞先蛋」問題是在你的描述中的:

解壓縮自己並安裝必要驅動

這一步。

因為引導程序啟動的內核僅僅是內核核心而已... 它不包含各種驅動模塊(包括硬碟控制器的驅動)。所以內核被引導以後其實無法完成對 root 的掛載... 無法掛載文件系統便不能讀取並載入內核驅動模塊,沒有驅動支持就不能管理硬碟(完成對文件系統的掛載)...

所以啟動過程中需要解決有矛盾的地方還存在於 內核 和 存儲設備 之間。

於是在內核被啟動前引導程序會預先載入一部分內容(以一個被被打包的壓縮歸檔的形式存在),其中包括了一部分必要的驅動模塊。內核啟動後會將該壓縮歸檔讀入 initramfs,掛載到 / 上(注意:initramfs 基於 tmpfs),然後切入用戶模式執行 initramfs 上的 init 將驅動載入到內核中。然後才能掛載真正的 root 文件系統,開始 init ...

跟 initramfs 相關的就是 GRUB 上的 initrd 參數。


吃完午飯,嘮嘮。

grub,uboot 等等統稱為 bootloader. andriod刷機見過不?也是bootloader。

linux內核是不需要定製的(這裡不是指不需要驅動,而是硬體調參),而bootloader通常需要定製的。所以不同板子需要不同的bootloader,grub是常用的x86 bootloader,grub 不需要調參是因為bios的存在,可以認為bios 和grub 統一為bootloader。

bootloader完成啟動linux 的任務,當然可以啟動windows等 操作系統。bootloader支持文件系統的,GNU GRUB Manual 2.00

Support multiple filesystem types

Support multiple filesystem types transparently, plus a useful explicit
blocklist notation. The currently supported filesystem types are Amiga
Fast FileSystem (AFFS)
, AtheOS fs, BeFS,
BtrFS (including raid0, raid1, raid10, gzip and lzo),
cpio (little- and big-endian bin, odc and newc variants),
Linux ext2/ext3/ext4, DOS FAT12/FAT16/FAT32, exFAT, HFS,
HFS+, ISO9660 (including Joliet, Rock-ridge and multi-chunk files),
JFS, Minix fs (versions 1, 2 and 3), nilfs2,
NTFS (including compression), ReiserFS, ROMFS,
Amiga Smart FileSystem (SFS), Squash4, tar, UDF,
BSD UFS/UFS2, XFS, and ZFS (including lzjb, gzip,
zle, mirror, stripe, raidz1/2/3 and encryption in AES-CCM and AES-GCM).
See Filesystem, for more information.

linux的文件系統和grub的文件系統識別是不一樣的。linux的文件系統架構多牛逼,你的各種操作。grub的你只能識別文件,讀一下。能新建軟硬鏈接嗎?


沒人貼阮一峰的文章嗎?那我貼一下

計算機是如何啟動的?


雞與蛋的類比不對, 你可以簡單得認為是grub自己先弄了個小型的文件系統, 所以它可以去讀配置 文件, 然後再啟動大的操作系統...更像是先引爆核彈然後讓核彈引爆氫彈...


以前我也困惑這個問題,但是隨著學習的深入,我試著回答一下吧。

這裡先描述一下8086計算機在加電後(當你按下開機鍵後)執行的動作吧。

大家都知道計算機啟動的時候會首先出現主板logo的界面,這時可以按del鍵進行主板功能調節,那這個就是BIOS(base input output operationg system基本輸入輸出系統)。它才是所有計算機啟動的第一個操作系統,它是用來檢測計算機硬體是否能正常工作和初始化操作系統環境的。那它是怎麼被啟動的呢?請繼續往下看。

計算機中的內存(DRAM動態內存)被分成許多部分,每個部分在計算機啟動的時候被定義了存放不同的內容(程序),功能也自然不一樣,具體的分表可以去搜一下,這裡就不展開說了。在內存中低地址位的低16B的空間是映射到BIOS中的,這個時候只要訪問到這一塊內存的時候都會訪問到BIOS的固件(ROM),所以也就是說這16B的空間就相當於是BIOS的存放區,至於怎麼映射到這一塊,則由硬體實現。計算機啟動的時候也是首先會訪問到這一塊內存,(為什麼?在設計硬體的時候就是這樣設計了),所以,當計算機啟動的時候,最先啟動的是BIOS,初始化完成後,就可以啟動其他操作系統了,grub也是一個操作系統,linux也是一個操作系統。

要上課了,下次再來回答一點關於mbr的知識方便大家理解吧。


裝幾遍系統就清楚了。


第一步是硬體在固定位置引導,完成之後為了讀取根目錄下的文件,會載入一個虛擬鏡像,之後才是內核。應該是這樣,可以查查資料


嗯,這個蛋不是雞蛋。


看到這麼多答案也是醉了…能有人給題主從MBR介紹起么?


。。吐槽一下grub引導不了Windows。。


推薦閱讀:

請問如何從下載的linux內核文件繼續編寫操作系統?
能敘述下面向對象思想在Linux內核編程中的應用嗎?
Linux操作系統關於C library的理解?
如何訪問linux內核,讀取所有進程的task_struct結構?/dev/mem?還是編寫驅動程序?
為什麼 Linux 不用微內核?

TAG:操作系統 | Linux | Linux內核 | 操作系統內核 |