想要讓一臺計算機作業,我們要做的第一件事就是讓這臺計算機開機,可能一般用戶看到的只是一個簡單的啟動界面,進入用戶界面后就可以進行相關的操作了,但是實際上在開機的時候計算機運行了很多程式,而運行的第一個程式就是Boot Loader這個開機管理程式,開機管理程式可以指定使用哪個核心檔案來開機,并實際加載核心到記憶體當中解壓縮與執行,此時核心就能夠開始在記憶體內活動,并偵測所有硬體資訊與加載適當的驅動程式來使整部主機開始運作,等到核心偵測硬體與加載驅動程式完畢后,一個最陽春的作業系統就開始在你的PC上面跑了,
往期推薦:
史上最全的Linux常用命令匯總(超全面!超詳細!)收藏這一篇就夠了!
史上最全的Linux常用命令匯總(超全面!超詳細!)收藏這一篇就夠了!
文章目錄
- 加載BIOS與自我測評
- 讀取并執行boot loader
- 依據bootleader加載Kernel
- Kernel主動呼叫systemd程式
加載BIOS與自我測評
BIOS最早可追溯到1970年代的CP/M作業系統,BIOS是CP/M作業系統中只能在特定機器上運行(machine-specific)的部分,它在系統引導時直接與硬體互動,現在,BIOS的作用是初始化和測驗硬體組件,以及從大容量存盤設備(如硬碟)加載引導程式,并由引導程式加載作業系統;當加載作業系統后,BIOS通過系統管理模式為作業系統提供硬體抽象,
在取得CPU介面設備的溝通頻率后、搜尋順序、硬碟的大小與型別、系統時間、介面設備IO地址等資訊后,BIOS還會進行開機自我測驗(Power-on Self Test,POST),然后開始執行硬體偵測初始化,并設定PnP裝置,之后定義出可開機的裝置順序,那么接下來就可以進行開機裝置的資料讀取了,
系統軟體大多數存放在硬碟中,所以BIOS會指定開機的裝置讓我們讀取磁盤中的作業系統核心檔案,由于檔案格式的不相同,因此我們必須要以一個開機管理程式來處理核心檔案加載(load)的問題,而這個開機程式就被稱為Bootloader,這個開機管理程式安裝在第一個扇區(sector)內,也就是我們一直談到的MBR(Master Boot Record,主要啟動記錄區)
注意:
BIOS是透過硬體的INT13中斷功能來讀取MBR的,也就是BIOS只要能偵測到硬碟,那么他就有辦法透過INT13這條信道來讀取該磁盤的第一個扇區內的MBR軟體,盡管系統的每顆硬碟的最前面區塊都有MBR和GPT兩個磁區表提供loader的區塊,具體讀取那個硬碟的loader的程式得看BIOS的設定,基本上系統的MBR都是第一個開機裝置的MBR,
讀取并執行boot loader
Loader的最主要功能是要認識作業系統的檔案格式并據以加載核心到主存盤器中去執行,由于不同作業系統的檔案格式不一致,因此每種作業系統都有自己的boot loader,當一臺電腦上安裝有多重作業系統時,必須使用特定的loader才能夠加載出屬于自己的作業系統的核心,解決系統的MBR只有一個,而要在一部主機上同時安裝多個作業系統,其實每個檔案系統都會保留一塊啟動扇區(boot sector)提供作業系統安裝bootloader,而當主機安裝有多個作業系統時boot sector,boot loader與MBR的相關性有點像下圖:

如上圖所示,每個作業系統默認是會安裝一套boot loader到他的檔案系統中(就是每個filesystem左下角的方框),而在Linux系統安裝時,可以選擇他安裝到自己的檔案系統中,也可以選擇不安裝,如果選擇安裝到MBR的話,那理論上你在MBR與boot sector都會保有一份boot loader程式的,至于Windows安裝時,他預設會主動將MBR與Boot sector都裝一份boot loader!所以安裝多重作業系統時,MBR常常會被不同的作業系統的boot loader所覆寫!但是MBR也只有一個,要怎么執行boot sector里面的loader我們就得詳細了解bootloader的功能了,它的主要功能如下:
- 提供選單:用戶可以選擇不同的開機專案,這也是多重引導的重要功能!
- 載入核心檔案:直接指向開機的程式區段來開始作業系統;
- 轉交其他loader:將開機管理功能交給其他loader負責,
由于具有選單功能,因此我們可以選擇不同的核心來開機,還具有控制權轉讓功能,那么我們就可以加載其他boot sector內的loader了,

