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