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