这个问题的启发
我怎样才能迫使GDB拆解?
而与此相关的一个
什么是INT 21H?
如何实际的系统调用Linux下发生的呢? 直到真正的内核程序被调用时进行调用发生什么,?
这个问题的启发
我怎样才能迫使GDB拆解?
而与此相关的一个
什么是INT 21H?
如何实际的系统调用Linux下发生的呢? 直到真正的内核程序被调用时进行调用发生什么,?
假设我们正在谈论的x86:
INT 0x80
中断调用。 我可能是在这个有点生疏了,它已经有几年...
给出的答案是正确的,但我想补充一点,有更多的机制进入内核模式。 最近每一内核映射在每一个进程的地址空间的“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适合在那里一样好。
这已经是在回答
在Linux系统调用是如何实现的?
大概没有匹配,因为别共“系统调用”长期使用的这个问题。
基本上,其非常简单:在某处存储器在于,其中每个系统调用号码和相应的处理程序的地址被存储在表(参照http://lxr.linux.no/linux+v2.6.30/arch/x86/kernel/syscall_table_32 .S x86版本)
该INT 0x80的中断处理程序,然后只是需要从参数寄存器,使他们的(核)堆栈,并调用相应的系统调用处理程序。