(以前我在 CUSEC 網站發表了關於內核並不可怕的一篇文章,本文是後續。)html
我曾經問別人如何開始內核編程的學習,他們基本上都說:
1. 若是你不須要了解內核是如何爲你工做的,你爲什麼要嘗試呢?
2. 你應該訂閱Linux內核郵件列表,而後努力去理解。
3. 若是你不去編寫針對Linux內核的代碼,你就是在浪費時間。node
這些對我一點兒幫助都沒有。因此我在這裏列舉了一些可行的方法,他們是有關操做系統和Linux內核是怎樣在你的項目裏工做的,並且還頗有趣。雖然我知道得並很少,但至少比我作這些以前瞭解了更多。linux
對於下面這幾個途徑,你只須要了解一些C語言和彙編語言(至少要會複製粘貼)。我會寫一些小的C程序,還會用匯編來上課,雖然這些我都忘得差很少了。ios
這看起來是一個至關可怕的方法。但事實上並非!我是從 rustboot這個項目開始的,重要的是它已經能夠工做了。而後我會作一些簡單的事情,好比讓屏幕由紅色變爲藍色,打印字符到屏幕,持續獲取鍵盤中斷來工做。git
MikeOS 是我另外一個有趣的開始。請記住,你的操做系統沒有必要作得很大很專業——若是你可以讓它把屏幕顏色由紅色變爲紫色或者讓它打印一首詩,你就算成功了。程序員
你必定會想使用一個仿真器去運行你的操做系統,好比 qemu。OSDev wiki一樣是一個頗有用的網站——上面有不少你會碰到的常見的問題。github
若是你已經準備運行Linux了,那麼再寫一些內核模塊就會是至關至關容易的,即便他們什麼都不會作。web
這裏有一個可以打印「Hello, hacker school!」到內核日誌的模塊源代碼。它只有18行代碼。基本上你只須要編寫一個init進程和一個cleanup函數就能夠了。我並不知道__init和_exit這兩個宏命令作了些什麼,可是我會使用他們!編程
編寫一個有必定功能的內核模塊是比較難的。我作這個的時候,都是先決定要完成的功能(好比打印一個信息給每個通過內核的數據包),而後回去閱讀一些 Kernel Newbies上的東西,再大量地使用谷歌來搜索,再複製和粘貼大量的代碼來搞明白究竟該怎樣去編寫它。這裏有幾個內核模塊的例子,我把他們放在了 kernel-module-fun 項目裏。c#
Linux內核團隊參與了GNOME女性拓展實習項目。它是驚人、奇妙而且使人很是愉快的一個活動。這意味着,若是你是一個女人而且願意花費三個月時間在內核開發上,你就能參與內核的開發,而且不須要任何的經驗,還能獲得一些報酬(5000美圓)。在 Kernel Newbies上有關於它的介紹。
若是你對此感興趣,那會是很是值得去申請的——你可以爲內核作一個格式化的補丁,這很是有趣。Sarah Sharp是一個Linux內核開發人員,她在協調這個活動並且她本人也是很是熱心的。你能夠閱讀她的這篇博客文章,講述了在第一輪裏137個補丁是怎樣被容許加入到內核中去的。這些補丁也將會是你提供的!查看申請說明!
若是你不是一個女生,那麼能夠選擇Google Summer of Code這個類似的活動。(編注:這句話可能會引發女程序員的反感)
這聽起來像是最糟糕的建議——「想要去了解內核是如何工做的就去看源代碼,太蠢了」
但事實上這個方法是很是有趣。你並不須要瞭解一切東西。當遇到沒法理解的東西時,我就會感到無能爲力,可是我告訴人們的時候,每一個人都會說:「嗯,這就是傳說中的Linux內核,你不能理解很正常!」
個人朋友Dave最近給了我一個網站 LXR,在裏面你能夠閱讀到內核的資源,並且還提供了大量有用的引用連接。好比,若是你想要了解chmod這個命令的系統調用,你能夠在 the chmod_common definition 頁面看到有關於它在Linux內核裏的定義!
這裏是部分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; // 互斥鎖!避免出現衝突現象!=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; }
我以爲這個過程是頗有趣的,並且也幫助了我闡明瞭內核的意義。我發現我所閱讀的代碼大多都是生澀難懂的,可是也有一些(好比chmod的代碼)是能夠理解的。
總結幾個連接:
《Linux Device Drivers》是這樣描述它本身的,我發現仍是有點用:
「這本書會教你怎樣編寫你本身的驅動和怎樣入侵與內核相關的地方」
若是你在寫一個操做系統,OSDev wiki是一個不錯的網站
原文:4 paths to being a kernel hacker
轉載自:伯樂在線 - haofly