1. Linux 發行版(例如 Debian)

1. Linux 發行版(例如 Debian)

我透過從 kernel.org 下載 Linux 核心來編譯它,將其放在桌面上,然後打開終端。我更改為 linux-3.2.13 資料夾,輸入mr proper
然後我用它make menuconfig來配置我的 .config 檔案。完成並保存後,我輸入make並終端開始編譯文件。經過3個小時的編譯,我想知道我是否做錯了什麼。

我的問題是:

  1. 我做錯什麼了嗎?
  2. 如果不是我下一步該做什麼?
  3. 輸出是什麼(例如 .bin、.elf)?
  4. 我的最終目標是製作一個可以放在光碟上、放在另一台電腦上並運行的作業系統(不是具有不同核心的 Ubuntu 作業系統)。

答案1

我做錯什麼了嗎?

看起來不像。編譯最新的核心非常消耗資源。如果您的 CPU 不是最新的,並且您沒有大量 RAM,則可能需要非常長的。
確保只選擇實際需要的模組/功能,如果您有一台具有一定 RAM 的多核心/線程計算機,請使用該-jX選項,make以便它可以並行運行構建。例如

make -j4

大部分構建將使用四個核心。

輸出會是什麼?

它將是一個壓縮的核心映像。它不是 ELF 文件,也不是普通意義上的可執行檔。它採用適合您平台的引導程式處理的格式。

接下來我該做什麼?

取決於你要做什麼......(參見這裡假設您使用的是 Grub,請參閱安裝模組和核心映像的簡單 HOWTO。透過快速搜尋還有很多其他可用的,如果您打算使用新核心實際運行主流發行版,您最好查看當前發行版的文檔 - 有一些功能要求,以及潛在的 initrd 特殊性需要予以考慮。

[我的目標是建立自己的作業系統]

恐怕你離那還很遠。建立作業系統是一項非常非常複雜的任務 - 而建立核心是非常簡單的部分之一。

我建議你去Linux 從頭開始並閱讀當前穩定的“書”。也關註一下發行表,然後搜尋「基於來源」的發行版類別,其中一些可能是您感興趣的。

答案2

我發表了很多評論,並認為最好將內容作為答案發布,因為盒子更大,我可以胡說八道。 :) 我希望你能原諒我瘋狂的胡言亂語。

另外,我現在警告你:我是個徹頭徹尾的混蛋,我會稍微剪掉你的翅膀。

您需要決定的第一件事是:您的程式設計技能有多好?如果沒有良好的程式設計技能和對硬體的充分了解,您就無法編寫自己的作業系統。

您需要決定的第二件事是:

  1. 您正在製作 Linux 發行版嗎? (例如 Debian、Ubuntu、紅帽)
  2. 您正在製作具有不同運行時的基於 Linux 的作業系統嗎? (例如 Android、Maemo)
  3. 您是從頭開始編寫作業系統嗎? (例如 VMS、CP/M、RT-11、阿米巴、Plan/9)

在回答這些問題之前,您應該仔細檢查以確保您已記下條款,這樣您就知道自己在做什麼。

1. Linux 發行版(例如 Debian)

如果您只想製作另一個 Linux 發行版,那麼編譯核心是您最不用擔心的。只要有足夠的時間和足夠大的計算機,核心實際上可以自行編譯。

這是一個討論製作 Linux 發行版的一些方面的文章

為什麼這比您想像的要困難:您想要添加到發行版中的功能越多,正確建立發行版就越困難。您必須選擇重新發明輪子(創建自己的套件管理器),還是使用現有的輪子(RPM?APT?連接埠?)。無論哪種情況,您都將花費數月時間進行煩人的工作,協調相互不相容的軟體包、編譯、驗證使用具有不同 CPU(不僅僅是 Intel 或 AMD)的不同電腦的工作,等等。

根據範圍的不同,您最終可能必須自己重做數千人的工作。你會從中學到很多嗎?絕對地!但是,透過運行現有的 Linux 發行版,以及偶爾自己編譯一些軟體包來了解其工作原理,您也可以學到很多東西。如果您只想了解 X 伺服器是如何建構的,為什麼還要建立 libc 和數百個其他函式庫呢?

可以這樣想:如果您想學習如何組裝 PC,您會從一桶電晶體和烙鐵開始,還是從 PC 組件和一些文件開始?

2.基於Linux的作業系統(例如Android)

有相當多基於 Linux 的作業系統的運行時與 POSIX 相當不同。我想到的是 Maemo、Meego、Android 和其他(最常見的是嵌入式)作業系統。

這樣做的好處是你不需要編寫自己的核心。這樣做的缺點是您不僅需要設計自己的發行版,而且還必須自己製作大部分軟體包。您認為編譯gcclibc痛苦嗎?嘗試編寫自己的 ANSI-C 相容 C 編譯器從頭開始的完整軟體堆疊。多年來編寫令人討厭的小函數(可能在彙編中)提供了微小的滿足感。您還需要學習 Linux 核心的大部分內部結構,以及它如何與用戶空間通信,因為您將在該介面上進行建置。在本文結束時,您應該已經記住了大多數系統呼叫編號。 :)

你會學到很多嗎?絕對地!比你想像的更多。會不會感到沮喪和煩惱?哦是的。 Android 不是由一個孤獨的人在業餘時間用筆記型電腦開發的,這是有原因的。甚至gcc不是那樣建造的。

3. 從頭開始的作業系統

這是您從彙編器和 C 編譯器開始並編寫您自己的核心的地方 - 如果您的作業系統甚至有核心。情況並非普遍如此。下載您能找到的所有硬體資料表,然後您就可以開始使用了。一旦你運行了基本的內核,你就可以看到運行時了。您可以編寫自己的運行時,或確保您的核心部分或完全相容於 POSIX,然後您將擁有完整的 GNU 運行時。您“只需”創建第一層庫並gcc在新作業系統上運行。

這有回報嗎?令人驚訝的是。會很難嗎?如果唐納德·高德納(Donald Knuth)、安德魯·塔南鮑姆(Andrew Tanenbaum)這些名字對你來說毫無意義,那麼你可能應該重新考慮。將會有很多人學習理論計算機科學。真正從頭開始建立作業系統涉及大量的理論。不幸的是,現代系統也存在大量單調乏味的情況。

過去,您只需在正確的位置燒錄帶有 JMP 指令的 ROM,插入它,通電,然後就完成了。現代系統需要大量的工作才能啟動並運行 CPU 核心、設定記憶體、枚舉輸入裝置以及啟動輸出裝置。關於這些任務中的每一項都有完整的書(我有一本關於原來的超過 1,000 頁的 VGA — 在 8 位元機器的陪伴下成長,我原以為對 1987 年的 VGA 進行編程會很簡單,我非常惱火,但在這個過程中我學到了很多東西!

那麼,你應該嗎?

你絕對應該嘗試。不要對「成功」有誤解,除非您從一開始就設定了目標。維護作業系統/發行版是一個開放式的通常由一大群人完成的任務。但即使嘗試這樣做也會磨練你的技能並教導你新的技能。

順便說一句,我是根據大多數這些事情的(通常是痛苦的)經驗來說話的。我已經(共同)為一些 CPU(學習/工作/娛樂)編寫了嵌入式低階運行時,並且目前我正在為玩具 CPU 編寫一個玩具作業系統(這都是為了好玩)。

答案3

按照以下教程中給出的步驟在 Ubuntu 中編譯核心:

如何編譯核心:Ubuntu 方式”

相關內容