欢迎光临散文网 会员登陆 & 注册

简单讲解Linux PSCI框架

2022-12-09 15:22 作者:补给站Linux内核  | 我要投稿

说明:

  1. Kernel版本:4.14

  2. ARM64处理器

  3. 使用工具: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-tablepsci,这个由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



简单讲解Linux PSCI框架的评论 (共 条)

分享到微博请遵守国家法律