(之前我在 CUSEC 網站發表了關於內核並不可怕的一篇文章,本文是後續。)
我曾經問別人如何開始內核編程的學習,他們基本上都說:
1. 如果你不需要了解內核是如何為你工作的,你為何要嘗試呢?
2. 你應該訂閱Linux內核郵件列表,然後努力去理解。
3. 如果你不去編寫針對Linux內核的代碼,你就是在浪費時間。
這些對我一點兒幫助都沒有。所以我在這裡列舉了一些可行的方法,他們是有關操作系統和Linux內核是怎樣在你的項目裡工作的,而且還很有趣。雖然我知道得並不多,但至少比我做這些之前了解了更多。
對於下面這幾個途徑,你只需要了解一些C語言和匯編語言(至少要會復制粘貼)。我會寫一些小的C程序,還會用匯編來上課,雖然這些我都忘得差不多了。
MikeOS 是我另一個有趣的開始。請記住,你的操作系統沒有必要做得很大很專業——如果你能夠讓它把屏幕顏色由紅色變為紫色或者讓它打印一首詩,你就算成功了。
你一定會想使用一個仿真器去運行你的操作系統,比如 qemu。OSDev wiki同樣是一個很有用的網站——上面有很多你會碰到的常見的問題。
編寫一個有一定功能的內核模塊是比較難的。我做這個的時候,都是先決定要完成的功能(比如打印一個信息給每一個經過內核的數據包),然後回去閱讀一些 Kernel Newbies上的東西,再大量地使用谷歌來搜索,再復制和粘貼大量的代碼來搞明白究竟該怎樣去編寫它。這裡有幾個內核模塊的例子,我把他們放在了 kernel-module-fun 項目裡。
如果你對此感興趣,那會是非常值得去申請的——你能夠為內核做一個格式化的補丁,這非常有趣。Sarah Sharp是一個Linux內核開發人員,她在協調這個活動而且她本人也是非常熱心的。你可以閱讀她的這篇博客文章,講述了在第一輪裡137個補丁是怎樣被允許加入到內核中去的。這些補丁也將會是你提供的!查看申請說明!
如果你不是一個女生,那麼可以選擇Google Summer of Code這個相似的活動。(編注:這句話可能會引起女程序員的反感)
這裡是部分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