性能优化特性之:E0PD

简介: 本文介绍了倚天实例上进行安全特性关闭以提升性能的特性:E0PD,并且从优化原理、使用方法、性能收益等方面做了详细阐述。

优化原理

E0PD是ARMv8.5扩展引入的一个硬件防护特性,它用来替代KPTI避免来自用户态的Meltdown漏洞攻击。KPTI技术通过在返回用户态时unmap kernel space的方式避免内核地址空间的暴露,因此在退出内核态时unmap内核页表以及在进入内核态时重新映射内核页表会带来极大性能开销。E0PD在硬件侧防护内核地址空间从而使内核可以绕过KPTI,因而带来性能提升。

在内核优化方面,开启E0PD绕过KPTI的代码如下(省略一些无关的代码片段)。在boot阶段,内核调用unmap_kernel_at_el0函数检测是否需要开启KPTI unmap内核地址空间功能,其中的重要一项检测就是调用kaslr_requires_kpti,在此函数内检查硬件是否支持E0PD并且内核是否打开E0PD,若是则返回false,表示不需要启用KPTI功能。

static int __kpti_forced; /* 0: not forced, >0: forced on, <0: forced off */
static bool unmap_kernel_at_el0(const struct arm64_cpu_capabilities *entry,
        int scope)
{
  …………
  /* Useful for KASLR robustness */
  if (kaslr_requires_kpti()) {
    if (!__kpti_forced) {
      str = "KASLR";
      __kpti_forced = 1;
    }
  }
  …………
  /* Forced? */
  if (__kpti_forced) {
    pr_info_once("kernel page table isolation forced %s by %s\n",
           __kpti_forced > 0 ? "ON" : "OFF", str);
    return __kpti_forced > 0;
  }
  …………
}
/*
 * This check is triggered during the early boot before the cpufeature
 * is initialised. Checking the status on the local CPU allows the boot
 * CPU to detect the need for non-global mappings and thus avoiding a
 * pagetable re-write after all the CPUs are booted. This check will be
 * anyway run on individual CPUs, allowing us to get the consistent
 * state once the SMP CPUs are up and thus make the switch to non-global
 * mappings if required.
 */
bool kaslr_requires_kpti(void)
{
  if (!IS_ENABLED(CONFIG_RANDOMIZE_BASE))
    return false;
  /*
   * E0PD does a similar job to KPTI so can be used instead
   * where available.
   */
  if (IS_ENABLED(CONFIG_ARM64_E0PD)) {
    u64 mmfr2 = read_sysreg_s(SYS_ID_AA64MMFR2_EL1);
    if (cpuid_feature_extract_unsigned_field(mmfr2,
            ID_AA64MMFR2_E0PD_SHIFT))
      return false;
  }
  /*
   * Systems affected by Cavium erratum 24756 are incompatible
   * with KPTI.
   */
  if (IS_ENABLED(CONFIG_CAVIUM_ERRATUM_27456)) {
    extern const struct midr_range cavium_erratum_27456_cpus[];
    if (is_midr_in_range_list(read_cpuid_id(),
            cavium_erratum_27456_cpus))
      return false;
  }
  return kaslr_offset() > 0;
}

使用方法

使用Alinux3.2208及以后版本

Alinux3在2208版本(内核版本5.10.134)已默认启用 说明:从upstream打上E0PD相关patch(anck 5.10已经合入),

  • 3e6c69a arm64: Add initial support for E0PD
  • 92ac6fd arm64: Don't use KPTI where we have E0PD

编译内核时启用E0PD特性

如果需要自己编译内核,可以在编译参数中打开E0PD配置

CONFIG_ARM64_E0PD=y

性能收益

KPTI的内核地址空间map、unmap操作在通用路径上,所以E0PD对KPTI的优化影响广泛。在我们的测试中,E0PD优化对基础benchmark和E2E应该都带来了5-23%的大幅度性能提升。




---------------------------------------------------------------------------------------

更多调优信息,请参考:

龙蜥社区:https://openanolis.cn/

KeenTune SIG:https://openanolis.cn/sig/KeenTune

阿里云龙蜥操作系统专区:https://developer.aliyun.com/group/aliyun_linux

相关文章
|
监控 调度 开发工具
IO神器blktrace使用介绍
## 前言 1. blktrace的作者正是block io的maintainer,开发此工具,可以更好的追踪IO的过程。 2. blktrace 结合btt可以统计一个IO是在调度队列停留的时间长,还是在硬件上消耗的时间长,利用这个工具可以协助分析和优化问题。 ## blktrace的原理 一个I/O请求的处理过程,可以梳理为这样一张简单的图: ![](http://image
22243 0
|
2月前
|
人工智能 缓存 自然语言处理
Claude Code 原生终端仪表盘
Claude Code 内置 `statusline` 命令,支持自定义终端底部状态栏:实时显示模型、目录、Git 分支、Token 消耗、缓存命中率及上下文进度条。三种配置方式——自然语言指令、脚本手动设置或 ChatGPT 辅助设计,兼顾简洁性与信息密度,显著提升 AI 编程的上下文掌控感。(239字)
432 0
|
10月前
|
自然语言处理 测试技术 API
通义Qwen3-Max:大就是好
通义千问Qwen3-Max正式发布,参数超1T,训练稳定高效,在代码、推理、多语言等任务中表现卓越。预览版已登顶LMArena榜单前三,支持阿里云百炼API调用与Qwen Chat体验,敬请试用。
4653 32
|
安全 数据库 存储
数据库设计基石:一文搞懂 1NF、2NF、3NF 三大范式
数据库设计常遇数据冗余、增删改异常?根源往往是表结构不规范。本文带你轻松掌握数据库三大范式——1NF、2NF、3NF,从原子列到消除依赖,层层递进,提升数据一致性与可维护性,让数据库设计更高效、安全!#数据库 #范式设计
4258 0
|
机器学习/深度学习 存储 安全
前沿探索:声纹识别在安全与隐私保护中的应用与挑战
【10月更文挑战第16天】随着信息技术的发展,生物特征识别技术因其便捷性和安全性而受到了越来越多的关注。声纹识别作为一种非接触式的生物特征认证手段,正在被广泛应用于身份验证、安全支付等领域。本文将探讨声纹识别在实际应用中的最新进展,特别是其在安全与隐私保护方面的作用,并讨论其面临的挑战及未来的革新方向。
1847 2
|
人工智能 数据挖掘 Linux
Centos安装Python3.7(亲测可用)
本指南详细介绍了在基于Linux(以CentOS系统为例,使用yum包管理器)的系统上安装Python 3.7版本的完整流程。Python是一种广泛使用的高级编程语言,在各种领域如软件开发、数据分析、人工智能和区块链开发等都有着重要的应用。
948 2
|
弹性计算
阿里云服务器公网带宽收费标准:按固定带宽和使用流量计费规则
阿里云ECS公网带宽提供两种计费模式:按固定带宽和按使用流量计费。按固定带宽适合稳定需求场景,费用基于带宽值与使用时长;按使用流量计费适用于波动需求场景,按实际流量线性收费。出网流量收费,入网免费,带宽限制分别为100 Mbps(按流量)和200 Mbps(包年包月)。用户可根据业务特点选择最优方案,结合CDT免费流量额度进一步降低成本。详情参考官方文档。
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
604 16