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
相关产品推荐
相关产品推荐

