Linux從頭學(xué)10:三級跳過程詳解-從?bootloader?到?操作系統(tǒng),再到應(yīng)用程序
作 者:道哥,10 年的嵌入式開發(fā)老兵。目錄公眾號:【IOT物聯(lián)網(wǎng)小鎮(zhèn)】,專注于:C/C 、Linux操作系統(tǒng)、應(yīng)用程序設(shè)計、物聯(lián)網(wǎng)、單片機和嵌入式開發(fā)等領(lǐng)域。 公眾號回復(fù)【書籍】,獲取 Linux、嵌入式領(lǐng)域經(jīng)典書籍。
轉(zhuǎn) 載:歡迎轉(zhuǎn)載文章,轉(zhuǎn)載需注明出處。
-
bootloader 跳轉(zhuǎn)到操作系統(tǒng)
-
操作系統(tǒng)跳轉(zhuǎn)到應(yīng)用程序
-
應(yīng)用程序調(diào)用操作系統(tǒng)中的函數(shù)
bootloader 跳轉(zhuǎn)到操作系統(tǒng)
在上一篇文章中,討論了bootloader在進(jìn)入保護模式之后,在地址0x0001_0000處創(chuàng)建了全局描述符表(GDT),表中創(chuàng)建了3個段描述符:
注意:
- 在 GDT 中為操作系統(tǒng)程序中的三個段,建立相應(yīng)的描述符;
- 把每一個段的描述符索引號,寫回到操作系統(tǒng)程序的 header 中;
操作系統(tǒng)的 header 布局
既然header需要作為媒介,來接收bootloader往其中寫入段索引號,所以bootloader與OS就要協(xié)商好,寫在什么位置?
建立操作系統(tǒng)的三個段描述符
bootloader把OS加載到內(nèi)存中之后,會解析OS的header中數(shù)據(jù),得到每個段的基地址以及界限。
PS:這里的示例只為操作系統(tǒng)創(chuàng)建了 3 個段描述符,實際情況也許有更多的段。OS段描述符建立之后,bootloader再把這3個段描述符在GDT中的索引號,填寫到OS的header中相應(yīng)的位置:
因此,把入口地址和索引號放在一起,有助于bootloader直接使用跳轉(zhuǎn)語句,進(jìn)入到OS的start標(biāo)記處開始執(zhí)行。
- 代碼段的索引號;
- 代碼的入口地址;
操作系統(tǒng)跳轉(zhuǎn)到應(yīng)用程序
從現(xiàn)代操作系統(tǒng)來看,這個標(biāo)題是有錯誤的:
以上這些信息,都以段描述符的形式,創(chuàng)建在GDT中。
- 代碼段的基地址、界限、類型和權(quán)限等信息;
- 數(shù)據(jù)段的基地址、界限、類型和權(quán)限等信息;
- 棧段的基地址、界限、類型和權(quán)限等信息;
- 操作系統(tǒng)把應(yīng)用程序讀取到內(nèi)存中的某個空閑位置;
- 操作系統(tǒng)分析應(yīng)用程序 header 部分的信息;
- 操作系統(tǒng)為應(yīng)用程序創(chuàng)建每一個段描述符,并且把索引號寫回到 header 中;
- 跳轉(zhuǎn)到應(yīng)用程序的入口地址,應(yīng)用程序從 header 中獲取到每個段索引號,設(shè)置好自己的執(zhí)行上下文(即:設(shè)置好各種寄存器);
應(yīng)用程序調(diào)用操作系統(tǒng)中的函數(shù)
這里的函數(shù)可以理解成系統(tǒng)調(diào)用,也就是操作系統(tǒng)為所有的應(yīng)用程序提供的公共函數(shù)。
對于第一個問題,所以Linux中通過中斷,提供一個統(tǒng)一的調(diào)用入口地址,然后通過一個寄存器來區(qū)分是哪一個函數(shù)。
- 如果操作系統(tǒng)提供的系統(tǒng)函數(shù)很多,應(yīng)用程序也很多,那么操作系統(tǒng)在加載每一個應(yīng)用程序時,豈不是要忙死了?而且應(yīng)用程序也不知道應(yīng)該保留多大的空間來存放這些系統(tǒng)函數(shù)的跳轉(zhuǎn)信息;
- 在執(zhí)行系統(tǒng)函數(shù)時,此時代碼段、數(shù)據(jù)段都是屬于操作系統(tǒng)的勢力范圍,但是?;泛蜅m斨羔樖褂玫娜匀皇菓?yīng)用程序擁有的棧,這樣合理嗎?
這就涉及到 x86 中復(fù)雜的特權(quán)級的相關(guān)內(nèi)容了,下一篇文章,我們就向這些細(xì)節(jié)問題繼續(xù)探索。
- 應(yīng)用程序雖然可以調(diào)用操作系統(tǒng)提供的函數(shù)了,但是操作系統(tǒng)如何對內(nèi)核代碼進(jìn)行保護?;
- Linux 為應(yīng)用程序建立內(nèi)部棧的底層支撐是什么?
從bootloader到操作系統(tǒng),再到應(yīng)用程序,這個三級跳的最簡流程就討論結(jié)束了。