简单讲解Linux PSCI框架

news2024/11/20 21:27:30

说明:

  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等操作不再如传统那样单纯了。我们不再是我们,我们依然是我们。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

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[]一目了然:

static const struct of_device_id psci_of_match[] __initconst = {

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的区别:
Case 1: PSCI v0.1 only.

        psci {
                compatible      = "arm,psci";
                method          = "smc";
                cpu_suspend     = <0x95c10000>;
                cpu_off         = <0x95c10001>;
                cpu_on          = <0x95c10002>;
                migrate         = <0x95c10003>;
        };

Case 2: PSCI v0.2 only

        psci {
                compatible      = "arm,psci-0.2";
                method          = "smc";
        };

Case 3: PSCI v0.2 and PSCI v0.1.

        A DTB may provide IDs for use by kernels without PSCI 0.2 support,
        enabling firmware and hypervisors to support existing and new kernels.
        These IDs will be ignored by kernels with PSCI 0.2 support, which will
        use the standard PSCI 0.2 IDs exclusively.

        psci {
                compatible = "arm,psci-0.2", "arm,psci";
                method = "hvc";

                cpu_on = < arbitrary value >;
                cpu_off = < arbitrary value >;

                ...
        };


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

014 | 探讨京族民间传说中的海洋文化特质 | 大学生创新训练项目申请书 | 极致技术工厂

&#xff08;一&#xff09;研究目的 京族是我国56个民族中唯一一个生活在海边的少数民族&#xff0c;这一特殊的少数民族位于我国西南沿海边陲&#xff0c;有着独具特色的海洋文化。渔民的海神信仰、特殊的舞蹈和乐器积淀了京族丰富的历史文化。以海洋地域为背景、世世代代以海…

神经网络的应用(分类和预测)——python

神经网络的应用一.数据预处理 ​ 由于神经网络输入数据的范围可能特别大&#xff0c;导致神经网络收敛慢、训练时间长。因此在训练神经网络前一般对数据进行预处理(不妨假设这里的指标都是效益型的(即都是正项指标))&#xff0c;一种重要的预处理的处理手段是归一化处理&#…

CMake中set_property/get_property的使用

CMake中的set_property命令用于在给定作用域(scope)内设置命名属性&#xff0c;其格式如下&#xff1a; set_property(<GLOBAL |DIRECTORY [<dir>] |TARGET [<target1> ...] |SOURCE [<src1> ...][DIRECTORY <…

小程序AP配网和AK配网教程(开源)

小程序AP配网和AK配网教程&#xff08;开源&#xff09; 一、 Airkiss配网的实现方式 ​ Airkiss配网我们采用插件的形式&#xff0c;非常简单方便。感谢半颗心脏大佬的开源插件。 1. Airkiss 简介 AirKiss是微信硬件平台为Wi-Fi设备提供的微信配网、局域网发现和局域网通讯…

将两个数组进行竖直(水平)方向的拼接 vstack()和hstack()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将两个数组进行竖直(水平)方向的拼接 vstack()和hstack() [太阳]选择题 以下关于Python代码的选项说法错误的一项是? import numpy as np myArray1np.array([1,2,3]) print("【…

主线程与分支线程的访问、修改

任务1&#xff1a;定义一个全局变量 int a10&#xff0c;主线程能否访问到&#xff0c;分支线程能否访问到&#xff1b; 任务2&#xff1a;分支线程中修改上述的a 20, 问主线程中访问该a&#xff0c;是10还是20; 任务3&#xff1a;在主线程定义一个局部变量int b1&#x…

代码随想录刷题day59 503.下一个更大元素II;42. 接雨水

代码随想录刷题day59 503.下一个更大元素II&#xff1b;42. 接雨水 单调栈的一些应用。 503.下一个更大元素II 503. 下一个更大元素 II - 力扣&#xff08;Leetcode&#xff09; 还是下一个最大元素&#xff0c;主要是掌握循环数组中利用%取余的这个操作&#xff0c;在循环…

微服务框架 SpringCloud微服务架构 28 数据同步 28.1 同步方案分析

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构28 数据同步28.1 同步方案分析28.1.1 数据同步问题分析28.1.2 总结28 数据…

Yarn增加新队列-----hive向Yarn提交任务后,Hadoop再次向Yarn提交任务阻塞

博学之&#xff0c;审问之&#xff0c;慎思之&#xff0c;明辨之&#xff0c;笃行之&#x1f3c2; hive on spark搭建好后&#xff0c;任务提交会有问题&#xff0c;因为通过hive会话提交的任务一直存在且不会结束&#xff08;除非关掉这个hive会话&#xff09;&#xff0c;根本…

微服务框架 SpringCloud微服务架构 27 自动补全 27.4 修改酒店索引库数据结构

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构27 自动补全27.4 修改酒店索引库数据结构27.4.1 案例27 自动补全 27.4 修…

Java中的Unsafe的介绍与使用

Java中的Unsafe的介绍与使用 相关文章 美团-Unsafe JavaGuide-Unsafe 什么是Unsafe&#xff1f;&#xff1f;&#xff1f; 如何创建Unsafe对象&#xff1f; 通过反射获取Unsafe对象&#xff08;案例&#xff09; Unsafe功能简介 1. 内存操作 2. 内存屏障 3. 对象操…

猿如意中的【Sublime Text】开发工具详情介绍

目录 一、工具名称 二、下载安装渠道 2.1 什么是猿如意&#xff1f; 2.2 如何下载猿如意&#xff1f; 2.3 如何在猿如意中下载Sublime Text &#xff1f; 三、sublime text介绍 四、软件安装过程 五、软件界面 六、sublime text功能特点介绍 七、sublime tex…

【UDS】ISO15765-2之协议数据单元

文章目录简介结构格式分类1.单帧SF2.首帧FF3.流控帧FC4.连续帧CF总结->返回总目录<- 简介 网络层协议数据单元&#xff08;N_PDU&#xff0c;Network_Protocol Data Unit&#xff09;。可以理解成是一种规范协议。而汽车电子中通信的报文格式就是以PDU为传输单元&#…

COM通信栈

基于 AUTOSAR 架构的软件层概述 根据分层AUTOSAR 架构&#xff0c;软件开发是按照以下模块&#xff08;层&#xff09;&#xff08;自下而上&#xff09;实现的&#xff1a; 基本软件 (BSW) 层——这包括以下内容&#xff1a; 微控制器抽象层 (MCAL)电子控制单元 (ECU) 抽象层…

海关统计:全国、各省、各城市进出口贸易数据+地级市进出口贸易、对外贸易数据及进出口月度数据

&#xff08;1&#xff09;2004-2019年地级市进出口贸易总额数据 1、数据来源&#xff1a;各城市统计年鉴、省份统计年鉴 2、时间跨度&#xff1a;2004-2019 3、区域范围&#xff1a;全国287个地级市 4、指标说明&#xff1a; 人民币和美元两种计价方式&#xff0c;人民币…

【应用层】P2P、DNS、递归查询、迭代查询、FTP、电子邮件系统、万维网和HTTP

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录应用层---网络层点到点----传输层端到端------应用层为应用提供多样服务---------功能&#xff1a;文件传输、访问、管理ftp---电子邮件smtp---虚拟终端http-让个人用户直接与大型计算机联系&#xff0c;不必…

web期末作业设计网页——开平碉楼(20页)HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

(附源码)SSM财务管理系统 毕业设计 282251

SSM财务管理系统的设计与实现 摘要 现实生活中&#xff0c;许多人风险意识不足&#xff0c;对个人财务风险管理的认识就更少。在进行财务决策时&#xff0c;更多依靠的是以往经验和个人判断&#xff0c;对决策对象缺乏细致的认知、分析和推断&#xff0c;更不用提风险防范与控制…

java中的Collecions类

java.util.Collections类提供了一些静态方法&#xff0c;这些方法能够对List集合实现常用的算法操作&#xff0c;这些算法是排序&#xff0c;填充&#xff0c;移位和查找等。 Collections的常用方法及其简单使用&#xff1a; 代码如下&#xff1a; package Collections; imp…

【考研·计算机组成原理】校验码 小结

本篇目录 前言 一、校验码 1.校验码 2.码距 3.检错与纠错 二、奇偶校验码 三、海明码 1.海明校验码的原理 2.校验位的计算方法 四、CRC码&#xff08;循环冗余校验&#xff09; 总结 前言 跟着王道的考研复习指导&#xff0c;学习了三种校验码&#xff0c;做一个小结。 一、校…