如何做一个系统调用实际发生在Linux上?(How does a syscall actually

2019-07-31 15:22发布

这个问题的启发

我怎样才能迫使GDB拆解?

而与此相关的一个

什么是INT 21H?

如何实际的系统调用Linux下发生的呢? 直到真正的内核程序被调用时进行调用发生什么,?

Answer 1:

假设我们正在谈论的x86:

  1. 该系统调用的ID被存入EAX寄存器
  2. 通过系统调用所需的任何参数都存入由系统调用所指示的位置 。 例如,一些系统调用期待他们的说法居住在EBX寄存器中。 其他人可能希望他们的论点是坐在堆栈的顶部。
  3. 一个INT 0x80中断调用。
  4. Linux内核服务的系统调用由ID在EAX寄存器中标识,沉积在预先确定的位置的任何结果。
  5. 调用代码利用任何结果的。

我可能是在这个有点生疏了,它已经有几年...



Answer 2:

给出的答案是正确的,但我想补充一点,有更多的机制进入内核模式。 最近每一内核映射在每一个进程的地址空间的“vsyscall”页面。 它包含了比最有效的系统调用陷阱的方法而已。

例如一个普通的32位系统,它可以包含在:

 
0xffffe000: int $0x80
0xffffe002: ret

但在我64 bitsystem我必须使用系统调用/ SYSENTER指令的方式来更有效的方法访问


0xffffe000: push   %ecx
0xffffe001: push   %edx
0xffffe002: push   %ebp
0xffffe003:     mov    %esp,%ebp
0xffffe005:     sysenter 
0xffffe007: nop    
0xffffe008: nop    
0xffffe009: nop    
0xffffe00a: nop    
0xffffe00b: nop    
0xffffe00c: nop    
0xffffe00d: nop    
0xffffe00e:     jmp    0xffffe003
0xffffe010: pop    %ebp
0xffffe011: pop    %edx
0xffffe012: pop    %ecx
0xffffe013: ret    

这vsyscall页面也映射了一些systemcalls可以在没有上下文切换来完成。 我知道一定gettimeofday的时间getcpu被映射在那里,但我想可能GETPID适合在那里一样好。



Answer 3:

这已经是在回答
在Linux系统调用是如何实现的?
大概没有匹配,因为别共“系统调用”长期使用的这个问题。



Answer 4:

基本上,其非常简单:在某处存储器在于,其中每个系统调用号码和相应的处理程序的地址被存储在表(参照http://lxr.linux.no/linux+v2.6.30/arch/x86/kernel/syscall_table_32 .S x86版本)

该INT 0x80的中断处理程序,然后只是需要从参数寄存器,使他们的(核)堆栈,并调用相应的系统调用处理程序。



文章来源: How does a syscall actually happen on linux?