【OS学习笔记】十九 保护模式六:保户模式下操作系统内核如何加载用户程序并运行
上一篇文章學(xué)習(xí)了保戶模式下如何進(jìn)行內(nèi)存保護(hù) 與 別名段的意義與作用:點(diǎn)擊鏈接查看上一篇文章:點(diǎn)擊鏈接
本文接著學(xué)習(xí),在保護(hù)模式下,內(nèi)核是如何加載用戶程序并運(yùn)行的。其實(shí)這與在實(shí)模式下很像,只不過現(xiàn)在保護(hù)迷失多了個(gè)描述符而已。所以盡量先參考實(shí)模式下的加載過程,再來閱讀本篇文章或許會更好。點(diǎn)擊鏈接查看實(shí)模式的加載過程:實(shí)模式下內(nèi)核加載用戶程序到內(nèi)存
1、用戶程序的加載和重定位
1.1 用戶程序的結(jié)構(gòu)
所有操作系統(tǒng)的可執(zhí)行文件都包括文件頭(這個(gè)文件頭其實(shí)是由連接器構(gòu)造的)。然后就是各種段,包括數(shù)據(jù)段,代碼段等。
在用戶程序的頭部是一些重定位需要的信息。比如段的信息,以及符號的信息。段的信息在之前的實(shí)模式中講的很清楚了。
符號的信息的話,內(nèi)核要求,用戶程序必須在頭部偏移量位0x28 的地方構(gòu)造一個(gè)表格,并在表格中列出所有要用到的符號名。內(nèi)核會分析這個(gè)表格,并將這里面的符號全部換成相應(yīng)的內(nèi)存地址,即將函數(shù)的地址換過來。
這里面當(dāng)然包括程序中所有的函數(shù),包括系統(tǒng)調(diào)用的函數(shù)。
程序自己本身定義的函數(shù)地址好找,在加載的時(shí)候,加載器重定位代碼段之后,即得到了所有的函數(shù)地址,將符號表里出現(xiàn)的函數(shù)全部換成該相應(yīng)函數(shù)代碼的地址即可。
但是系統(tǒng)調(diào)用函數(shù)的話,地址在哪里呢? 其實(shí)跟用戶程序一樣,內(nèi)核也會在某一個(gè)地方定義一個(gè)符號表,這個(gè)符號表里存放的都是內(nèi)核的系統(tǒng)函數(shù),專門供用戶程序調(diào)用的。當(dāng)用戶程序調(diào)用系統(tǒng)函數(shù),內(nèi)核就會對比內(nèi)核的符號表與用戶程序的符號表,將相應(yīng)的內(nèi)核函數(shù)的地址傳送給用戶程序的相應(yīng)符號處。
這其實(shí)就是符號重定位的一個(gè)過程。當(dāng)然在這之前已經(jīng)做好了符號解析。符號解析的意思就是代碼中相應(yīng)的符號的定義與引用處進(jìn)行一個(gè)關(guān)聯(lián)。
1.2 計(jì)算用戶程序的扇區(qū)數(shù)
了解了程序的結(jié)構(gòu),當(dāng)然就是要從硬盤上讀取用戶程序。那么首先要計(jì)算用戶程序的大小,因?yàn)樽x取硬盤是按照扇區(qū)為單位的,所以要計(jì)算用戶程序的扇區(qū)數(shù)。
這從用戶程序頭即可得出結(jié)果。
1.3 簡單的動態(tài)內(nèi)存分配
計(jì)算好用戶程序的扇區(qū)數(shù)后,就是將用戶程序讀取到內(nèi)存中了。那么就需要進(jìn)行內(nèi)存的分配工作。這個(gè)具體的流程也參考實(shí)模式下的過程。
1.4 段的重定位和描述符的創(chuàng)建
其實(shí)到這里才與實(shí)模式有一點(diǎn)區(qū)別,上述幾個(gè)步驟與實(shí)模式完全一樣。
并且段的重定位過程也與實(shí)模式相同,只不過加了個(gè)描述符。
將用戶程序讀到內(nèi)存中后,現(xiàn)在就需要根據(jù)用戶程序的頭部來創(chuàng)建段描述符。
安裝完用戶程序頭部的段描述符后,將該段的選擇子寫回到用戶程序頭部。供用戶程序在接管處理器控制權(quán)后使用。
頭部的段安裝創(chuàng)建好后。接下來是安裝和創(chuàng)建數(shù)據(jù)段與代碼段等的段描述符,然后也將相應(yīng)的段選擇子寫回到用戶程序頭部供后面用戶程序使用
唯一不同的是棧段。棧段不需要用戶程序自己提供,而是有內(nèi)核動態(tài)分配。內(nèi)核分配站空間時(shí)每次都是以4KB位單位的。同理,棧段描述符創(chuàng)建好之后也需要將段選擇子寫回到用戶程序頭部供后面用戶程序使用。
1.5 重定位用戶程序內(nèi)的符號地址
符號的重定位,主要包括自己程序定義的函數(shù)與變量符號的重定位,以及系統(tǒng)調(diào)用函數(shù)的重定位。這在1.1節(jié)的程序結(jié)構(gòu)中已經(jīng)說過,比較容易理解。
2 用戶程序的執(zhí)行
在經(jīng)過上面的:
- 讀取用戶程序并分配內(nèi)存
- 重定位段并創(chuàng)建段描述符
- 重定位符號
后,下面就是運(yùn)行程序了。一般是使用一個(gè)段間遠(yuǎn)轉(zhuǎn)移指令jmp后,跳轉(zhuǎn)到用程序的入口函數(shù)地址。
3、總結(jié)
本篇文章寫的不是很詳細(xì),只是說出了大概過程。詳細(xì)過程參考書籍與實(shí)模式的那篇文章。
筆記記得不是很全,如果有不懂的可以加我聯(lián)系方式一起交流。
學(xué)習(xí)探討加個(gè)人:
 qq:1126137994
 微信:liu1126137994
總結(jié)
以上是生活随笔為你收集整理的【OS学习笔记】十九 保护模式六:保户模式下操作系统内核如何加载用户程序并运行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: visual studio 2015安装
- 下一篇: 添加思源黑体字体
