我已经研究过一些文章,我得到的信息是系统调用open()在glibc中调用包装器函数,然后引发陷阱,将上下文从用户空间切换到内核空间,然后使用cpu寄存器在内核空间中调用系统调用参数/参数。
但我仍然认为我错过了系统调用调用的一步一步程序或详细序列。如果人们可以提供考虑ARM arch作为参考的步骤,那将会很棒。谢谢提前。
答案 0 :(得分:4)
软件中断异常用于在ARM的情况下调用系统调用。它将执行其地址存储在物理地址0x08
的函数。
Syscall包装器库函数适用于SYSCALL的体系结构特定实现(检查libc源代码的sysdeps/unix
目录)。
在我们的例子中,将执行来自sysdeps/unix/sysv/linux/arm/syscall.S
文件的系统调用。在此函数中,它将系统调用号存储在R7
中
和R0-R6
用于向系统调用发送参数。
示例汇编代码:
mov r7, #SYSCALL NO
mov r0, #ARG1
mov r1, #ARG2
swi 0x0
生成软件异常时,会调用vector_swi()
<arch/arm/kernel/entry-common.S>
。此函数从R7获取系统调用号,
从sys_call_table
找到并执行注册的函数地址。
检查以下内核文件以获取实现细节: