我了解到,系统调用号作为ARMOABI(旧应用程序二进制接口)上“svc(或swi)”指令的直接操作数传递。立即数操作数为“0x900000+(系统调用数)”例如,按如下方式发出退出系统调用。

svc    #0x900001    @ sys_exit

我对syscall()函数的实现感到好奇,因为sycall()以系统调用号作为参数。如果参数值是动态创建的,那么syscall()的二进制代码就不容易创建。
但是,glibc的syscall()的二进制代码很简单。它将系统调用的次数设置为“register r0”,将参数设置为“register r1-r6”。然后,执行“svc#0x900071”。
测试环境是Debian lenny ARM OABI、Linux 2.6.26、gcc 4.2、glibc2.7.18。syscall()的二进制代码如下。
00012560 <syscall>:
   12560:       e1a0c00d        mov     ip, sp
   12564:       e92d0070        push    {r4, r5, r6}
   12568:       e89c0070        ldm     ip, {r4, r5, r6}
   1256c:       ef900071        svc     0x00900071
   12570:       e8bd0070        pop     {r4, r5, r6}
   12574:       e3700a01        cmn     r0, #4096       ; 0x1000
   12578:       31a0f00e        movcc   pc, lr
   1257c:       ea000547        b       13aa0 <__syscall_error>

系统调用如下所示。这是“syscall(SYS_getuid)”的示例。
8270:       e3a00609        mov     r0, #9437184    ; 0x900000
8274:       e2800018        add     r0, r0, #24     ; 0x18
8278:       eb0028b8        bl      12560 <syscall>

什么是“svc#0x900071”?它像超级系统调用一样工作。

最佳答案

http://man7.org/linux/man-pages/man2/syscall.2.html
在执行真正的系统调用之前/之后,有一些工作要做,例如:register saving/restoring。
所以,syscall()是一个助手。

   syscall() is a small library function that invokes the system call
   whose assembly language interface has the specified number with the
   specified arguments.  Employing syscall() is useful, for example,
   when invoking a system call that has no wrapper function in the C
   library.

   syscall() saves CPU registers before making the system call, restores
   the registers upon return from the system call, and stores any error
   code returned by the system call in errno(3) if an error occurs.

看看这里:
https://w3challs.com/syscalls/?arch=arm_strong
在这里:
https://chromium.googlesource.com/native_client/nacl-newlib/+/master/libgloss/arm/linux-syscall.h
# define SYS_BASE 0x900000
#define SYS_syscall                (SYS_BASE+113)

嗯,0x900000+113==0x900071。
所以,syscall()调用一个真正的系统调用:)

关于linux - syscall()在ARM-OABI上的实现。什么是“svC#0x900071”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48183434/

10-15 16:07