請問如何從下載的linux內核文件繼續編寫操作系統?

我看了很多都是介紹如何編寫操作系統內核的,然而卻沒有人介紹如何從linus寫好的內核,如何進行編譯,然後進行繼續開發的。

我前幾天下載了一個linux內核源代碼,結果發現根本不知如何下手。

請問有人能詳細說明一下這個東西應該怎麼搞嘛?


編譯 linux kernel 的資料有好多好多啊,gentoo wiki 最詳盡 Kernel - Gentoo Wiki ,LFS 從零開始 Download LFS ,很多別的發行版也有資料。

如何做 Linux kernel 開發的書和資料也有好多的, 《Linux Kernel Development》,《Linux device drivers》,《Understanding the Linux Kernel》,《Professional Linux Kernel Architecture》隨便一本都能入手開始寫代碼了。

怎麼會得到「沒有人介紹」的結論的呢?


小白最快速的實現方式應該是上一下網易雲課堂計算機專業4年課程里的操作系統課,哈工大老師講的。那裡面會講解linux0.11的部分源碼。然後實驗需要去實驗樓網站上做,0.11源碼和編譯環境都給你下好了,引導你去編譯和修改部分代碼,然後在虛擬環境中跑你編譯的內核。

當然這也只能算是入了門,學了點皮毛。畢竟linux 0.11的源碼也就幾千行。但在0.11上繼續編寫系統也未嘗不可,有同學還給內核加了個圖形界面,能玩flappy bird。另外github上也有中文注釋非常完善的0.11代碼。


有時候說實話會被人當作裝逼。

但是我還是要說。因為我就是喜歡裝逼。

簡單地說,題主應該放棄研究Linux內核。

你的基礎知識太差了。找文獻的能力也太弱了。憑你現在的能力,在可見的未來中,應該只適合做一下非計算機專業計算機二級能力考試的題目同等難度的開發工作。三級可能對你都夠嗆。

簡而言之,不要好高騖遠,先去把計算機二級過了吧。

進一步說,學Linux內核本來就不可能從linux內核開始學。

第一步先apue高級unix環境編程,這本書會幫你理清楚庫和系統調用的關係。

然後學彙編,Linux環境彙編有本紅皮書挺出名的,自己找找吧。如果能配合上linker and loader一起看更好。理清楚你到底要用gcc編譯出什麼東西。

然後,安裝一個常見的Linux桌面系統。了解一下常見的rpm包或者dep包體系。沿著kernel rpm的來源一路找上去。

但是回過頭來說,你如果沒有正經上過操作系統原理的課,搗鼓內核有什麼意義?如果操作系統原理都上過了,連個make oldconfig make都不會那你在學什麼鬼?


我花了一年時間,過了一遍linux內核從載入到init進程啟動的代碼,受益匪淺.

確實如題主所說,剛開始的時候 根本不知如何下手.

要想知道如何下手,需要一些背景和基礎知識(http://heguangyu5.github.io/my-linux/html/1-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E5%87%86%E5%A4%87.html).

當中做了一些筆記,供參考.

http://heguangyu5.github.io/my-linux/html/

這之後,就可以嘗試寫一些簡單的kernel module.比如這個 https://github.com/heguangyu5/auto-increment/blob/master/auto-increment.c,我參考/proc/uptime實現了一個/proc/auto-incrment,這是一個操作系統級別的自增主鍵,用來產生不重複的唯一編碼.


可能是因為你還看不懂吧。。。


你下了內核的代碼, 編譯出來的自然就僅是內核, 內核是系統的一部分, 然並非全部.

要編譯內核需要核心工具組coreutils和編譯器gcc, binutils等, 以及一些支持庫.

如果你全部都打算手動搞起來, 那就是 linux from scratch(lfs). 可以參照相關站點和書來學習實踐.

要輕鬆點, 則可以使用現成的linux發行版來編譯.

工具鏈完整的話, 編譯本身沒有難度, 基本是menuconfig, 是一個點菜的過程.

但無論怎麼說, 都僅是編而已. 編是一個組裝的行為, 和"寫"完全沒關係.

不知道你的目標主要是什麼, 如果是學習的話, 建議找個久遠的, 代碼規模較小的版本, 或者更老的 unixv6, 有書有注釋, 較為容易.


我也配合樓上來一波勸退。

從題主提問的方式來看,恐怕連gcc和make的關係都扯不清楚,編譯一個內核尚且要搗鼓許久,就不要去搗鼓什麼內核開發了。

不強行安利內核的書籍了,我覺得題主先買一本LPIC-1的指導書籍,根據書上提到的知識點,學習基礎知識比較好。


從修改字元串開始,看看哪裡有字元串,改下


無處下手 只能說明功力還不夠


嗯...

你也沒說你會什麼,那我就當你是初學者了。

可以去看看韋東山第一期視頻,免費。

有一些關於內核的知識,你去找找看。


make menuconfig

make zImage


很多時候還是以邊聽邊做的形式入門快一些

幾年前沉迷這類東西無法自拔,還做了一些小視頻供參考:

1、編譯Linux內核: http://www.bilibili.com/mobile/video/av1546208.html

2、製作minimal Linux:http://www.bilibili.com/mobile/video/av2601116.html

3、如果想定製自己的Linux可以搜Live Build。不過這東西一年前就已經被棄坑了。網上絕大多數的資料的操作步驟還跟最新版本的不同。

如果你是高中生的話我勸你不要在這電腦上花太多時間(′?ω?`)

因為我當時每星期回到家寫完作業就整這個...完全不把高考當回事。

現在想想後悔啊……不然早上985/211了(///▽///)

以上。


我覺得應該想弄清你自己想幹嘛?寫操作系統?基於linux kernel二次開發? 編譯linux kernel以及搭配出一套可以供日常使用的環境?


題主想問的是如何編譯運行linux?我沒理解錯吧?


推薦閱讀:

能敘述下面向對象思想在Linux內核編程中的應用嗎?
Linux操作系統關於C library的理解?
如何訪問linux內核,讀取所有進程的task_struct結構?/dev/mem?還是編寫驅動程序?
為什麼 Linux 不用微內核?
在做完內核裁剪後,等待編譯結果的過程是一種怎樣的體驗?

TAG:操作系統 | Linux | 計算機 | Linux內核 | 操作系統內核 |