我的問題源於我對低級系統編程缺乏經驗(特別是在操作系統的實現級別)。可執行文件包含操作系統的一些信息 - 例如,它必須在啓動時動態鏈接到哪些庫。因此編譯器在編譯文件時將這些依賴關係放在可執行文件的適當位置。所以我們編譯給定系統的代碼。但是,我們如何編譯構成系統的代碼呢?編譯器編譯哪個系統的代碼?開發C編程語言是爲了幫助編寫UNIX操作系統,但是說Linux呢?可執行文件格式
對不起雞蛋問題。
我的問題源於我對低級系統編程缺乏經驗(特別是在操作系統的實現級別)。可執行文件包含操作系統的一些信息 - 例如,它必須在啓動時動態鏈接到哪些庫。因此編譯器在編譯文件時將這些依賴關係放在可執行文件的適當位置。所以我們編譯給定系統的代碼。但是,我們如何編譯構成系統的代碼呢?編譯器編譯哪個系統的代碼?開發C編程語言是爲了幫助編寫UNIX操作系統,但是說Linux呢?可執行文件格式
對不起雞蛋問題。
大多數C編譯器可以選擇不鏈接系統的標準C庫。如果您選擇這樣的功能,那麼標準功能如malloc
,printf
不存在。
您可以調用的唯一代碼就是您創建的代碼。沒有系統包含,沒有標準的庫函數,除了你自己的代碼外沒有別的。空白的石板。
寫入操作系統有很多內容 - 線程,進程,受保護的內存,內存分配器,特權分離,輸入/輸出,設備訪問,文件系統,網絡......這樣的列表還在繼續。當您編寫操作系統的內核時,您最終將擁有足夠的支持結構,您可以開始編寫用戶模式系統調用以訪問內核的功能,例如文件IO。如果你選擇,你可以通過在C標準庫的標準形狀中實現它們來實現。
從理論上講,您可以編寫一個不具有稱爲malloc
或printf
的函數的操作系統。 C編譯器不會在意。
這裏的訣竅是有一個鏈接器,可以建立正確的代碼。這不是編譯器。
我不認爲我會關注。舉例來說,系統提供了一個鏈接器,將動態鏈接信息置於原地? – Curious
您需要不同的系統鏈接器,或者您的鏈接器需要有構建系統代碼的選項(例如使用靜態庫)。 – user3344003
你問的是如何編譯Linux內核? – immibis
的確,這就是我要求的 – Curious
@immibis你能說出更多關於這種工作方式的更多信息嗎? – Curious