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