下面是定义为arm linux的reset vector的代码(arch/arm/kernel/entry armv.s)

vector_rst:
 ARM(   swi     SYS_ERROR0      )
 THUMB( svc     #0              )
 THUMB( nop                     )
        b       vector_und

指令的作用是什么?当我检查时,在arch/arm/kernel/asm offsets.c中发现sys_error0
DEFINE(SYS_ERROR0,            0x9f0000);

我在网上找不到任何与之相关的东西。有人能解释一下这个指令的作用吗?什么是swi SYS_ERROR0

最佳答案

我在网上找不到任何与之相关的东西。有人能解释一下这个指令的作用吗?什么是系统错误?

DEFINE(SYS_ERROR0,            0x9f0000);

swi instruction通常是从用户模式到系统模式的调用。即,Linux内核的用户空间。较低的数字是标准的Linux系统调用,如open()sbrk(),等等。
如果你看arch/arm中的uapi/asm/unistd.h,你可以看到一些定义,比如__ARM_NR_BASE,它是__NR_SYSCALL_BASE+0x0f0000。对于OABI系统,这可以是0x9f0000。基本上,这些是秘密系统调用,是特定于arm的内核调用。例如,__ARM_NR_get_tls仅用于arm上的libc线程管理。其他CPU可能有不同的非系统调用机制来执行相同的操作,并且/或者系统调用接口可能不同于ARM CPU。
所以SYS_ERROR0是一个特殊的arm系统调用。顺便说一下,asm offset.c从来没有直接使用过。它被编译,对象被脚本扫描以获得汇编程序到结构的偏移量等。因此,如果编译器以不同的方式打包结构,那么理论上,汇编程序将与编译器版本同步。我们从这里开始,
.L__vectors_start:
    W(b)    vector_rst
    W(b)    vector_und
    W(ldr)  pc, .L__vectors_start + 0x1000
    W(b)    vector_pabt
    W(b)    vector_dabt
    W(b)    vector_addrexcptn
    W(b)    vector_irq
    W(b)    vector_fiq

swi是由W(ldr) pc, .L__vectors_start + 0x1000处理的向量,因此代码在向量表后面4k。这是vector_swi,您可以在entry-common.S中看到代码。进行系统调用有两种方法。旧的(OABI)在SWI指令中对调用进行编码。这很糟糕,因为必须将icache作为数据(dcache)检查。较新的系统在r7中传递系统调用。有两个跳转表;sys_call_tablesys_oabi_call_table来处理oabi和更新的机制。在这两种情况下,较高的__NR_SYSCALL_BASE都是特殊情况,并在traps.c中使用arm_syscall。所以SYS_ERROR0是traps.c中的case 0: /* branch through 0 */代码。打印通过0的消息分支(因为用户空间跳转到可以在地址0处的重置向量),用户空间获得信号。

关于linux - swi SYS_ERROR0在arm linux内核中做什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53764955/

10-11 23:09
查看更多