下面是定义为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_table
和sys_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/