三十天自制操作系統(tǒng)(9)

第21天

前面講到了運(yùn)行應(yīng)用程序時(shí)由于段地址的原因出錯(cuò)。段地址應(yīng)該由操作系統(tǒng)指定炼杖,對于應(yīng)用程序來講是沒有段地址的概念讨阻,對于應(yīng)用程序來說main程序就是地址為0的地方。操作系統(tǒng)把應(yīng)用程序裝載進(jìn)內(nèi)存的時(shí)候指定了段地址庄蹋,并注冊進(jìn)GDT中瞬内。因此如果操作系統(tǒng)要訪問應(yīng)用程序的數(shù)據(jù)就需要把操作系統(tǒng)給應(yīng)用程序裝載的地址 + 應(yīng)用程序的偏移地址。

第一步把操作系統(tǒng)給應(yīng)用程序分配的內(nèi)存地址保存在內(nèi)存中限书,然后執(zhí)行應(yīng)用程序的時(shí)候訪問應(yīng)用程序的數(shù)據(jù)時(shí)候再將應(yīng)用程序傳遞過來的地址 + 給應(yīng)用程序分配的首地址虫蝶。

接下來我們要想辦法用C語言寫應(yīng)用程序。如果可以用C語言寫應(yīng)用程序那么應(yīng)用程序的應(yīng)該是這個(gè)樣子的:

void api_putchar(int c);
void HariMain(void)
{
  api.putchar("A");
  return;
}

上面的這段代碼我們保存到a.c文件中倦西。我們一步步來能真,先創(chuàng)建一個(gè)api_putchar函數(shù)。

GLOBAL  _api_putchar
_api_putchar:   ; void api_putchar(int c);
MOV     EDX,1
MOV     AL,[ESP+4]      ; c
INT     0x40
RET

這里的api_putchar需要與a.c的編繹結(jié)果進(jìn)行連接扰柠。而且make之后也不能直接運(yùn)行粉铐,而要在生成的a.hrb文件的前6個(gè)字符修改為eb, 16, 00, 00, 00, cb。這6字節(jié)的翻譯成匯編語言就是call 0x1b, retf卤档。這樣就能直接運(yùn)行了蝙泼。

其實(shí)說到底所謂的應(yīng)用程序生成的機(jī)器碼為什么要鏈接,怎么鏈接劝枣,我也不知道汤踏,還有為什么鏈接之后還要修改前6個(gè)字節(jié)才能運(yùn)行書上沒有仔細(xì)講,算了以后再找機(jī)會研究舔腾,這里先這樣繼續(xù)學(xué)下去溪胶。

下面講操作系統(tǒng)的安全。我們的操作系統(tǒng)目前還沒有自我保護(hù)的能力稳诚,像DOS一樣隨便一個(gè)應(yīng)用程序都可以改寫操作系統(tǒng)所占有內(nèi)存空間的數(shù)據(jù)哗脖,直接導(dǎo)致了系統(tǒng)的崩潰。

為了防止這樣的情況發(fā)生扳还,就需要使用操作系統(tǒng)的功能才避,將應(yīng)用程序的數(shù)據(jù)段、代碼段與操作系統(tǒng)的數(shù)據(jù)段普办、代碼段分開工扎,使應(yīng)用程序無法訪問系統(tǒng)段里的數(shù)據(jù)。目前先給應(yīng)用程序分配64KB的空間衔蹲。

操作系統(tǒng)代碼段 2*8
操作系統(tǒng)數(shù)據(jù)段 1*8
應(yīng)用程序代碼段 1003*8
應(yīng)用程序數(shù)據(jù)段 1004*8

