成為Linux核心高手的四個方法
(之前我在CUSEC網站發表了關於核心並不可怕的一篇文章,本文是後續。)
我曾經問別人如何開始核心程式設計的學習,他們基本上都說:①如果你不需要了解核心是如何為你工作的,你為何要嘗試呢?②你應該訂閱Linux核心郵件列表,然後努力去理解。③如果你不去編寫針對Linux核心的程式碼,你就是在浪費時間。
這些對我一點兒幫助都沒有。所以我在這裡列舉了一些可行的方法,他們是有關作業系統和Linux核心是怎樣在你的專案裡工作的,而且還很有趣。雖然我知道得並不多,但至少比我做這些之前瞭解了更多。
對於下面這幾個途徑,你只需要瞭解一些C語言和組合語言(至少要會複製貼上)。我會寫一些小的C程式,還會用匯編來上課,雖然這些我都忘得差不多了。
方法一:編寫你自己的作業系統
這看起來是一個相當可怕的方法。但事實上並不是!我是從rustboot這個專案開始的,重要的是它已經可以工作了。然後我會做一些簡單的事情,比如讓螢幕由紅色變為藍色,列印字元到螢幕,持續獲取鍵盤中斷來工作。
MikeOS是我另一個有趣的開始。請記住,你的作業系統沒有必要做得很大很專業——如果你能夠讓它把螢幕顏色由紅色變為紫色或者讓它列印一首視,你就算成功了。
你一定會想使用一個模擬器去執行你的作業系統,比如qemu。OSDev wiki同樣是一個很有用的網站——上面有很多你會碰到的常見的問題。
方法二:編寫寫一些核心模組!
如果你已經準備執行Linux了,那麼再寫一些核心模組就會是相當相當容易的,即使他們什麼都不會做。
這裡有一個能夠列印“Hello, hacker school!”到核心日誌的模組原始碼。它只有18行程式碼。基本上你只需要編寫一個init程式和一個cleanup函式就可以了。我並不知道__init和_exit這兩個巨集命令做了些什麼,但是我會使用他們!
編寫一個有一定功能的核心模組是比較難的。我做這個的時候,都是先決定要完成的功能(比如列印一個資訊給每一個經過核心的資料包),然後回去閱讀一些Kernel Newbies上的東西,再大量地使用谷歌來搜尋,再複製和貼上大量的程式碼來搞明白究竟該怎樣去編寫它。這裡有幾個核心模組的例子,我把他們放在了kernel-module-fun專案裡。
方法三:參加一次Linux核心實習!
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的程式碼)是可以理解的。
總結幾個連結:
- Jessica McKellar在Ksplice blog上的部落格文章
- 《Linux Device Drivers》是這樣描述它自己的,我發現還是有點用。
“這本書會教你怎樣編寫你自己的驅動和怎樣入侵與核心相關的地方”
- 如果你在寫一個作業系統,OSDev wiki是一個不錯的網站
- Kernel Newbies有一些給核心開發新手的資源,雖然在它的聊天室裡我有一些不爽的經歷。
- Sarah Sharp是一個核心開發人員,負責Linux核心的對外服務,是非常好的一個女人。
原文連結: Julia Evans 翻譯: 伯樂線上 - haofly
相關文章
- 成為 Linux 運維高手必備的七種“武器”!Linux運維
- 《怎樣成為一個高手》觀後感
- 成為高手前必懂的TCP乾貨TCP
- 推薦成為python高手的必然筆記Python筆記
- 這是一篇成為 git 高手的文章Git
- 如何成為學習高手訪談錄
- 財務打理不再難:5個技巧幫你成為理財高手
- 2022年Rust將成為Linux核心第二語言RustLinux
- 新手必看的12個超實用開車技巧 看完你也可以成為高手!
- SQLPro Studio,讓你的Mac成為資料庫管理的高手!SQLMac資料庫
- 為什麼Redis這麼快?5分鐘成為Redis高手Redis
- 為什麼你成為不了團隊核心成員
- “四大高手”為你的 Vue 應用程式保駕護航Vue
- 佳德智誠:商家打造爆款三大核心四個方法
- 在 Linux 中把使用者新增到組的四個方法Linux
- 認識linux核心(linux核心的作用)Linux
- C語言學習軌跡--旁註--2025成為高手的菜鳥C語言
- 【java】int轉換成String的四種方法Java
- UKTools:安裝最新 Linux 核心的簡便方法Linux
- 33 個 JavaScript 核心概念系列(四): == 與 ===JavaScript
- Linux核心原始碼分析之setup_arch (四)Linux原始碼
- 那些程式設計高手是如何練成的?程式設計
- Linux-高手進階之路Linux
- linux下檢視mysql版本的四種方法LinuxMySql
- 寓教於樂!一款遊戲讓你成為 Vim 高手!遊戲
- 四大亮點帶你看 Linux 核心 5.6Linux
- 使用命令檢視Linux核心版本的三種方法Linux
- linux下找出核心符號資訊的4種方法Linux符號
- Java Thread 類相關的幾個核心方法Javathread
- [開發故事]成為優秀程式設計師的十個有效方法程式設計師
- Linux 核心的故事Linux
- Windows 上的 Bash 正在成為微軟的 LinuxWindows微軟Linux
- Rust for Linux 新補丁:為 Linux 核心增加對 Rust 作為第二語言的支援RustLinux
- iOS程式設計師如何成為程式設計高手,並以此創業iOS程式設計師創業
- Linux學習方法_Linux介紹_Linux發行版組成Linux
- 四個常見的Linux面試問題Linux面試
- Android核心和Linux核心的區別AndroidLinux
- 技術負責人所需的四個核心能力,你具備幾個?
- Linux 核心中 Kconfig 檔案的作用和新增 menuconfig 項的方法Linux