Linux kernel 就像是一個龐大的迷宮,如果沒有適當的引導,常讓想要了解它的新手不知道要如何開始。 所幸,Linux kernel 是指標性的開放源碼專案,有許多的前輩高人留下相當多的資料,也有許多人持續在研究它,並且將成果及心得公開在網路上,這對有心想要了解它的人是很好的參考資料來源。
雖然網路上已經有許多資料可供參考,但是它們沒辦法也沒必要解答我所有的疑問,許多細節之處必須親身碰過才會有感覺。 像我這樣對 Linux kernel 有與趣,想了解它是如何運作及如何被設計的人,我需要有一份屬於自已的地圖,將我所探險過的地方及心得記錄下來,讓我之後可以快速回顧。
我把這樣的記錄稱為核心探險地圖,因為對我而言,比起單純的文字,圖表總是更容易把一些關鍵之處連結起來。 當然,為了能和社群互相交流,這樣的記錄最好能夠稍加整理一下,將它分享出來,讓其他像我一樣有興趣的人能夠參考,一起學習,互相交流。
在出發探險之前,先讓我們看看有什麼資料可以幫助我們。 本篇收集了一些關於學習 Linux kernel 相關的資源。
Source Code
- 官方網站 The Linux Kernel Archives: https://kernel.org
- Github: https://github.com/torvalds/linux (這邊應該只是 mirror)
- Linux Cross Reference: http://lxr.free-electrons.com
- woboq code browser : http://code.woboq.org/linux/
在將 Linux kernel source 下載下來之後,第一眼看到的是它的目錄結構,這些目錄代表核心主要的組成元件,了解各個目錄所代表的意義可以更容易找到對應功能的程式碼,這對在核心中探險的我們十分有幫助。
Linux
├── README
├── Documentation
├── include // include files needed to build the kernel code
├── lib // kernel's library code
├── init // initialization code for the kernel
│ └── main.c // start_kernel()
├── arch // architecture specific kernel code
│ └── *
│ ├── configs
│ ├── include
│ ├── lib
│ ├── boot
│ ├── kernel
│ ├── mm
│ ├── net
│ ├── pci
│ └── crypto
├── kernel // main kernel code
│ ├── cpu
│ ├── irq
│ ├── time
│ ├── sched
│ ├── events
│ ├── power
│ ├── debug
│ │ └── kdb
│ ├── gcov
│ ├── printk
│ └── trace
├── mm // memory management
├── fs // file system
├── firmware
├── drivers // device drivers
├── block // block-device drivers
├── sound // sound drivers
├── crypto // encryption algorithms
├── ipc // inter-process communication
├── net // network protocols
├── scripts // scripts (for example awk and tk scripts) that are used when the kernel is configured
├── security // the security of the kernel
├── tools // the tools that interact with the kernel
├── samples // programming examples
├── usr
└── virt // virtualization
- 要更進一步了解關於 Linux kernel source 的目錄結構,Devyn Johnson 有非常詳細的介紹,值得一讀: How the Linux source code is arranged.
Kernel versions
想要了解每個核心版本新增了什麼功能,有什麼變動,可以參考 Linux Kernel Newbies 針對各個核心版本所整理的說明: http://kernelnewbies.org/LinuxVersions
Documentation
Linux kernel release note: README
雖說是 release note,但這份文件並沒有列出版本相關的主要變動,它簡單介紹如何設定及編譯 kernel。
核心內部的文件: https://www.kernel.org/doc/Documentation/
這些文件說明核心內部各個部份的設計,以及核心的設計原則等。對要參與核心開發的人,這是屬於必讀的文件。
- Documentation/00-INDEX 簡介在 Documentation 目錄下各文件及子目錄的內容
- HOWTO do Linux kernel development (簡體中文版)
Kernel APIs 整理了各個子系統內部所使用的函式說明,是在追蹤核心程式碼時非常好的參考資料。
Make Targets
這份在 Linux kernel 中的文件說明各個 make target 所代表的意義: https://www.kernel.org/doc/makehelp.txt (事實上,它是 make help 的輸出內容)
defconfig: New config with default from ARCH supplied defconfig menuconfig: Text based color menus, radiolists & dialogs oldconfig: Update current config utilising a provided .config as base tags/TAGS: Generate tags file for editors cscope: Generate cscope index
tags 及 cscope 可以配合 vim 來瀏覽核心程式碼,可以參考這篇的說明: VIM source navigator
News
要了解 Linux kernel,LWN 是不能錯過的。它的內容包含開放源碼軟體相關的新聞,及 Linux kernel 的開發狀況,而更棒的是它有許多文章解釋 kernel 的設計,是非常好的參考資料來源。 Linux kernel mailing list 是核心開發社群主要的溝通管道,若想追最新的開發狀況,或是參與核心開發的討論,那就是要訂閱它。
Linux Weeky News (LWN): https://lwn.net/
LWN 根據主題整理的列表 : http://lwn.net/Kernel/Index/
這個有點類似精華區,收集了許多說明核心內部設計的文章
Linux kernel mailing list: https://lkml.org/
Books
- Understanding the Linux Kernel (by Daniel P. Bovet, Marco Cesati)
- Linux Kernel Development (by Robert Love)
- Professional Linux Kernel Architecture (by Wolfgang Mauerer)
- Rex: 十本 Linux 核心開發書籍介紹
Statistic
下面的網站收集了一些每個版本發布時的統計資料(核心主要的貢獻者及其雇主),其來源是分析每個提交(commit)上的資料。
- Linux Kernel Patch Statistic (統計貢獻者及其雇主)
- Graphic Kernel Evolvement (統計每個版本改動的數量)
- Linux Counter: Lines of code per kernel version
- http://kernelnewbies.org/DevelopmentStatistics (LWN 每個版本發佈時的統計報告)
Reference
- https://en.wikipedia.org/wiki/Linux_kernel
- Linux kernel 新手村: http://kernelnewbies.org
- Devyn Johnson: Linux Kernel Reading Guide
- http://www.makelinux.net/
- IBM Developerworks Linux Library
- IBM Developerworks: Anatomy of the Linux kernel
- Kernel Planet (部落格聯播): http://kernelplanet.org/
- LWN: Linux Distribution List