用純C語言能不能寫乙個作業系統?如果有編譯器支援,是不是就可以這麼做?

時間 2021-05-11 16:54:53

1樓:Xinyu Tan

作業系統不侷限於x86吧。。。就算是就算是的話比如 uCOS啥的麼。微控制器基於C語言的作業系統好多呢~~~不過如果題主的限定了不讓用彙編的話先佔式的核心可能有問題畢竟C語言直接操作堆疊和 context switch有點兒困難。。。

不過做個簡單的協作式核心,或者用 protothread (自行谷歌)做個round-robin scheduling 的核心不用彙編合適可以的。

2樓:Belleve

bootloader 顯然得用彙編,除非你去改編譯器,比如實現個 org?

org07c00h

movax,cs

movds,ax

moves,ax

call

Disp

Strjmp

$DispStr:

movax

,BootMessage

movbp,ax

movcx,16

movax

,01301h

movbx

,000ch

movdl,0

int10h

retBootMessage:

db"Hello, OS!"

times

510-($

-$$)db

0dw0xaa55

有時彙編也得玩花樣,比如 linux 裡面似乎就是,剛進入保護模式的第乙個 jmpl 是用 db 硬塞進去的,因為那條指令是在 16 位的區段,但是內容必須是 32 位的

3樓:北極

純C是純到什麼程度?

如果必須用C語言的運算子之類的,不允許任何內聯彙編,包括任何二進位制形式的彙編的話,純C肯定做不到。

比如:C語言裡的中斷怎麼處理?x86的cr0暫存器怎麼操作?如何開啟A20位址線?等等。

這些都必須依賴一些彙編來實現,組合語言中的int/in/out指令、控制暫存器等在標準C裡都是無法直接用運算子實現的。

如果編譯器支援是指支援到什麼程度?

如果編譯器提供庫支援,這種支援能到什麼程度呢?如果編譯器提供庫能操作cr0,能in/out,那麼這種庫本質上和直接使用彙編又有什麼兩樣?

本質上,純C就是乙個偽命題,因為C語言是編譯型的語言,最終形態必然是彙編指令,所以使用C語言和直接使用彙編,沒有太明顯的界線。

我自己曾經使用nasm+turbo C(2.0)+tasm等整合過乙個工具,使用純C寫乙個FAT16的DBR loader,至少原始碼看上去是純C的,但呼叫的某些函式還是使用了彙編做了預先的編譯,生成了庫。

但要做乙個完整的作業系統,我認為真正的「純C」不可能,而如果對C語言做足夠多的改造,那麼它還算「C語言」嗎?

4樓:楊超

用純C寫,還有編譯器支援,這和寫機器碼或者彙編沒有本質區別。唯一區別是:C和彙編可能不是全部對應。即,C幾乎都可變成彙編,反之不依然。

C 如何編譯出乙個不需要作業系統的程式?

FledgeXu 如果拋棄作業系統執行編譯好的 C 程式,執行它的過程和執行乙個作業系統基本上沒什麼區別了。首先你要先寫彙編,從實模式轉化為保護模式,然後讀取硬碟特定扇面 扇區 磁軌上的32位 C 程式,載入記憶體後並執行。在編寫 C 程式的過程也有很多要注意的地方,首先你無法再使用標準庫了,因為標...

能不能寫乙個道士和妖怪的小故事?

一塊神奇的扣肉 她是妖,我見到她的第一眼就看出來了。但是她不知道我是個道士,甚至不知道什麼是道士。我是收了人家銀子才來藥鄉的。這個地方本來不叫藥鄉,只是因為每戶人家都賣藥才叫這個名字。僱我來的那戶人家少爺離奇失蹤,懷疑跟藥鄉有關,給了我一大筆錢讓我來查。藥鄉除了每戶人家都賣藥之外再沒什麼奇怪的了。硬...

能不能寫乙個人設帶感的故事

白筱易 總感覺越寫越偏題,太草 她的夢隱晦 堅硬卻並不痛苦。所以楊雪冬決定從這樣無聊的夢裡醒來,旁邊的手機顯示的時間是6 20,不算早,她提前把鬧鐘關了。今天是2021年3月11日,是她把喜歡林志華一輩子提進日程的第24天。楊雪冬並不認為林志華是個有意思的人,要若把人的有趣程度劃成十級,那他一定是得...