一起分析Linux系統設計思想——01核心設定和編譯

2020-09-28 13:00:33

在學習資料滿天飛的大環境下,知識變得非常零散,體系化的知識並不多,這就導致很多人每天都努力學習到感動自己,最終卻收效甚微,甚至放棄學習。我的使命就是過濾掉大量的垃圾資訊,將知識體系化,以短平快的方式直達問題本質,把大家從大海撈針的痛苦中解脫出來。

1 核心設定流程

核心設定流程如下圖所示:

在這裡插入圖片描述

設定的最終目的是裁剪,裁剪分為檔案粒度的裁剪和程式碼行粒度的裁剪。因此需要分別生成auto.conf檔案和autoconf.h檔案給Makefile和原始檔使用。

核心中轉檔案是.config檔案。該檔案其實可以直接由使用者通過make menuconfig一項項地進行設定,但是往往不會選擇這樣做,一個原因是設定項太多,使用者不可能一一全部弄懂;還有一個原因是本著 繼承複用 的思想,一般都需要整一個 藍本 ,然後在這個基礎上再去修改。這也就是設計Step1和Step2的初衷。


2 檔案組織背後的邏輯

Tips:無論是Linux原始碼還是其他大型工程的原始碼,其複雜性很大一部分體現在檔案組織的複雜上。首先理清檔案的組織結構對理解大型軟體架構有很大的幫助,而不是一頭扎進原始碼實現。

首先我們思考一下,Linux原始碼在進行檔案組織時為什麼要設計一個 /include 資料夾。

C語言的封裝性是由.c檔案和.h檔案(一般和.c檔案同名)共同完成的:對於一個模組,.c檔案負責模組功能實現,.h檔案負責對外介面呈現。

但.h檔案除了上面這個功能之外,還用於同層跨模組,跨層,甚至是整個系統中設定和資訊的共用。此時的.h檔案是不依賴同名.c檔案獨立存在的。這類.h檔案,一部分(同層跨模組,跨層的)放在層所在的資料夾內,一部分(系統相關的)就需要建立一個 /include 來專門存放。

2.1 auto.conf為什麼放在/include/config目錄下

auto.conf字尾名雖然不是.h,但也是被頂層Makefile包含的,也屬於標頭檔案系;而且該檔案就是用來設定的檔案,所以放在/include/config目錄下無可厚非。如果是你,你也會這樣設計。

2.2 autoconf.h為什麼放在/include/linux目錄下

那autoconf.h為什麼不直接放在/include/config目錄下而要放在/include/linux目錄下呢?

原始碼中/include/config目錄下在設定和編譯之前都是空的,設定和編譯之後自動生成的設定相關的標頭檔案會放在這裡。從這個道理上來講,autoconf.h放在這個資料夾中並沒有什麼問題。

但是,你會發現/include/linux目錄下存放的都是編譯核心時真正要用到的系統相關的標頭檔案,而autoconf.h確實也屬於這類標頭檔案,所以放在這裡從邏輯上講也是合情合理。而且編譯時處理起來可能更加方便(就像炒菜時將原材料全部放在手邊一樣)。還有一個原因就是,作者可能故意將auto.conf和autoconf.h分開存放,因為它們兩個的名字太像了~~

因此,最終選擇將autoconf.h放在/include/linux目錄下。

Tips:僅僅是個人分析的結論,如果有更好的看法歡迎交流探討。而且,我覺得autoconf.h放在/include/config目錄下也並沒有什麼不妥,在此提起這個議題主要是為了強調對檔案組織分析的重要性,引導大家以分析代替死記硬背,因為Linux實在是太龐大了。


3 核心設定的底層思想

Linux之所以可以任意裁剪,支援多款處理器架構,就是因為具有強大的設定體系。

支援單一處理器架構或單一功能的程式碼,設計思想是設計的功能即支援的功能。簡單來說就是——存在的模組即為有效的模組。

設定思想 則將「存在即有效」改進為「存在不一定有效」,將 存在與否有效與否 區分開來(相當於增加了一層設定層)。概念的拆分反映到程式碼上就是增加一層,雖然層數增加了,但功能變得靈活和強大了。

這種 設定思想 也可以遷移到我們平時的工程程式碼中,使程式碼可以支援更多的裝置和擁有更靈活的裁剪特性,設計出強大的平臺軟體。


<完>