[英]How does a syscall actually happen on linux?
給出的答案是正確的,但我想補充說,有更多的機制進入內核模式。 每個最近的內核都映射每個進程的地址空間中的“vsyscall”頁面。 它只包含最有效的系統調用陷阱方法。
例如,在常規32位系統上,它可以包含:
0xffffe000: int $0x80
0xffffe002: ret
但是在我的64位系統上,我可以使用syscall / 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頁面還映射了一些可以在沒有上下文切換的情況下完成的系統調用。 我知道某些gettimeofday , time和getcpu被映射到那里,但我想getpid也適合那里。
這已經回答了
如何在Linux中實現系統調用?
可能與這個問題不匹配,因為不同的“系統調用”術語用法。
基本上,它非常簡單:內存中的某個位置是一個表,其中存儲了每個系統調用號和相應處理程序的地址(請參閱http://lxr.linux.no/linux+v2.6.30/arch/x86/kernel/syscall_table_32 .S for x86版本)
然后INT 0x80中斷處理程序將參數從寄存器中取出,將它們放在(內核)堆棧上,並調用相應的系統調用處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.