一、准備工作
a) 首先,你要有一台PC(這不廢話么^_^),裝好了Linux。
b) 安裝好GCC(這個指的是host gcc,用於編譯生成運行於pc機程序的)、make、ncurses等工具。
c) 下載一份純凈的Linux內核源碼包,並解壓好。
注意,如果你是為當前PC機編譯內核,最好使用相應的Linux發行版的源碼包。
不過這應該也不是必須的,因為我在我的Fedora 13上(其自帶的內核版本是2.6.33.3),就下載了一個標準的內核linux-2.6.32.65.tar.xz,並且順利的編譯安裝成功了,上電重啟都OK的。不過,我使用的.config配置文件,是Fedora 13自帶內核的配置文件,即/lib/moles/`uname -r`/build/.config
d) 如果你是移植Linux到嵌入式系統,則還要再下載安裝交叉編譯工具鏈。
例如,你的目標單板CPU可能是arm或mips等cpu,則安裝相應的交叉編譯工具鏈。安裝後,需要將工具鏈路徑添加到PATH環境變數中。例如,你安裝的是arm工具鏈,那麼你在shell中執行類似如下的命令,假如有類似的輸出,就說明安裝好了。
[root@localhost linux-2.6.33.i686]# arm-linux-gcc --version
arm-linux-gcc (Buildroot 2010.11) 4.3.5
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for ing conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
註:arm的工具鏈,可以從這里下載:回復「ARM」即可查看。
二、設置編譯目標
在配置或編譯內核之前,首先要確定目標CPU架構,以及編譯時採用什麼工具鏈。這是最最基礎的信息,首先要確定的。
如果你是為當前使用的PC機編譯內核,則無須設置。
否則的話,就要明確設置。
這里以arm為例,來說明。
有兩種設置方法():
a) 修改Makefile
打開內核源碼根目錄下的Makefile,修改如下兩個Makefile變數並保存。
ARCH := arm
CROSS_COMPILE := arm-linux-
注意,這里cross_compile的設置,是假定所用的交叉工具鏈的gcc程序名稱為arm-linux-gcc。如果實際使用的gcc名稱是some-thing-else-gcc,則這里照葫蘆畫瓢填some-thing-else-即可。總之,要省去名稱中最後的gcc那3個字母。
b) 每次執行make命令時,都通過命令行參數傳入這些信息。
這其實是通過make工具的命令行參數指定變數的值。
例如
配置內核時時,使用
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
編譯內核時使用
make ARCH=arm CROSS_COMPILE=arm-linux-
注意,實際上,對於編譯PC機內核的情況,雖然用戶沒有明確設置,但並不是這兩項沒有配置。因為如果用戶沒有設置這兩項,內核源碼頂層Makefile(位於源碼根目錄下)會通過如下方式生成這兩個變數的值。
SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
-e s/arm.*/arm/ -e s/sa110/arm/ \
-e s/s390x/s390/ -e s/parisc64/parisc/ \
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
-e s/sh[234].*/sh/ )
ARCH?= $(SUBARCH)
CROSS_COMPILE ?=
經過上面的代碼,ARCH變成了PC編譯機的arch,即SUBARCH。因此,如果PC機上uname -m輸出的是ix86,則ARCH的值就成了i386。
而CROSS_COMPILE的值,如果沒配置,則為空字元串。這樣一來所使用的工具鏈程序的名稱,就不再有類似arm-linux-這樣的前綴,就相當於使用了PC機上的gcc。
最後再多說兩句,ARCH的值還需要再進一步做泛化。因為內核源碼的arch目錄下,不存在i386這個目錄,也沒有sparc64這樣的目錄。
因此頂層makefile中又構造了一個SRCARCH變數,通過如下代碼,生成他的值。這樣一來,SRCARCH變數,才最終匹配到內核源碼arch目錄中的某一個架構名。
SRCARCH := $(ARCH)
ifeq ($(ARCH),i386)
SRCARCH := x86
endif
ifeq ($(ARCH),x86_64)
SRCARCH := x86
endif
ifeq ($(ARCH),sparc64)
SRCARCH := sparc
endif
ifeq ($(ARCH),sh64)
SRCARCH := sh
endif
三、配置內核
內核的功能那麼多,我們需要哪些部分,每個部分編譯成什麼形式(編進內核還是編成模塊),每個部分的工作參數如何,這些都是可以配置的。因此,在開始編譯之前,我們需要構建出一份配置清單,放到內核源碼根目錄下,命名為.config文件,然後根據此.config文件,編譯出我們需要的內核。
但是,內核的配置項太多了,一個一個配,太麻煩了。而且,不同的CPU架構,所能配置的配置項集合,是不一樣的。例如,某種CPU的某個功能特性要不要支持的配置項,就是與CPU架構有關的配置項。所以,內核提供了一種簡單的配置方法。
以arm為例,具體做法如下。
a) 根據我們的目標CPU架構,從內核源碼arch/arm/configs目錄下,找一個與目標系統最接近的配置文件(例如s3c2410_defconfig),拷貝到內核源碼根目錄下,命名為.config。
注意,如果你是為當前PC機編譯內核,最好拷貝如下文件到內核源碼根目錄下,做為初始配置文件。這個文件,是PC機當前運行的內核編譯時使用的配置文件。
/lib/moles/`uname -r`/build/.config
這里順便多說兩句,PC機內核的配置文件,選擇的功能真是多。不編不知道,一編才知道。Linux發行方這樣做的目的,可能是想讓所發行的Linux能夠滿足用戶的各種需求吧。
b) 執行make menuconfig對此配置做一些需要的修改,退出時選擇保存,就將新的配置更新到.config文件中了。
注
❷ linux cpu管理(六) cpu動態調頻總體架構
本文基於以下軟硬體假定:架構:AARCH64 內核版本:5.14.0-rc51
隨著技術的發展,當前soc中的cpu主頻一般都超過了1Ghz。主頻越高,功耗越大,主要體現在晶體管在單位時間內的開關次數增多,動態功耗增加,以及供電電壓升高以保證數字電路邏輯正確。然而,在負載較輕時,系統無需運行在最高主頻,尤其是對於手機等移動設備,這直接影響了其續航能力。通過動態調整cpu頻率和電壓,可以減少功率消耗,提升續航,cpufreq就是內核為此定義的一套管理框架。
cpufreq總體架構主要分為以下幾個方面:確定頻率調節范圍、動態調節頻率和電壓、確定頻率調節周期及觸發時機、實現頻率調節工作。框架還需要考慮cpu的工作電壓與頻率的關系,一般soc會提供一些頻點組合,稱為operation performance points(opp),這些頻點組合用於cpu頻率切換時的電壓調整。
cpufreq包含多個輔助模塊,如cpufreq stats用於搜集統計數據,cpufreq qos在頻率限制值改變時通知cpufreq模塊調整到新值,cpufreq notifier則通知對cpu頻率切換或policy對應governor發生改變感興趣的模塊。
在內核中,抽象出了一個opp組件來管理電壓和頻率組合,當cpufreq執行頻率切換時,從opp表中選擇合適的頻率電壓值,通過opp介面,調用clk和regulator操作函數實現實際的調頻調壓操作。
總結而言,內核cpufreq模塊的總體架構包括確定頻率范圍、動態調節頻率和電壓、頻率調節周期及觸發時機的管理、實際頻率調節工作、輔助模塊、電壓和頻率組合管理、opp組件、數據結構、governor和driver的結構定義等。
❸ Linux內核-ARM處理器架構和x86處理器架構比較
深入探討:Linux內核中的ARM與X86處理器架構差異
當我們談論CPU,盡管人們普遍了解其基本概念,但對於ARM和X86架構的區別,許多人可能知之甚少。這兩者在Linux內核中扮演著關鍵角色,讓我們一起來解構它們的獨特特性。
x86架構:Intel的主導力量
自40多年的發展歷程以來,x86一直是個人電腦和伺服器市場的主流,Intel憑借其強大的技術和不斷迭代的處理器設計,如x86-64(x64)架構,維持著其主導地位。然而,Intel並未直接發展64位指令集,而是通過IA64項目推出了Itanium系列,展現了其在技術轉型中的決斷力。
ARM架構:移動端的革新者
ARM則專注於低功耗設計,特別在移動端取得了顯著成功。ARM64位伺服器的崛起,展示了其在伺服器市場的異軍突起。big.LITTLE架構是ARM的一大創新,它允許處理器內核的性能和功耗有所差異,這種異構計算技術在移動設備中提供了出色的能效平衡,特別是在運行高負載應用時,可以無縫切換到高性能核。
盡管X86以其高性能和市場佔有率見長,ARM的靈活性和節能優勢使其在特定領域如移動設備和伺服器市場中占據了一席之地。在Linux內核中,理解這兩種架構的差異對於優化性能和能耗至關重要。