Hyp辅助配置寄存器 - ARM虚拟化扩展关键组件
HACR(Hyp Auxiliary Configuration Register)是ARM架构中一个特殊的系统寄存器,主要用于控制非安全世界(Non-secure)EL1或EL0异常级别中特定实现定义的功能是否陷入到Hyp模式(EL2)进行处理。
简单来说,HACR寄存器就像一个"开关控制器",允许Hypervisor(运行在EL2的虚拟化管理器)监控和拦截非安全世界中某些特定硬件功能的使用。这些功能的具体内容由芯片厂商自定义实现,ARM架构标准不统一规定。
当HACR中的某些位被设置时,非安全世界尝试使用相关功能就会触发陷阱(trap),使处理器切换到EL2异常级别,让Hypervisor有机会介入处理。
HACR只能在EL2或EL3(安全监控模式)下访问,使用MRC和MCR指令进行读写操作:
// 读取HACR寄存器到通用寄存器R0
MRC p15, 4, R0, c1, c1, 7
// 将通用寄存器R0的值写入HACR寄存器
MCR p15, 4, R0, c1, c1, 7
需要注意的是,访问这个寄存器需要满足特定条件:
32位寄存器,所有位都是实现定义的(IMPLEMENTATION DEFINED)
热复位(Warm reset)后值为架构未知(UNKNOWN)状态
AArch32的HACR[31:0]映射到AArch64的HACR_EL2[31:0]
在Linux KVM虚拟化中,HACR可用于监控客户机对特定硬件功能的访问:
// 在KVM初始化过程中设置HACR陷阱
void configure_hacr_trapping(void)
{
u32 hacr_value = 0;
// 设置需要监控的功能位(具体位取决于芯片实现)
hacr_value |= HACR_TRAP_CUSTOM_FEATURE;
// 写入HACR寄存器
write_sysreg(hacr_value, HACR_EL2);
// 配置陷阱处理程序
install_trap_handler(EL2_TRAP_HACR, handle_hacr_trap);
}
在ATF中,HACR可以用于安全监控场景:
// 在EL3设置HACR以监控非安全世界的特定操作
void el3_monitor_ns_operations(void)
{
if (get_el() == EL3) {
// 只在非安全状态下配置HACR
if (read_scr() & SCR_NS_BIT) {
// 设置需要监控的实现定义功能
uint32_t hacr_config = get_platform_hacr_settings();
write_hacr(hacr_config);
}
}
}
在OP-TEE安全环境中,可以通过监控HACR来增强系统安全性:
// 在安全世界中监控非安全世界对特定硬件的访问
void tee_secure_monitoring_init(void)
{
// 配置HACR以陷阱非安全世界对安全相关功能的访问
uint32_t hacr_value = get_secure_hacr_config();
// 通过EL3或EL2设置HACR(取决于具体实现)
configure_hacr_trapping(hacr_value);
// 注册陷阱处理程序
register_trap_handler(HACR_TRAP_VECTOR, handle_hacr_secure_trap);
}
// HACR陷阱处理函数
static void handle_hacr_secure_trap(struct trap_context *ctx)
{
// 分析陷阱原因并采取适当安全措施
uint32_t trapped_function = analyze_hacr_trap(ctx);
// 记录安全事件或采取应对措施
log_security_event(HACR_TRAP_EVENT, trapped_function);
// 根据需要模拟或拒绝该功能访问
handle_trapped_operation(ctx, trapped_function);
}
使用HACR时需要特别注意: