當系統調用返回時,我在%eax中得到了系統調用返回值,但是在入口處我得到了-38,這是十六進制中的0xFFFFFFDA。這是爲了寫/讀。這個數字是多少?它可以用來安全地區分入口和出口嗎?在Linux中,輸入sys調用時,%eax中的值是多少? (not orig_eax)
回答
在syscall條目中的eax上的-38顯然是ENOSYS(函數沒有實現),並通過arch/x86/kernel/entry_32.S中的syscall_trace_entry放在那裏。我想假設它始終存在於系統調用條目中是安全的,但是如果syscall返回ENOSYS,它也可以在系統調用出口處出現。
就我個人而言,我總是跟蹤我是否進入系統調用或使用ptrace時退出,儘管我也看到了一些依賴ENOSYS的代碼。 (我假設你正在使用ptrace)如果當你附加到系統調用時進程恰好在系統調用內部,我想這是行不通的,但我很幸運地沒有碰到這個問題。
我簡單地看了一下strace來源,我猜它也跟蹤了這個狀態,因爲有一條評論說:「我們正在附加一個已經運行的進程,試着弄清楚進程的狀態系統調用,以處理第一個事件。「稍後它說:「進程在系統調用的中間睡着了,假的系統調用入口事件。」
總之,該值不能安全地用於區分入口和出口。也就是說,我不確定手動跟蹤它是否是最好的方法,因爲我沒有真正得到任何肯定會告訴您使用該技術的來源,抱歉。 :)
當你在eax中得到-38時,我仍然沒有得到,但是當做系統調用時eax包含一個定義系統調用的數字(在2.6內核中你可以看看arch/x86/include/asm/unistd_64 .h查看每個通話的號碼)。
所以順序如下:
- 您PROGRAMM
- 集EAX到系統調用(DEP隨叫隨到,也有一些其他的REG)
- 的init系統調用(通過INT 0x80的)
- 結果在EAX系統調用的
- 您PROGRAMM再次
也許你的問題沒有這麼明確,但是如果你沒有編寫內核代碼/驅動程序,最簡單的方法告訴你,你是在系統調用入口之前還是在系統調用結束之後:當你在你的代碼中時是TRUE ;-)。入口/出口本身在一條指令中立即發生(或多或少),所以無論你在系統調用(那麼你會知道,因爲它必須是一些內核代碼或阻塞調用),或者你不是(幾乎每次調試時你的代碼)。
評論應該澄清問題。我選擇了一個答案。感謝您的幫助,非常感謝! – ofosho 2011-03-31 20:39:22
- 1. Linux NASM:調用sys_exit時,ebx中的值是多少?
- 2. 在SQL Server字段中輸入的唯一值是多少?
- 3. jne在eax中的值
- 4. 爲什麼除了eax還提供了orig_eax?
- 5. 我們可以在C++中使用多少種輸入值?
- 6. Linux中Ready Queue的大小是多少?
- 7. 在Internet Explorer中打印時缺少輸入元素中的值
- 8. 什麼使sys_read系統調用linux放入寄存器eax?
- 9. SYS/Linux中ioctl.h問題
- 10. 在彙編中存儲eax中的值
- 11. PTRACE_SYSCALL和orig_eax
- 12. Excel - 絕對值無論輸入到單元格中的值是多少
- 13. Linux程序集:「test eax,eax」和「cmp eax,0」有什麼區別
- 14. 使用從sys導入輸入argv
- 15. 如何找到多少時間用C已過++使用SYS/times.h
- 16. 在多線程TCP服務器中使用Listen()sys調用
- 17. a4j:commandButton在命中時調用輸入
- 18. 在Linux中捕獲輸入
- 19. C++中「this」的可能值是多少?
- 20. 如何在gedit linux中輸入在java中輸入的文本?
- 21. 空文本輸入框的值是多少?
- 22. 看下面的代碼。打印時的輸出值是多少?
- 23. 在多值參數中填充用零輸入的用戶輸入
- 24. Linux內核2.6中有多少系統調用?
- 25. 檢查彙編代碼MOV 0x8中(%EBX),%EAX MOV(%eax中),%EAX CMP%EAX(%EBX)
- 26. OpenMP中omp_set_max_active_levels的最佳值是多少?
- 27. Grafana中的$ interval平均值是多少?
- 28. 分區中maxvalue的值是多少
- 29. Java中Float的最大值是多少?
- 30. cassandra.yaml中allocate_tokens_for_keyspace的允許值是多少?
你能解釋一下你在「進入」時的意思嗎? – 2011-03-31 18:34:11
@Mr。 Shickadance,據我瞭解,sys_call有兩部分。當它被髮送/發送到內核時,我稱之爲條目,當內核完成並返回時,我稱之爲退出。所以入口/出口將進入/離開內核空間。 – ofosho 2011-03-31 18:46:41
進入內核空間後,運行內核代碼。系統調用後的代碼將只在內核返回(退出)後運行。 – ughoavgfhw 2011-03-31 18:51:43