系统调用如何从用户空间传输到内核空间并返回用户空间?

时间:2014-06-12 04:44:04

标签: linux linux-kernel linux-device-driver embedded-linux

我已经研究过一些文章,我得到的信息是系统调用open()在glibc中调用包装器函数,然后引发陷阱,将上下文从用户空间切换到内核空间,然后使用cpu寄存器在内核空间中调用系统调用参数/参数。

但我仍然认为我错过了系统调用调用的一步一步程序或详细序列。如果人们可以提供考虑ARM arch作为参考的步骤,那将会很棒。谢谢提前。

1 个答案:

答案 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找到并执行注册的函数地址。

检查以下内核文件以获取实现细节:

  1. 在include / linux / syscalls.h
  2. 拱/臂/包括/ ASM / unistd.h中
  3. 拱/臂/内核/ calls.S
  4. 拱/臂/内核/ entry_common.S
  5. arch / arm / kernel / sys_arm.c