簡(jiǎn)單講解Linux PSCI框架
說明:
Kernel版本:4.14
ARM64處理器
使用工具:Source Insight 3.5, Visio
1. 介紹
PSCI, Power State Coordination Interface
,由ARM定義的電源管理接口規(guī)范,通常由Firmware來(lái)實(shí)現(xiàn),而Linux系統(tǒng)可以通過smc/hvc
指令來(lái)進(jìn)入不同的Exception Level
,進(jìn)而調(diào)用對(duì)應(yīng)的實(shí)現(xiàn)。
那問題來(lái)了?為什么要把這個(gè)放到Firmware中去實(shí)現(xiàn)呢?原因是ARMv8架構(gòu),引入了Virtualization,Security等概念,CPU boot、shutdown、suspend/resumen等操作不再如傳統(tǒng)那樣單純了。我們不再是我們,我們依然是我們。
2. 分析
代碼路徑:arch/arm64/kernel/psci.c drivers/firmware/psci.c
2.1 總體框架
Linux對(duì)CPU core的操作抽象出了結(jié)構(gòu)struct cpu_operations
,開放給上層軟件調(diào)用,struct cpu_operations
統(tǒng)一對(duì)底層的CPU及power等資源進(jìn)行統(tǒng)一操作,完美。今天我們的故事就從struct cpu_operations
開始。
話不多說,直接上圖分析

CPU Operation
有兩種方式:spin-table
和psci
,這個(gè)由Device Tree來(lái)指定,顯然我們今天說的是psci
,以cpu_psci_ops
為核心;cpu_psci_ops
中的函數(shù)指針在arch/arm64/kernel/psci.c
中進(jìn)行賦值,而實(shí)際的實(shí)現(xiàn)中去調(diào)用了psci_ops
中的實(shí)現(xiàn);psci_ops
中會(huì)根據(jù)實(shí)際的Function ID找到對(duì)應(yīng)的函數(shù),從而通過hvc/smc
指令調(diào)用Firmware接口;說一個(gè)實(shí)際的用例吧:比如你現(xiàn)在需要把系統(tǒng)Suspend,在用戶輸入echo mem > /sys/power/state時(shí)
,最終會(huì)調(diào)用到cpu_suspend
函數(shù),由上圖可知,最終也能調(diào)用到底層的Firmware,當(dāng)然,前提是Firmware中已經(jīng)實(shí)現(xiàn)了該接口。
所以,現(xiàn)在看起來(lái)PSCI其實(shí)就是去實(shí)現(xiàn)調(diào)用底層Firmware的接口,并且填充到對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)中就行了。
目前在內(nèi)核中有三個(gè)版本的PSCI,分別是:PSCI V0.1/, PSCI V0.2/, PSCI V1.0
,對(duì)應(yīng)的psci_of_match[]
一目了然:
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ?


2.1 PSCI v0.1分析
下邊分析下PSCI v0.1吧
我們從哪里來(lái)?要到哪里去?老規(guī)矩,直接上圖

從
setup_arch
開始跟蹤,能看到入口為psci_dt_init()
,從而跳轉(zhuǎn)到driver/firmware/psci.c
中的函數(shù)中;psci_dt_init()
會(huì)去讀取并解析Device Tree中的內(nèi)容,從而選擇版本(psci_0_1_init/psci_0_2_init),選擇指令(hvc/smc)等;psci_0_1_init()
函數(shù)完成的主要內(nèi)容其實(shí)是填充對(duì)應(yīng)的函數(shù)指針,以及psci_function_id[]
數(shù)組;
那么如何從Device Tree到實(shí)際的解析和配置中來(lái)的呢?下面以arch/arm/boot/dts/xenvm-4.2.dts
為例:
設(shè)備樹是這樣子的

解析的框架是這樣子的

2.2 PSCI v0.2及以上與PSCI v0.1的區(qū)別
代碼區(qū)別:PSCI v0.2支持 CPU Suspend,CPU Migrate等操作,也就是功能更全,顯然我說的這個(gè)是廢話,代碼說明一切;
DeviceTree的區(qū)別:
原文作者:LoyenWang