現(xiàn)在理一下應(yīng)用程序執(zhí)行的流程:1、輸入應(yīng)用程序?qū)?yīng)的文件名呈础;2舆驶、操作系統(tǒng)搜索軟盤中的文件,相符的話將當(dāng)前執(zhí)行的代碼跳到應(yīng)用程序中而钞;3沙廉、應(yīng)用程序如果調(diào)用api_putchar,那么就執(zhí)行0x40號中斷臼节,中斷處理程序已經(jīng)被注冊為_asm_hrb_api函數(shù)撬陵;4珊皿、這個(gè)中斷函數(shù)中會調(diào)用_hrb_api函數(shù);應(yīng)用程序就這樣執(zhí)行完畢巨税。

由于現(xiàn)在引入了應(yīng)用程序?qū)S械拇a段和數(shù)據(jù)段蟋定,所以在每個(gè)流程之前都要進(jìn)行切換段選擇器。上面的第2步中草添,跳到應(yīng)用程序之前驶兜,應(yīng)把操作系統(tǒng)的寄存器保存在內(nèi)存中,然后將應(yīng)用程序?qū)?yīng)的段地址切換進(jìn)來远寸。如果應(yīng)用程序調(diào)用api抄淑,那么在中斷處理程序_asm_hrb_api中應(yīng)先將應(yīng)用程序?qū)?yīng)的寄存器保存起來,然后再將操作系統(tǒng)的寄存器值恢復(fù)回去驰后,再進(jìn)入到第4步肆资,第4步執(zhí)行完畢后馬上將應(yīng)用程序?qū)?yīng)的寄存器的值恢復(fù)。

由于我們引入了應(yīng)用程序?qū)?yīng)的數(shù)據(jù)段灶芝,因此應(yīng)用程序無法讀取操作系統(tǒng)使用的內(nèi)存單元郑原,對于操作系統(tǒng)掌握的資源,應(yīng)用程序只能以api的方式進(jìn)入訪問监署,而且訪問完之后馬上又切換回應(yīng)用程序的內(nèi)存颤专。保護(hù)了操作系統(tǒng)的安全。

如果應(yīng)用程序訪問了他不該訪問的內(nèi)存單元钠乏,操作系統(tǒng)應(yīng)該拒絕執(zhí)行這條指令(上面已經(jīng)完成)栖秕,再強(qiáng)制結(jié)序程序。

要想強(qiáng)制結(jié)束程序晓避,只要在中斷號0x0d中注冊一個(gè)函數(shù)既可簇捍。當(dāng)應(yīng)用程序試圖破壞操作系統(tǒng)、或者違背操作系統(tǒng)的設(shè)置時(shí)俏拱,就會自動(dòng)產(chǎn)生0x0d中斷暑塑,因此該中斷也稱為異常。

0x0d中斷函數(shù)強(qiáng)制結(jié)束應(yīng)用程序的方法就是將所有的寄存器恢復(fù)到開始執(zhí)行應(yīng)用程序的狀態(tài)之后返回锅必。如果應(yīng)用程序中直接將段寄存器賦值事格,也就是將ds賦值為操作系統(tǒng)的段選擇符,那么應(yīng)用程序還是能訪問操作系統(tǒng)控制的內(nèi)存搞隐。

在X86的CPU中如果將訪問權(quán)限加上0x60的話驹愚,就可以將段設(shè)置為應(yīng)用程序用,這里候CPU會認(rèn)為當(dāng)前正在運(yùn)行應(yīng)用程序劣纲,那么存入操作系統(tǒng)用的段地址就會產(chǎn)生異常逢捺。

如果用這種方法就必須在TSS中注冊操作系統(tǒng)用的段地址和esp中。我們在定義TSS結(jié)構(gòu)體的時(shí)候癞季,第2個(gè)字段為esp0,第3個(gè)字段為ss0劫瞳,我們就杷操作系統(tǒng)的段地址和esp保存到這2個(gè)字段中倘潜。如果我們把程序的訪問權(quán)限加上0x60的話,那么操作系統(tǒng)就不能call這個(gè)程序也不能jmp到這個(gè)程序志于。那么我們怎么讓操作系統(tǒng)運(yùn)行這個(gè)應(yīng)用程序呢涮因?答案是要使用retf。我們先把應(yīng)用程序的cs,eip,ss,esp保存到棧中恨憎,然后執(zhí)行ret指令蕊退,那么CPU就會以為已經(jīng)call過了現(xiàn)在要返回原來的程序,把棧中的值賦給相應(yīng)的寄存器憔恳,然后CPU就繼續(xù)執(zhí)行指令瓤荔。只是這次我們事先把運(yùn)行應(yīng)用程序所需要的放到棧中,執(zhí)行這個(gè)指令的時(shí)候钥组,實(shí)際上是跳到了應(yīng)用程序之中了输硝。

