简单讲解Linux PSCI框架
说明:
Kernel版本:4.14
ARM64处理器
使用工具:Source Insight 3.5, Visio
1. 介绍
PSCI, Power State Coordination Interface
,由ARM定义的电源管理接口规范,通常由Firmware来实现,而Linux系统可以通过smc/hvc
指令来进入不同的Exception Level
,进而调用对应的实现。
那问题来了?为什么要把这个放到Firmware中去实现呢?原因是ARMv8架构,引入了Virtualization,Security等概念,CPU boot、shutdown、suspend/resumen等操作不再如传统那样单纯了。我们不再是我们,我们依然是我们。
2. 分析
代码路径:arch/arm64/kernel/psci.c drivers/firmware/psci.c
2.1 总体框架
Linux对CPU core的操作抽象出了结构struct cpu_operations
,开放给上层软件调用,struct cpu_operations
统一对底层的CPU及power等资源进行统一操作,完美。今天我们的故事就从struct cpu_operations
开始。
话不多说,直接上图分析

CPU Operation
有两种方式:spin-table
和psci
,这个由Device Tree来指定,显然我们今天说的是psci
,以cpu_psci_ops
为核心;cpu_psci_ops
中的函数指针在arch/arm64/kernel/psci.c
中进行赋值,而实际的实现中去调用了psci_ops
中的实现;psci_ops
中会根据实际的Function ID找到对应的函数,从而通过hvc/smc
指令调用Firmware接口;说一个实际的用例吧:比如你现在需要把系统Suspend,在用户输入echo mem > /sys/power/state时
,最终会调用到cpu_suspend
函数,由上图可知,最终也能调用到底层的Firmware,当然,前提是Firmware中已经实现了该接口。
所以,现在看起来PSCI其实就是去实现调用底层Firmware的接口,并且填充到对应的数据结构中就行了。
目前在内核中有三个版本的PSCI,分别是:PSCI V0.1/, PSCI V0.2/, PSCI V1.0
,对应的psci_of_match[]
一目了然:
【文章福利】小编推荐自己的Linux内核技术交流群:【749907784】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码)


2.1 PSCI v0.1分析
下边分析下PSCI v0.1吧
我们从哪里来?要到哪里去?老规矩,直接上图

从
setup_arch
开始跟踪,能看到入口为psci_dt_init()
,从而跳转到driver/firmware/psci.c
中的函数中;psci_dt_init()
会去读取并解析Device Tree中的内容,从而选择版本(psci_0_1_init/psci_0_2_init),选择指令(hvc/smc)等;psci_0_1_init()
函数完成的主要内容其实是填充对应的函数指针,以及psci_function_id[]
数组;
那么如何从Device Tree到实际的解析和配置中来的呢?下面以arch/arm/boot/dts/xenvm-4.2.dts
为例:
设备树是这样子的

解析的框架是这样子的

2.2 PSCI v0.2及以上与PSCI v0.1的区别
代码区别:PSCI v0.2支持 CPU Suspend,CPU Migrate等操作,也就是功能更全,显然我说的这个是废话,代码说明一切;
DeviceTree的区别:
原文作者:LoyenWang
