Linux内核Arm64用户态
💡
原文中文,约8500字,阅读约需21分钟。
📝
内容提要
本文探讨了Arm64内核如何调用用户态程序。用户态程序的入口地址存储在ELF文件中,内核通过调度机制切换到内核态,再利用特权寄存器和ERET指令切换回用户态。首次调用会引发向量异常,经过异常处理后再次调用用户态程序。整体流程显示Arm64与X64的显著差异。
🎯
关键要点
- Arm64内核调用用户态程序的过程涉及内核态和用户态的切换。
- 用户态程序的入口地址存储在ELF文件中,内核通过调度机制切换到内核态。
- 内核通过调度功能将用户态入口地址存储到队列中,待调度时运行。
- 首次调用用户态程序会引发向量异常,经过异常处理后再次调用用户态程序。
- ret_to_user函数通过ERET指令从内核模式返回到用户模式。
- ELR_EL1寄存器保存了异常处理返回后的地址,即用户态入口地址。
- Arm64内核的向量异常选项包括同步异常、IRQ、FIQ和错误等。
- 用户态的调用是通过内核态调度填充特权寄存器实现的。
- Arm64与X64在用户态调用的机制上存在显著差异。
➡️