assembly arm svc指令是如何工作的?[副本]

de90aj5v  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(123)

此问题已在此处有答案

ARM assembly code and SVC numbering(3个答案)
昨天关门了。
SVC(SWI)指令如何工作?它把管理程序调用ID和其他数据放在哪里?从何处获取所有管理程序调用ID、其参数和返回类型的列表?
我试着在谷歌上找到这些,但它只显示了无用的东西,没有关于主管电话的信息。文档的需求数据量也太小

oug3syen

oug3syen1#

我将在这里描述AArch 64,但AArch 32是类似的。我还将举一个典型的例子,其中svc在EL 0(“用户模式”)被调用,在EL 1(“内核模式”)被处理。下面所有内容的权威参考是Armv 8-A架构参考手册(ARM),版本I. a。
与x86 int指令不同,svc的立即操作数在确定异常处理程序的向量方面没有作用。相反,向量总是通过从系统寄存器VBAR_EL1获取向量基址并添加由异常类型和异常级别确定的偏移量来获得。参见ARM中的表R_RYXCL。在本例中,由于svc是来自使用AArch 64的较低异常级别的同步异常,因此偏移量为0x400
ARM上的异常处理包括将“校正子”代码存储到ESR_EL1中,并且在svc的情况下,立即操作数被存储为校正子的低16位。参见C6.2.365中的svc说明。CPU本身不会对操作数值做任何进一步的处理。因此,由操作系统设计人员决定如何(或是否)使用此值。因此,您必须查阅操作系统的文档,以了解它的功能(如果有的话)。有关调用约定、寄存器内容、返回值等的信息也将由操作系统指定为其ABI的一部分,尽管大多数使用AArch64 Procedure Call Standard的一些变体。
OS ABI可以被设计成使得它使用该值来指定要执行什么服务。然而,许多操作系统并不这样做,而是让程序在一个通用寄存器中用系统调用号指定服务。这就是Linux所做的;它期望在x8中传递系统调用号,并且直接忽略svc的立即操作数。有关Linux的不同系统调用号的含义以及它们所期望的参数的表格可以在www.example.com上找到https://chromium.googlesource.com/chromiumos/docs/+/HEAD/constants/syscalls.md#arm64-64_bit。每个命名系统调用(writeopen等)的实际行为可以在其手册页中找到。

相关问题