Daniel Jslin

May the source be with you

Linux Kernel 探險地圖

Linux kernel 就像是一個龐大的迷宮,如果沒有適當的引導,常讓想要了解它的新手不知道要如何開始。 所幸,Linux kernel 是指標性的開放源碼專案,有許多的前輩高人留下相當多的資料,也有許多人持續在研究它,並且將成果及心得公開在網路上,這對有心想要了解它的人是很好的參考資料來源。

雖然網路上已經有許多資料可供參考,但是它們沒辦法也沒必要解答我所有的疑問,許多細節之處必須親身碰過才會有感覺。 像我這樣對 Linux kernel 有與趣,想了解它是如何運作及如何被設計的人,我需要有一份屬於自已的地圖,將我所探險過的地方及心得記錄下來,讓我之後可以快速回顧。

我把這樣的記錄稱為核心探險地圖,因為對我而言,比起單純的文字,圖表總是更容易把一些關鍵之處連結起來。 當然,為了能和社群互相交流,這樣的記錄最好能夠稍加整理一下,將它分享出來,讓其他像我一樣有興趣的人能夠參考,一起學習,互相交流。

在出發探險之前,先讓我們看看有什麼資料可以幫助我們。 本篇收集了一些關於學習 Linux kernel 相關的資源。

Source Code

在將 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

Kernel versions

想要了解每個核心版本新增了什麼功能,有什麼變動,可以參考 Linux Kernel Newbies 針對各個核心版本所整理的說明: http://kernelnewbies.org/LinuxVersions

Documentation

  • Linux kernel release note: README

    雖說是 release note,但這份文件並沒有列出版本相關的主要變動,它簡單介紹如何設定及編譯 kernel。

  • 核心內部的文件: https://www.kernel.org/doc/Documentation/

    這些文件說明核心內部各個部份的設計,以及核心的設計原則等。對要參與核心開發的人,這是屬於必讀的文件。

  • 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 是核心開發社群主要的溝通管道,若想追最新的開發狀況,或是參與核心開發的討論,那就是要訂閱它。

Statistic

下面的網站收集了一些每個版本發布時的統計資料(核心主要的貢獻者及其雇主),其來源是分析每個提交(commit)上的資料。

Comments