如上圖所示,MBR使用Linux 的grub2 這個開機管理程式,并且里面假設已經有了三個選單,第一個選單可以直接指向Linux 的核心檔案并且直接加載核心來開機;第二個選單可以將開機管理程控權交給Windows來管理,此時Windows的loader 會接管開機流程,這個時候他就能夠啟動windows了,第三個選單則是使用Linux 在boot sector內的開機管理程式,此時就會跳出另一個grub的選單,
- 選單一:MBR(grub2)–>kernel file–>booting
- 選單二:MBR(grub2)–>boot sector(Windows loader)–>windows kernel–>booting
- 選單三:MBR(grub2)–>boot sector(grub2)–>kernel file–>booting
而最終bootloader的功能就是加載kernel檔案!
依據bootleader加載Kernel
通過boot loader的管理而開始讀取核心檔案后,接下來,Linux 就會將核心解壓縮到主存盤器當中,并且利用核心的功能,開始測驗與驅動各個周邊裝置,包括儲存裝置、CPU、網路卡、聲卡等等,此時Linux核心會以自己的功能重新偵測一次硬體, 而不一定會使用BIOS偵測到的硬體資訊!也就是說,核心此時才開始接管BIOS 后的作業了,一般來說,核心會被放置到/boot 里面,并且取名為/boot/vmlinuz!
為了硬體開發商與其他核心功能開發者的便利,Linux的核心是可以透過動態加載核心模塊(想象成驅動程式就可以),這些核心模塊放置在/lib/modules/目錄中,由于模塊放置到磁盤根目錄內,因此在開機程序中核心必須要掛載根目錄,這樣才能夠讀取核心模塊提供加載驅動程式的功能,為了擔心影響磁盤內的檔案系統,因此開機程序中根目錄是以只讀的方式進行掛載,
一般來說,非必要的功能且可以編譯成為模塊的核心功能,目前的linux都會將他編譯成為模塊,因此USB,SATA,SCSI等磁盤裝置的驅動程式通常都是以模塊的方式來存在的,Linux核心不認識SATA磁盤,所以需要加載SATA磁盤的驅動程式,否則根本無法掛載根目錄,SATA的驅動程式在/lib/moudles內,沒有根目錄當然讀取不到存放在檔案內的驅動程式,當然可以透過虛擬檔案系統來處理這個問題,虛擬記憶體的特點就是他可以通過boot loader來加載到記憶體中,然后這個檔案會被解壓縮并且在記憶體中仿真成一個根目錄,且此仿真在不記憶體當中的檔案系統能夠提供一支可執行的程式,透程序式來加載開機程序中所需要的的核心模塊,通常這些模塊就是USB、RAID、LVM等檔案系統與磁盤介面驅動程式,等載入完成后,會幫助核心重新呼叫systemd來開始后續的正常開機流程,

如上圖所示,boot loader可以加載kernel 與initramfs ,然后在記憶體中讓initramfs 解壓縮成為根目錄,kernel 就能夠藉此加載適當的驅動程式, 最終釋放虛擬檔案系統,并掛載實際的根目錄檔案系統,就能夠開始后續的正常開機流程,
Kernel主動呼叫systemd程式
當核心加載完畢、進行硬體偵測與驅動程式加載后,此時主機硬體已經準備就緒了,這時核心會主動呼叫第一支程式,而這個程式就是systemd,systemd最主要的功能就是準備軟體執行的環境,包括系統的主機名、網路設定、語系處理、檔案系統格式及其他服務的啟動等,而所的動作都會透過systemd的默認啟動服務集合,亦即是/etc/system/default.target來規劃,
當我們取得了/etc/system/default.target這一個預設操作界面的設定之后,接下來系統會鏈接到/usr/systemd/system/這個目錄下去取得multi-user.target或graphical.target這兩個其中的一個,這個target為多用戶支持設定系統環境,非root用戶會在這個階段的引導程序中啟用,防火墻相關的服務也會在這個階段啟動,接下來multi-user.target會把控制權交給sysinit.target,
sysinit.target會啟動重要的系統服務例如:系統掛載、記憶體交換空間和設備、內核補充等選項,sysinit.target在啟動程序中會傳遞給local-fs.target,這個target單元不會啟動用戶相關的服務,它只處理底層核心服務,這個target會根據/etc/fstab和/etc/inittab來執行相關操作,Systemd毫無疑問為改進Linux引導程序前進了一大步;它包含了一套漂亮的庫和守護行程配合作業來優化系統引導和關閉程序,許多Linux發行版正準備將它作為自己的正式引導程式,
不積小流無以成江河,不積跬步無以至千里,而我想要成為萬里羊,就必須堅持學習來獲取更多知識,用知識來改變命運,用博客見證成長,用行動證明我在努力,
如果我的博客對你有幫助、如果你喜歡我的博客內容,記得“點贊” “評論” “收藏”一鍵三連哦!聽說點贊的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/137368.html
標籤:其他
上一篇:利用find命令進行批量操作
下一篇:人人 厚訊路由器TTL刷機


