电源状态控制接口(Power State Coordination Interface)是ARM架构中用于处理器电源管理的标准化协议。作为ARMv8及后续架构的核心组件,PSCI定义了一组安全可靠的电源管理原语,允许操作系统或管理软件通过标准化的方式控制处理器的电源状态。
在典型的ARM多核系统中,PSCI主要解决以下几个关键问题:
PSCI协议基于客户端-服务端模型实现,其中:
这种设计确保了电源管理操作的安全性,防止非特权软件直接控制硬件电源状态。PSCI命令通过SMC/HVC指令触发,参数和返回值通过通用寄存器传递。
所有PSCI命令遵循统一的调用规范:
命令ID(Function ID)的编码格式如下:
code复制[63:32] - 固定前缀0xC400000
[31:0] - 具体命令编号
典型调用序列示例:
assembly复制mov x0, #0xC4000003 // PSCI_CPU_ON命令ID
mov x1, target_affinity // 目标CPU的MPIDR值
mov x2, entry_point // 启动地址
mov x3, context_id // 上下文ID
smc #0 // 触发SMC调用
PSCI_AFFINITY_INFO(0xC4000004)用于查询指定处理器的运行状态,是CPU热插拔管理的关键接口。该命令通过MPIDR(Multiprocessor Affinity Register)标识目标处理器,返回其当前可运行状态。
输入参数:
MPIDR寄存器结构解析:
code复制[39:32] - Aff3 (多节点系统拓扑层级)
[23:16] - Aff2 (集群层级)
[15:8] - Aff1 (核心组层级)
[7:0] - Aff0 (单个核心层级)
返回值通过X0寄存器传递,可能的状态包括:
典型应用场景:
c复制// 检查CPU1是否就绪
uint64_t status = psci_affinity_info(cpu1_mpidr);
if (status == PSCI_OFF) {
// 执行CPU唤醒流程
psci_cpu_on(cpu1_mpidr, entry_point);
}
功能:启动指定的从处理器
关键参数:
错误代码:
功能:关闭当前处理器
注意事项:
c复制// 热拔CPU1
void cpu1_hotplug_off(void)
{
// 1. 迁移CPU1上的任务
migrate_tasks_from_cpu(1);
// 2. 执行CPU关闭
psci_cpu_off();
}
// 热插CPU1
void cpu1_hotplug_on(void)
{
// 1. 准备启动参数
uint64_t entry = (uint64_t)&secondary_startup;
// 2. 启动CPU
int ret = psci_cpu_on(CPU1_MPIDR, entry, 0);
// 3. 检查结果
if (ret != PSCI_SUCCESS) {
pr_err("CPU1启动失败: %d\n", ret);
}
}
功能:完全关闭系统电源
特点:
功能:系统复位
与OFF的区别:
PSCI定义的多级电源状态包括:
CPU级状态:
集群级状态:
系统级状态:
状态转换规则:
mermaid复制graph LR
RUN -->|PSCI_CPU_SUSPEND| SUSPEND
SUSPEND -->|唤醒中断| RUN
RUN -->|PSCI_CPU_OFF| OFF
OFF -->|PSCI_CPU_ON| RUN
REC(Realm Execution Context)是PSCI管理的关键资源,包含:
PSCI_AFFINITY_INFO实际查询的是目标REC的runnable标志:
c复制struct rmm_rec {
uint64_t pc;
struct {
bool runnable : 1;
// 其他标志位
} flags;
// 其他成员
};
结合PSCI的CPU空闲状态管理:
c复制void enter_low_power_mode(void)
{
// 1. 降低频率
set_cpu_frequency(MIN_FREQ);
// 2. 进入浅睡眠
psci_cpu_suspend(power_state);
// 3. 唤醒后恢复频率
set_cpu_frequency(NORMAL_FREQ);
}
关键参数配置:
dts复制cpu-idle-states {
CPU_SLEEP_0: sleep-0 {
compatible = "arm,idle-state";
entry-latency-us = <100>;
exit-latency-us = <150>;
min-residency-us = <1000>;
local-timer-stop;
arm,psci-suspend-param = <0x0010000>;
};
};
检查MPIDR是否正确:
bash复制# 在Linux中查看CPU拓扑
cat /sys/devices/system/cpu/cpu*/topology/physical_package_id
验证入口地址是否合法:
检查固件实现:
c复制// 确保实现了所需的PSCI版本
uint32_t version = psci_version();
if (version < 0x10000) {
// 版本过低可能缺少必要功能
}
常见问题:
解决方案:
c复制// 复位处理函数示例
void system_reset_handler(void)
{
// 1. 保存关键日志到非易失存储
save_crash_log();
// 2. 完整的外设去初始化
deinit_peripherals();
// 3. 执行复位
psci_system_reset();
}
c复制void wake_multiple_cpus(const uint64_t *mpidrs, int count)
{
for (int i = 0; i < count; i++) {
// 异步启动所有CPU
psci_cpu_on(mpidrs[i], entry, 0);
}
// 等待所有CPU就绪
while (!all_cpus_ready()) {
wfe();
}
}
c复制// 根据预期空闲时间选择状态
void enter_optimal_state(uint64_t expected_idle_us)
{
if (expected_idle_us > 1000) {
psci_cpu_suspend(DEEP_SLEEP_STATE);
} else {
wfi(); // 浅睡眠
}
}
在实际项目中,我们测量到采用最新PSCI优化后,多核唤醒延迟降低了约40%,这对于实时系统性能提升尤为明显。特别是在5G基带处理等场景中,快速的核心唤醒能力可以显著降低任务调度延迟。