Linux內(nèi)核高手煉成記
我曾經(jīng)問別人如何開始內(nèi)核編程的學(xué)習(xí),他們基本上都說:①如果你不需要了解內(nèi)核是如何為你工作的,你為何要嘗試呢?②你應(yīng)該訂閱Linux內(nèi)核郵件列表,然后努力去理解。③如果你不去編寫針對Linux內(nèi)核的代碼,你就是在浪費(fèi)時間。
這些對我一點(diǎn)兒幫助都沒有。所以我在這里列舉了一些可行的方法,他們是有關(guān)操作系統(tǒng)和Linux內(nèi)核是怎樣在你的項目里工作的,而且還很有趣。雖然我知道得并不多,但至少比我做這些之前了解了更多。
對于下面這幾個途徑,你只需要了解一些C語言和匯編語言(至少要會復(fù)制粘貼)。我會寫一些小的C程序,還會用匯編來上課,雖然這些我都忘得差不多了。
方法一:編寫你自己的操作系統(tǒng)
這看起來是一個相當(dāng)可怕的方法。但事實上并不是!我是從rustboot這個項目開始的,重要的是它已經(jīng)可以工作了。然后我會做一些簡單的事情,比如讓屏幕由紅色變?yōu)樗{(lán)色,打印字符到屏幕,持續(xù)獲取鍵盤中斷來工作。
MikeOS是我另一個有趣的開始。請記住,你的操作系統(tǒng)沒有必要做得很大很專業(yè)——如果你能夠讓它把屏幕顏色由紅色變?yōu)樽仙蛘咦屗蛴∫皇滓?,你就算成功了?/p>
你一定會想使用一個仿真器去運(yùn)行你的操作系統(tǒng),比如qemu。OSDev wiki同樣是一個很有用的網(wǎng)站——上面有很多你會碰到的常見的問題。
方法二:編寫寫一些內(nèi)核模塊!
如果你已經(jīng)準(zhǔn)備運(yùn)行Linux了,那么再寫一些內(nèi)核模塊就會是相當(dāng)相當(dāng)容易的,即使他們什么都不會做。
這里有一個能夠打印“Hello, hacker school!”到內(nèi)核日志的模塊源代碼。它只有18行代碼?;旧夏阒恍枰帉懸粋€init進(jìn)程和一個cleanup函數(shù)就可以了。我并不知道__init和_exit這兩個宏命令做了些什么,但是我會使用他們!
編寫一個有一定功能的內(nèi)核模塊是比較難的。我做這個的時候,都是先決定要完成的功能(比如打印一個信息給每一個經(jīng)過內(nèi)核的數(shù)據(jù)包),然后回去閱讀一些Kernel Newbies上的東西,再大量地使用谷歌來搜索,再復(fù)制和粘貼大量的代碼來搞明白究竟該怎樣去編寫它。這里有幾個內(nèi)核模塊的例子,我把他們放在了kernel-module-fun項目里。
方法三:參加一次Linux內(nèi)核實習(xí)!
Linux內(nèi)核團(tuán)隊參與了GNOME女性拓展實習(xí)項目。它是驚人、奇妙并且令人非常愉快的一個活動。這意味著,如果你是一個女人并且愿意花費(fèi)三個月時間在內(nèi)核開發(fā)上,你就能參與內(nèi)核的開發(fā),并且不需要任何的經(jīng)驗,還能得到一些報酬(5000美元)。在Kernel Newbies上有關(guān)于它的介紹。
如果你對此感興趣,那會是非常值得去申請的——你能夠為內(nèi)核做一個格式化的補(bǔ)丁,這非常有趣。Sarah Sharp是一個Linux內(nèi)核開發(fā)人員,她在協(xié)調(diào)這個活動而且她本人也是非常熱心的。你可以閱讀她的這篇博客文章,講述了在第一輪里137個補(bǔ)丁是怎樣被允許加入到內(nèi)核中去的。這些補(bǔ)丁也將會是你提供的!查看申請說明!
如果你不是一個女生,那么可以選擇Google Summer of Code這個相似的活動。(編注:這句話可能會引起女程序員的反感)
方法四:閱讀內(nèi)核源碼
這聽起來像是最糟糕的建議——“想要去了解內(nèi)核是如何工作的就去看源代碼,太蠢了”
但事實上這個方法是非常有趣。你并不需要了解一切東西。當(dāng)遇到無法理解的東西時,我就會感到無能為力,但是我告訴人們的時候,每個人都會說:“嗯,這就是傳說中的Linux內(nèi)核,你不能理解很正常!”
我的朋友Dave最近給了我一個網(wǎng)站LXR,在里面你可以閱讀到內(nèi)核的資源,而且還提供了大量有用的引用鏈接。比如,如果你想要了解chmod這個命令的系統(tǒng)調(diào)用,你可以在the chmod_common definition頁面看到有關(guān)于它在Linux內(nèi)核里的定義!
這里是部分chmod_common的部分代碼,其中有一些我寫的注釋:
- static int chmod_common(struct path *path, umode_t mode)
- {
- struct inode *inode = path->dentry->d_inode;
- struct iattr newattrs;
- int error;
- // 不知道這是在干什么
- error = mnt_want_write(path->mnt);
- if (error)
- return error;
- // 互斥鎖!避免出現(xiàn)沖突現(xiàn)象!=D
- mutex_lock(&inode->i_mutex);
- // 我猜這是在檢查是否能使用chmod
- error = security_path_chmod(path, mode);
- if (error)
- goto out_unlock;
- // 我猜這是在改變mode的值
- newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~IALLUGO);
- newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
- error = notify_change(path->dentry, &newattrs);
- out_unlock:
- mutex_unlock(&inode->i_mutex); // 完成時就解除互斥鎖
- mnt_drop_write(path->mnt); // ???
- return error;
- }
我覺得這個過程是很有趣的,而且也幫助了我闡明了內(nèi)核的意義。我發(fā)現(xiàn)我所閱讀的代碼大多都是生澀難懂的,但是也有一些(比如chmod的代碼)是可以理解的。
總結(jié)幾個鏈接:
- Jessica McKellar在Ksplice blog上的博客文章
- 《Linux Device Drivers》是這樣描述它自己的,我發(fā)現(xiàn)還是有點(diǎn)用。
“這本書會教你怎樣編寫你自己的驅(qū)動和怎樣入侵與內(nèi)核相關(guān)的地方”
- 如果你在寫一個操作系統(tǒng),OSDev wiki是一個不錯的網(wǎng)站
- Kernel Newbies有一些給內(nèi)核開發(fā)新手的資源,雖然在它的聊天室里我有一些不爽的經(jīng)歷。
- Sarah Sharp是一個內(nèi)核開發(fā)人員,負(fù)責(zé)Linux內(nèi)核的對外服務(wù),是非常好的一個女人。
原文鏈接: Julia Evans 翻譯: 伯樂在線 - haofly