Linux 引導啟動程式(boot)

2021-08-25 17:48:48 字數 2697 閱讀 2019

主要描述boot/

目錄中的三個彙編**檔案,見列表3-1

所示。正如在前一章中提到的,這三個檔案雖然都是匯程式設計序,但卻使用了兩種語法格式。bootsect.s

和setup.s

採用近似於intel

的組合語言語法,需要使用intel8086

彙編編譯器和聯結器as86

和ld86

,而head.s

則使用gnu

的匯程式設計序格式,並且執行在保護模式下,需要用gnu

的as進行編譯。這是一種at&t

語法的組合語言程式。

使用兩種編譯器的主要原因是由於對於intelx86

處理器系列來講,gnu

的編譯器僅支援i386

及以後出的cpu

。不支援生成執行在實模式下的程式。

閱讀這些**除了你需要知道一些一般8086

組合語言的知識以外,還要對採用intel80x86

微處理器的pc

機的體系結構以及80386 32

位保護模式下的程式設計原理有些了解。所以在開始閱讀源**之前可以先大概瀏覽一下附錄中有關pc

機硬體介面控制程式設計和80386 32

這裡先總的說明一下linux

作業系統啟動部分的主要執行流程。當pc

電源開啟後,80x86

結構的cpu

自動進入實模式,並從位址0xffff0

開始自動執行程式**,這個位址通常是rom-bios

中的位址。pc

機的bios

將執行某些系統的檢測,並在實體地址0

處開始初始化中斷向量。此後,它將可啟動裝置的第乙個扇區(磁碟引導扇區,512

位元組)讀入記憶體絕對位址0x7c00

處,並跳轉到這個地方。啟動裝置通常是軟碟機或是硬碟。這裡的敘述是非常簡單的,但這已經足夠理解核心初始化的工作過程了。

linux

的最最前面部分是用8086

組合語言編寫的(boot/bootsect.s)

,它將由bios

讀入到記憶體絕對位址0x7c00(31kb)處,當它被執行時就會把自己移到絕對位址0x90000(576kb)

處,並把啟動裝置中後2kb

位元組**(boot/setup.s)

讀入到記憶體0x90200

處,而核心的其它部分(system

模組)則被讀入到從位址0x10000

開始處,因為當時system

模組的長度不會超過0x80000

位元組大小(即512kb

),所以它不會覆蓋在0x90000

處開始的bootsect

和setup

模組。後面setup

程式將會把system模組移動到記憶體起始處,這樣system

模組中**的位址也即等於實際的實體地址,便於對核心**和資料的操作。圖3-1

清晰地顯示出linux

系統啟動時這幾個程式或模組在記憶體中的動態位置。其中,每一豎條框代表某一時刻記憶體中各程式的映像位置圖。在系統載入期間將顯示資訊"loading..."

。然後控制權將傳遞給boot/setup.s

中的**,這是另乙個實模式組合語言程式。

啟動部分識別主機的某些特性以及vga

卡的型別。如果需要,它會要求使用者為控制台選擇顯示模式。然後將整個系統從位址0x10000

移至0x0000

處,進入保護模式跳轉至系統的餘下部分(在0x0000

處)。此時所有32

位執行方式的設定啟動被完成

: idt

、gdt

以及ldt

被載入,處理器和協處理器也已確認,

分頁工作也設定好了;最終呼叫init/main.c

中的main()

程式。上述操作的源**是在boot/head.s中的,這可能是整個核心中最有訣竅的**了。注意如果在前述任何一步中出了錯,計算機就會死鎖。在作業系統還沒有完全運轉之前是處理不了出錯的。

為什麼不把系統模組直接載入到實體地址0x0000

開始處而要在setup

程式中再進行移動呢?這是因為在setup程式**開始部分還需要利用rom bios

中的中斷呼叫來獲取機器的一些引數(例如顯示卡模式、硬碟參數列等)。當bios

初始化時會在物理記憶體開始處放置乙個大小為0x400

位元組(1kb)

的中斷向量表,因此需要在使用完bios

的中斷呼叫後才能將這個區域覆蓋掉。

linux0 11 引導啟動程式目錄boot 分析

boot 包含三個彙編檔案 bootsect.s,setup.s,head.s。bootsect.s程式是磁碟引導塊程式,編譯後會駐留在磁碟的第乙個扇區中 引導扇區,0磁軌,0磁頭,第乙個扇區 在pc加電rom bios自檢後,將被bios載入到記憶體0x7c00處執行。setup.s程式主要用於讀...

linux啟動引導程式配置檔案

lilo etc lilo.conf grub boot grub menu.lst 系統啟動檔案核指令碼 主啟動控制檔案 etc inittab sysv啟動指令碼的位置 etc init.d etc rc.d init.d或 etc rc.d sysv啟動指令碼鏈結的位置 etc init.d ...

Linux0 12引導啟動程式

1.從系統加電起所執行程式的順序 rom bios bootsect.s setup.s head.s main.c 其中,head.s和main.c都屬於system模組 main屬於初始化程式,這裡不講 2.幾個程式的比較 程式名位置 語言rom bios rombootsect.s boot ...