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

時間 2021-05-05 19:50:29

1樓:FledgeXu

如果拋棄作業系統執行編譯好的 C 程式,執行它的過程和執行乙個作業系統基本上沒什麼區別了。

首先你要先寫彙編,從實模式轉化為保護模式,然後讀取硬碟特定扇面-扇區-磁軌上的32位 C 程式,載入記憶體後並執行。

在編寫 C 程式的過程也有很多要注意的地方,首先你無法再使用標準庫了,因為標準庫的功能基本上都是由作業系統提供的,所以你只能用彙編實現你所需要的功能然後和 C 程式進行連線。

當然編譯過程也會變得不同,因為在特定平台編譯出的可執行二進位制檔案會有特定的格式,使得編譯出的程式在二進位制層面會有多餘的資料,這些資料在缺少作業系統的情況下是完全無用,所以你在編譯的過程中必須編譯成無格式的二進位製包,你可以選擇用 gcc 等生成組合語言,然後用彙編器編譯成對應32或64位平台的 Raw 檔案,然後和你寫的彙編庫進行鏈結。

寫出乙個不需要作業系統的 C 程式的主要步驟差不多如此。

2樓:

efi executable binary算嗎?算的話分分鐘就學會了,然後新增到efi boot entry裡,開機直接啟動,完美

#include

#include

EFI_STATUS

EFIAPI

efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)

3樓:

基本的bios還是需要的吧?

看看自己動手編寫作業系統這種,非常適合入門理解只要彙編寫了boot之後,都差不多

其實普通編譯器編譯出來的只要有引導,是可以執行的。

也就是作業系統的執行,跟exe執行一模一樣。

4樓:Gavin

不依賴作業系統的話,程式自己就需要有作業系統的一些功能。比如自己把自己載入起來,自己控制輸入輸出系統。麻煩無意義。學習一下還行。

5樓:徐小維

想要達到完全不依賴OS也不是不行,嚴格說在執行流踏入entry的第一條指令開始,只要你不call系統呼叫,不執行CPU的特權指令,不妨問全域性變數以外的堆空間,同時保證不能有別的外設發出中斷,不能執行太久超過時間片等等等等,你就可以達成不依賴OS的願望了,以上禁忌有一項違背,那麼OS立馬介入進核心態接管控制權,你的不依賴OS的願望就破滅了(斜眼微笑)……至於你的程式是怎麼開始又是怎麼結束的,"你既想在我的地盤執行又想不受我的管束,這讓我很為難啊"。綜上所述,在乙個OS主導的環境中想要不依賴OS,真的很難。

如果你是在裸機上執行,那麼@馮東大神已經說的很明白了,就不是你想不想依賴OS的問題了,壓根沒有自行車啊。這個世界本沒有OS,你第乙個來你就是OS。如果你的程式在引導盤的0頭0道1扇區,OS算哪根蔥;如果你的程式在ROM的FFFF:

0000位址(也就是實體地址0xFFFF0),那麼恭喜你,BIOS都得對你俯首稱臣啊。(以上調侃僅僅適用於x86結構IBMPC相容機,原諒我比較老土)。

至於是否需要特定編譯器這個問題,忘了他吧-_-手機碼字,木有圖湊合看吧

6樓:李家豪

作業系統本身就不需要作業系統...

當然更嚴格一點,BIOS本身就不需要作業系統。

只需要配置交叉編譯器,然後自己寫乙個鏈結指令碼指定輸出格式為 flat binary 就可以了。

7樓:yvbbrjdr

gcc就行,不需要其它編譯器。C編譯出的二進位制檔案本來就可以裸執行。。只是你沒法載入啊。。。

首先要用彙編寫乙個bootloader把二進位制程式拷進記憶體,然後把PC指過去(jmp)。

參考文獻:《Orange's乙個作業系統的實現》

8樓:Femx

建議題主去看看uboot,其實乙個簡單的不依賴作業系統的c程式就是乙個簡單的bootloader。當然僅僅靠c,是完成不了的。因為還要對cpu及其他的硬體外設進行初始化。

必須用彙編來初始化c語言環境。

9樓:

參考《30天自製作業系統》

你只需要修改硬碟的資料,讓cpu啟動後執行你寫的程式就可以了。當然,你的程式最好是靜態編譯的,不包含任何動態庫的。

10樓:靈劍

C語言的執行本身來說是不需要作業系統的,在核心模式下面,它有直接訪問物理記憶體的能力,你可以直接把乙個整形的位址強制轉換成指標,來寫入某些特定的記憶體位址。某些特殊指令則需要直接嵌入彙編。一般將這些特殊指令封裝成函式來呼叫。

通過專用的CPU指令(x86架構)或者裝置對映到記憶體(MIPS之類)的方式,可以直接操作硬體。以前DOS下面實模式程式設計的時候還有一些寫在BIOS當中的程式,可以用INT指令呼叫(相當於觸發軟中斷),不知道現在還有沒有了。

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

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

打野是不是乙個最不需要操作的位置?

打野是最需要操作的。你去抓人,要知道雙方有什麼技能,如何躲避對方技能如何配合己方隊友。如何越塔如何成功gank細節很多。 小鹿鹿的人 五個人,誰都不能坑,因為誰坑了,就意味著另外四個人要來給你填坑,因為大家不想輸,打野位有多重要?我們一般稱這個位置為 打野爸爸 魔王卡奇雲德大人 我覺得打野意識是要大...

如何從零開始寫乙個簡單的作業系統?

後廠村村民甲 絕對的從零寫估計太難了,因為涉及的東西太多,光是bootloader細節就超級多,比如有些BootLoader的樣例中要用BIOS提供的指令去讀簡易的檔案系統,一般來說掌握這些的人,大概率比較熟悉os kernal了,除非閒得蛋疼,否則寫那玩意兒幹啥。所以,簡單的方法就是先借用乙個現成...