那么我們?nèi)绾尾拍軓膽?yīng)用程序中返回呢?我們另外寫一個(gè)用于結(jié)束應(yīng)用程序的api程梦,api_end函數(shù)点把,并規(guī)定為這個(gè)操作系統(tǒng)寫的應(yīng)用程序都在要程序的最后調(diào)用這個(gè)api才能正常結(jié)束。我看了本章屿附,大概就是講了這些郎逃。而且在定義api中斷的時(shí)候也需要把這個(gè)中斷的訪問權(quán)限加上0x60,表示這是操作系統(tǒng)給應(yīng)用程序使用的中斷挺份。

這一個(gè)章節(jié)之前講了很多操用系統(tǒng)運(yùn)行應(yīng)用程序時(shí)應(yīng)該進(jìn)行的段寄存器切換褒翰,而在使用應(yīng)用程序訪問權(quán)限的時(shí)候,卻突然CPU能自動(dòng)切換了匀泊,據(jù)我推測就該是如果把段的訪問權(quán)限改成應(yīng)用程序之后优训,那么CPU會自動(dòng)切換不同訪問權(quán)限程序段之間的段寄存器切換問題。

看到這里可能明白很多對操作系統(tǒng)的疑惑各聘。以前寫應(yīng)用程序的時(shí)候以為操作系統(tǒng)的api和一些第三方庫是一樣的揣非。其實(shí)不然,操作系統(tǒng)肯定設(shè)置了訪問權(quán)限躲因。操作系統(tǒng)在開放api的時(shí)候肯定也是以中斷的方式開放的早敬,在開放中斷的方式開放的。其它的比如鍵盤大脉、鼠標(biāo)搁嗓、定時(shí)器之類的中斷操作系統(tǒng)肯定不會直接開發(fā)而是以api的方式讓應(yīng)用程序使用。這一章的很多東西感覺還是不太懂箱靴,但是又感覺學(xué)到了很多東西,這感覺真好荷愕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衡怀,一起剝皮案震驚了整個(gè)濱河市棍矛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抛杨,老刑警劉巖够委,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異怖现,居然都是意外死亡茁帽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門屈嗤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來潘拨,“玉大人,你說我怎么就攤上這事饶号√罚” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵茫船,是天一觀的道長琅束。 經(jīng)常有香客問我,道長算谈,這世上最難降的妖魔是什么涩禀? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮然眼,結(jié)果婚禮上艾船,老公的妹妹穿的比我還像新娘。我一直安慰自己罪治,他們只是感情好丽声,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著觉义,像睡著了一般雁社。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晒骇,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天霉撵,我揣著相機(jī)與錄音,去河邊找鬼洪囤。 笑死徒坡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘤缩。 我是一名探鬼主播喇完,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剥啤!你這毒婦竟也來了锦溪?” 一聲冷哼從身側(cè)響起不脯,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刻诊,沒想到半個(gè)月后防楷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡则涯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年复局,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粟判。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亿昏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浮入,到底是詐尸還是另有隱情龙优,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布事秀,位于F島的核電站彤断,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏易迹。R本人自食惡果不足惜宰衙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睹欲。 院中可真熱鬧供炼,春花似錦、人聲如沸窘疮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闸衫。三九已至涛贯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔚出,已是汗流浹背弟翘。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骄酗,地道東北人稀余。 一個(gè)月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像趋翻,于是被迫代替她去往敵國和親睛琳。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容