You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM64 Linux中cpu_context结构体仅含x19及以上寄存器的原因

ARM64 Linux中cpu_context仅保存x19及以上寄存器的原因?

在Linux 5.10.0的arch/arm64/include/asm/processor.h中,用于任务切换保存寄存器的cpu_context结构体定义如下:

struct cpu_context {
    unsigned long x19;
    unsigned long x20;
    unsigned long x21;
    unsigned long x22;
    unsigned long x23;
    unsigned long x24;
    unsigned long x25;
    unsigned long x26;
    unsigned long x27;
    unsigned long x28;
    unsigned long fp;
    unsigned long sp;
    unsigned long pc;
};

该结构体包含在thread_struct中,用于进程切换时保存硬件上下文。

参考《深入理解Linux内核》第三版第105页针对x86架构的描述:

每个进程描述符都包含一个名为thread、类型为thread_struct的字段,内核在切换出进程时会将硬件上下文保存其中。后续我们会看到,该数据结构包含大部分CPU寄存器的字段,但通用寄存器如eax、ebx等除外,这些寄存器保存在内核模式栈中。

核心解释

ARM64的上下文切换设计严格遵循架构的寄存器调用约定,同时结合内核栈的分工,不需要在cpu_context中保存所有寄存器:

  • 调用者保存寄存器(x0-x18)无需在此保存:这类寄存器的状态由调用者负责维护。当进程进入内核态(比如系统调用、中断触发)时,入口汇编代码会自动将这些寄存器压入当前进程的内核栈;调度器作为调用方,切换进程时不需要保留这些寄存器的值——调用者如果需要保留,早就自行处理了。
  • 被调用者保存寄存器(x19-x28、fp)必须在此保存:这类寄存器的状态必须由被调用者(即被切换出去的进程)负责保留,确保下次恢复执行时能回到正确的状态。它们不会被自动压入内核栈,因此需要内核主动保存到cpu_context中。
  • sp和pc是上下文核心:栈指针sp和程序计数器pc是进程执行的关键状态,必须单独保存,保证恢复进程时能回到正确的执行位置和栈环境。

内容的提问来源于stack exchange,提问作者Chan Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:48:09