ARM assembly code and SVC numbering

4
在ARM汇编代码中,我可以看到一些类似这样的东西...(尤其是在shellcode中)
svc 0x0090003f
svc 0x001ff3bf
swi 0x0900ff0b

我知道'svc(或swi)'是类似于'int 0x80'或来自英特尔的'SYSENTER'的'supervisor call'。但是,我该如何解释'svc'数字?在哪里可以获取其信息列表?拇指'svc'指令呢?
ARM指令手册似乎没有解释这些问题...
有人能帮我吗?谢谢。

你有例子吗?还是你编造了那些数字?它们看起来太大了,或者至少其中一个。 - auselen
我没有编造那个。 - daehee
3
这些数字与CPU无关,而与操作系统有关。在使用OABI约定的Linux中,它是系统调用号(使用EABI则应为零)。其他操作系统可能有自己的编号方案。在嵌入式世界中,特定约定并不罕见。不知道平台情况下就无法确定。 - Seva Alekseyev
仅仅因为Intel x86系统大量使用int xxh调用,而ARM架构支持类似的功能,并不意味着:1)以相同的方式(使用此功能)是个好主意;2)有标准的svc调用号码列表...实际上并没有,对于通常可能使用这些调用的应用程序来说,许多/大多数并不需要。 - old_timer
3个回答

2
SVC的值存储在ESR寄存器的16位低位中。
ARMv8架构参考手册D12.2.36“ESR_EL1,异常综合寄存器(EL1)”指出,如果EC位为0b010101,则ISS字段记录了来自HVC或SVC指令执行的异常的ISS编码。
该部分然后指出,较低的16位是imm16,如果您查看SVC定义,这是给定16位参数的名称。
最后,你在问题中显示的SVC调用在ARMv8 GNU GAS中无效,因为它们大于16位。例如:
SVC 0xABCDE

正确的翻译应该是:“无法正确组装与:”
Error: immediate value out of range 0 to 65535 at operand 1 -- `svc 0xABCDE

可运行示例
这是一个最小化的aarch64裸机可运行示例,它执行SVC并在处理程序期间打印所有寄存器,包括ESR。https://github.com/cirosantilli/linux-kernel-module-cheat/tree/b1bfd46efebabcba4f1ab1cbddf99611550e2dc2#arm-svc-instruction

-1

6.2.8. SVC处理程序

异常处理程序可能需要确定处理器在发生异常时处于ARM状态还是Thumb状态。

特别是,SVC处理程序可能需要读取处理器状态。这可以通过检查SPSR T位来完成。对于Thumb状态,此位设置为1,对于ARM状态,此位清除为0。

ARM和Thumb指令集都有SVC指令。从Thumb状态调用SVC时,必须考虑以下几点:

指令地址为lr-2,而不是lr-4。

指令本身是16位的,因此需要半字加载,请参见图6.3。

SVC号以8位形式保存,而不是ARM状态下的24位。

了解更多信息,请访问http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203j/Cacdfeci.html


2
我已经看过这个,但它没有解释SVC数字是什么。 - daehee
SVC号码完全是任意的,并且是操作系统实现中与其服务相关的细节。因此,ARM没有提供任何文档。 - marko
thumb2中,数字位置不同,编写通用的所有模式处理程序是非常困难甚至不可能的。因此,最好定义必须在其中调用svc/swi的模式,并且不要将编码放入指令中,而应该放入GPR中... - old_timer
@old_timer,原始指令编码是在系统没有SMP、L1、L2和乱序执行的情况下设计的。在现代ARM系统上检查指令流可能会非常耗时。 - artless noise

-1

从6.2.8. SVC处理程序

每当遇到任何svc/swi,控制将被转移到svc处理程序。在SVC处理程序中,这些数字将用于标识需要调用的子程序,因此处理程序将采用这些索引值并相应地进行处理。

示例6.11. C函数中的SVC处理程序

void C_SVC_handler (unsigned number)
{
    switch (number)
    {
        case 0 :                 /* SVC number 0 code */
            ...
            break;
        case 1 :                 /* SVC number 1 code */
            ...
            break;
        ...
        default :                /* Unknown SVC - report error */
    }
}

参考 - 6.2.8. SVC 处理程序


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接