linux cpu管理(一) cpu初始化

本文基於以下軟硬件假定:

架構:AARCH64

內核版本:5.14.0-rc5

1 為什麼需要管理cpu

  cpu作為計算機系統的核心,主要執行運算和控制功能。在程序員眼中,隻需要為其提供合適的電源和時鐘,它就可以從指定位置開始讀取和執行指令。因此,在傳統的單核系統中,操作系統並不需要對cpu做特殊的管理。

  由於cpu的執行速度與其運行頻率相關,因此在摩爾定律的驅動下,起先英特爾等芯片產商主要通過提高單核主頻的方式,來提高cpu性能。但是隨著芯片頻率的提高,其運行功耗也會成指數級上升,因此在頻率提高到一定程度之後,繼續提升的難度就變得越來越大。

  為此,芯片產商改變瞭設計思路,轉而通過在同一個die上集成多個相同的cpu核心來實現性能提升,這就是我們平常所說的smp。由於系統啟動時主要執行一些鏡像加載,以及軟硬件初始化相關的任務。而這些流程並沒有並行執行的需求,因此smp系統通常都由一個主cpu執行啟動流程。而其它cpu則會等到操作系統初始化完成之後才會啟動。

  更進一步,雖然smp系統的性能很強,但實際上很多時候並不需要這麼高的計算能力,如我們當前隻是使用瀏覽網頁或聽音樂等功能,此時完全沒必要使用多個工作在最高頻率的cpu核。若不對其做相應的管理,這種cpu性能的浪費會造成系統功耗增加。特別是對於移動設備,可能會嚴重影響其續航能力。

  為此,需要對cpu的功耗做更精細的管理,如在負載較低時調低cpu的頻率和電壓,當cpu進入idle狀態時關閉其時鐘,甚至將某些cpu完全從系統中移除等。以上這些功能的實現,首先自然離不開硬件的支持,其次也需要軟件為其提供相應的驅動程序和管理策略,這也是為什麼內核需要提供cpu管理相關模塊的原因。在這個系列中,我們將以aarch64架構為例,按以下順序分別介紹這些模塊的原理和實現機制:(1)cpu參數的初始化流程

(2)smp cpu的啟動流程

(3)cpu hotplug原理和實現

(4)cpu idle原理和實現

(5)cpu dvfs原理和實現

其中本文主要介紹第一部分<cpu參數的初始化流程>,它包含以下內容:(1)內核如何標識cpu id

(2)如何組織cpu的拓撲結構

(3)cpu的狀態定義

2 如何標識cpu id

  arm64在smp系統中會為每個處理器分配一個表示其affinity關系的寄存器mpidr,該寄存器標識瞭不同處理器之間的親和度。如位於相同cluster的處理器親和度更高,在它們之間遷移進程的代價比跨cluster之間的遷移更小,因而可以給調度器的負載均衡策略提供參考。以下為其寄存器定義:

  由於在系統中每個處理器都具有唯一的mpidr值,因此它又可以被用於標識cpu的硬件id。與其它設備一樣,arm64架構通過dts來配置每個cpu的硬件id,其示例格式如下:

cpu0: cpu@0 {
compatible = "arm,cortex-a53";
device_type = "cpu";
reg = <0x0 0x1>;
enable-method = "psci";
next-level-cache = <&CLUSTER0_L2>;
clocks = <&stub_clock 0>;
operating-points-v2 = <&cpu_opp_table>;
cpu-idle-states = <&CPU_SLEEP &CLUSTER_SLEEP>;
#cooling-cells = <2>;
dynamic-power-coefficient = <311>;
};

赞(0)