一步步编写操作系统 42 用c语言编写内核
在這之前,我們一直用匯編語(yǔ)言直接與機(jī)器對(duì)話(huà),如果大家不知道這個(gè)世界上有高級(jí)語(yǔ)言的話(huà),我想大家也不會(huì)覺(jué)得寫(xiě)匯編代碼的過(guò)程很辛苦,哈哈,幸福確實(shí)是比較出來(lái)的。相對(duì)于匯編語(yǔ)言,用c 語(yǔ)言寫(xiě)內(nèi)核是非常爽的事,馬上我們就要步入內(nèi)核實(shí)踐中啦,所以現(xiàn)在和大伙兒聊聊c語(yǔ)言寫(xiě)內(nèi)核的體會(huì)。
通常,我們寫(xiě)的代碼都是直接編譯成可執(zhí)行文件,那是因?yàn)槲覀兪窃趯?xiě)用戶(hù)程序,操作系統(tǒng)為咱們提供了很多便利,所以編譯和鏈接一氣呵成,不需要咱們單獨(dú)再指定什么,編譯器也和操作系統(tǒng)達(dá)成了諸多約定,默默在后面為咱們做了大量的工作,比如程序編譯出來(lái)的虛擬起始地址通常是0x8048000左右。在有操作系統(tǒng)為咱們撐腰時(shí),我們確實(shí)不需要關(guān)注這些與業(yè)務(wù)邏輯無(wú)關(guān)的東西,只要專(zhuān)注于自己的工作就好啦。可如今,我們要用c語(yǔ)言寫(xiě)脫離操作系統(tǒng)的程序,這回咱們就不能再這么省心了,必須要自己指定程序的入口地址。
另外,我們之前開(kāi)發(fā)用戶(hù)程序,有大量的標(biāo)準(zhǔn)庫(kù)可以用,標(biāo)準(zhǔn)庫(kù)一般是系統(tǒng)調(diào)用的封裝,所以,表面上通過(guò)標(biāo)準(zhǔn)庫(kù)訪(fǎng)問(wèn)系統(tǒng)資源,本質(zhì)上是用系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)的。當(dāng)然如果大伙兒愿意,在用戶(hù)程序中也可以直接調(diào)用“系統(tǒng)調(diào)用”,在功能上這是允許的,因?yàn)橹袛嗝枋龇碇邢到y(tǒng)調(diào)用對(duì)應(yīng)的中斷描述符,它的權(quán)限是用戶(hù)程序可以訪(fǎng)問(wèn)的,否則就無(wú)法實(shí)現(xiàn)系統(tǒng)調(diào)用啦。就拿linux來(lái)說(shuō),它的系統(tǒng)調(diào)用是先往eax寄存器中寫(xiě)入系統(tǒng)調(diào)用號(hào),然后通過(guò)0x80中斷來(lái)實(shí)現(xiàn)的。我們可以用匯編語(yǔ)言寫(xiě)一個(gè)系統(tǒng)調(diào)用的代碼,用c 語(yǔ)言去調(diào)用它或者干脆直接在c語(yǔ)言中內(nèi)嵌匯編代碼。無(wú)論是采用哪種形式,匯編語(yǔ)言的部分都是諸如先用mov eax,xx的形式在eax寄存器中指定系統(tǒng)調(diào)用的功能號(hào),然后緊跟著使用中斷指令int 0x80來(lái)引發(fā)0x80中斷,從而觸發(fā)0x80對(duì)應(yīng)的中斷處理程序,由該中斷處理程序根據(jù)eax的內(nèi)容去執(zhí)行相應(yīng)的系統(tǒng)調(diào)用。雖然可以直接調(diào)用“系統(tǒng)調(diào)用”的功能,但不推薦這樣做,畢竟標(biāo)準(zhǔn)庫(kù)中為咱們考慮了很多優(yōu)化策略,通過(guò)標(biāo)準(zhǔn)庫(kù)訪(fǎng)問(wèn)系統(tǒng)資源比直接用系統(tǒng)調(diào)用效率更高。也許有同學(xué)不信這個(gè)邪,非要整出個(gè)效率更高的庫(kù),當(dāng)然這是非常可能的,可是標(biāo)準(zhǔn)庫(kù)考慮的不僅是效率,還有很多兼容規(guī)范在里面,所以它可能會(huì)為了規(guī)范而犧牲效率。除非為了某些個(gè)性化的應(yīng)用咱們才去寫(xiě)自己的庫(kù),否則還是不要企圖顛覆標(biāo)準(zhǔn)庫(kù)啦。標(biāo)準(zhǔn)庫(kù)可以說(shuō)是由世界上成千上萬(wàn)的超級(jí)大腦完成的,以咱們個(gè)人之力去和全世界的極客拼腦細(xì)胞,這是不科學(xué)的,不如把精力放在其它方面,好啦,我知道話(huà)又說(shuō)多啦^_^。
對(duì)于系統(tǒng)調(diào)用這些平時(shí)我們認(rèn)為理所當(dāng)然的功能,如今已經(jīng)成為了咱們的奢望。首先咱們本身是在寫(xiě)操作系統(tǒng)而不是用戶(hù)程序,操作系統(tǒng)不應(yīng)該再依賴(lài)于其它系統(tǒng)的功能,所以不能在咱們的程序(操作系統(tǒng))中再調(diào)用宿主操作系統(tǒng)的系統(tǒng)調(diào)用功能。其次,同一時(shí)刻只能有一個(gè)操作系統(tǒng)在運(yùn)行,咱們即使調(diào)用了0x80中斷,中斷描述符表里0x80對(duì)應(yīng)的中斷處理程序是咱們提供的,再也不存在宿主系統(tǒng)的代碼,相當(dāng)于咱們?cè)谡{(diào)用自己的中斷處理程序,而此時(shí)我們可能尚未準(zhǔn)備好相應(yīng)的中斷處理程序。如果系統(tǒng)調(diào)用不能用,也更不能用c標(biāo)準(zhǔn)庫(kù)啦,所以只能用c語(yǔ)言原生支持的語(yǔ)法結(jié)構(gòu)。不過(guò)以后我們會(huì)在實(shí)現(xiàn)內(nèi)核的過(guò)程中建立咱們自己的庫(kù),庫(kù)中會(huì)通過(guò)咱們自己的系統(tǒng)調(diào)用實(shí)現(xiàn)某些功能。
以上多說(shuō)了幾句有關(guān)系統(tǒng)調(diào)用的實(shí)現(xiàn),其實(shí)我是怕無(wú)法滿(mǎn)足好奇心強(qiáng)的同學(xué),很擔(dān)心僅僅一句“在脫離操作系統(tǒng)下寫(xiě)程序不能使用系統(tǒng)調(diào)用”讓更多的同學(xué)感到不解。如果我解釋得還不夠,咱們以后會(huì)在實(shí)現(xiàn)系統(tǒng)調(diào)用的時(shí)候有所了解。
總結(jié)
以上是生活随笔為你收集整理的一步步编写操作系统 42 用c语言编写内核的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 华硕推出15.6寸OLED便捷式显示器:
- 下一篇: 挖矿崩盘:新老显卡无奈疯狂抛售