簡體   English   中英

系統調用如何在Linux上實際發生?

[英]How does a syscall actually happen on linux?

靈感來自這個問題

如何強制GDB反匯編?

並與此相關

什么是INT 21h?

如何在Linux下實際發生系統調用? 執行調用時會發生什么,直到調用實際的內核例程?

假設我們在談論x86:

  1. 系統調用ID存入EAX寄存器
  2. 系統調用所需的任何參數都存放在系統調用指定位置 例如,某些系統調用期望它們的參數駐留在EBX寄存器中。 其他人可能會期望他們的論點位於籌碼的頂端。
  3. 調用INT 0x80中斷。
  4. Linux內核為EAX寄存器中的ID標識的系統調用提供服務,將任何結果存儲在預定位置。
  5. 調用代碼使用任何結果。

我可能有點生疏,已經有幾年......

給出的答案是正確的,但我想補充說,有更多的機制進入內核模式。 每個最近的內核都映射每個進程的地址空間中的“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頁面還映射了一些可以在沒有上下文切換的情況下完成的系統調用。 我知道某些gettimeofdaytimegetcpu被映射到那里,但我想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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM