一步步编写操作系统 47 48 二进制程序运行方式
操作系統并不是在功能上給予用戶的支持,這種支持是體現在機制上。也就是說,單純的操作系統,用戶拿它什么都做不了,用戶需要的是某種功能。而操作系統僅僅是個提供支持的平臺。
雖然我們是模仿linux來寫一個黑屏白字的系統,但如果沒有windows的話,估計當今這個世界將會失去70%以上的光芒。由于有了操作系統的支持,我們可以安裝一些軟件,也就是應用程序,比如安裝了QQ或一些其它的即時通訊工具,這樣我們就能夠給同其他人聊天。
所以,操作系統并不能直接幫大家做什么,但大家想做什么的時候,操作系統能提供最大限度的支持。
任何程序都需要被載入到內存后才能運行,這是cpu等其它硬件的運行機制決定的,我們若在該硬件系統上運行程序,不得不遵守這樣那樣的約束。應用程序是獨立于操作系統的,它不會像操作系統那樣,含著金鑰匙,一出生就直接在內存中。它們通常是位于磁盤等外存設備中,在使用時,需要從外存中將其調入到內存后才行。
如何去加載用戶程序呢?
操作系統是程序、是軟件,用戶程序也是軟件,用一個程序去調用另一個程序一點難度都沒有,最最簡單的辦法,就是用jmp或call指令。我們的bios就是這樣調用mbr,我們的mbr就是這樣調用loader的。但大家還記得不,bios調用mbr,mbr的地址是0x7c00,mbr調用loader,loader的地址是0x900。這兩個地址是寫死的,也就是說,我們目前的方法是很不靈活的,調用方需要提前和被調用方約定調用地址。
有沒有一種靈活的方法讓程序的加載地址不那么固定呢?肯定有,不過突然想起周一要匯報工作,今晚加班,下節再說。
?
接上節,有沒有一種靈活的方法讓程序的加載地址不那么固定呢?
顯然是有的,由于每個程序是單獨存在的,所以程序的入口地址信息需要與程序綁定,最簡單的辦法就是在程序文件中專門騰出個空間來寫入這些程序的入口地址,主調程序在該程序文件的相應空間中將該程序的入口信息讀出來,將其加載到相應的入口地址,跳轉過去就行了。當然不僅僅只寫入程序入口地址,能寫的東西很多,比如為了給程序分配內存,至少還得需要知道程序的尺寸大小。但在哪里寫入程序的入口地址呢?這便是文件頭的由來,在程序文件的開頭部分記載這類信息,而程序文件中除文件頭外其余的部分則是之前的程序體。這樣一來,原先的純二進制可執行文件加上新的文件頭,就形成了一種文件格式。不僅文件是這樣,很多其它傳輸協議也是采用文件頭header+文件體body的形式,如郵件傳輸協議和http傳輸協議。在現實生活中也有這樣的例子,比如咱們坐火車的時候,按理說,只要火車停在能讓咱們看到的地方,咱們就能直接上火車了。但現實中不可能讓所有火車擺在咱們面前,所以我們在乘坐火車時,都是進站后先要查看大屏幕上的列車時刻表,從中找到在哪個候車室等候上車。其中,列車時刻表就相當于文件頭,我們從中找到上火車的入口,而火車則相當于文件體。
在程序中,程序頭(也就是文件頭)是用來描述程序的布局等信息,它屬于信息的信息,也就是元數據。包含程序頭的程序文件示意如圖:
由于程序文件中包含了程序頭,好處是程序的入口地址等信息不需要寫死,調用方中的調用代碼可以變得通用,根據實際情況加載便可。但不好的地方是,這些元信息不是代碼,故不應該將其放在cpu上“執行”,所以程序就不再是純粹的二進制可執行文件了,不像之前咱們用nasm默認編譯的可執行文件(里面全是程序本身的指令和數據)那樣純粹。所以,將這種具有程序頭格式的程序文件從外存讀入到內存后,從該程序文件的程序頭中讀出入口地址,需要直接跳進入口地址執行,跨過程序頭才行。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 47 48 二进制程序运行方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卖房后第二天就出拆迁公告!浙江男子崩溃:
- 下一篇: 一步步编写操作系统 57 门、调用门与R