2011-03-31 16 views
6

當系統調用返回時,我在%eax中得到了系統調用返回值,但是在入口處我得到了-38,這是十六進制中的0xFFFFFFDA。這是爲了寫/讀。這個數字是多少?它可以用來安全地區分入口和出口嗎?在Linux中,輸入sys調用時,%eax中的值是多少? (not orig_eax)

+1

你能解釋一下你在「進入」時的意思嗎? – 2011-03-31 18:34:11

+0

@Mr。 Shickadance,據我瞭解,sys_call有兩部分。當它被髮送/發送到內核時,我稱之爲條目,當內核完成並返回時,我稱之爲退出。所以入口/出口將進入/離開內核空間。 – ofosho 2011-03-31 18:46:41

+0

進入內核空間後,運行內核代碼。系統調用後的代碼將只在內核返回(退出)後運行。 – ughoavgfhw 2011-03-31 18:51:43

回答

6

在syscall條目中的eax上的-38顯然是ENOSYS(函數沒有實現),並通過arch/x86/kernel/entry_32.S中的syscall_trace_entry放在那裏。我想假設它始終存在於系統調用條目中是安全的,但是如果syscall返回ENOSYS,它也可以在系統調用出口處出現。

就我個人而言,我總是跟蹤我是否進入系統調用或使用ptrace時退出,儘管我也看到了一些依賴ENOSYS的代碼。 (我假設你正在使用ptrace)如果當你附加到系統調用時進程恰好在系統調用內部,我想這是行不通的,但我很幸運地沒有碰到這個問題。

我簡單地看了一下strace來源,我猜它也跟蹤了這個狀態,因爲有一條評論說:「我們正在附加一個已經運行的進程,試着弄清楚進程的狀態系統調用,以處理第一個事件。「稍後它說:「進程在系統調用的中間睡着了,假的系統調用入口事件。」

總之,該值不能安全地用於區分入口和出口。也就是說,我不確定手動跟蹤它是否是最好的方法,因爲我沒有真正得到任何肯定會告訴您使用該技術的來源,抱歉。 :)

+0

「arch/x86/kernel/entry_32.S中的syscall_trace_entry」這就是我所需要的。謝謝! – ofosho 2011-03-31 20:37:36

+0

退出時肯定可以用'-ENOSYS' - 檢查源代碼顯示很多系統調用可以返回這個。 – caf 2011-04-01 06:13:21

+0

@caf謝謝,我完全錯過了。當我想到它時,我在某種程度上讓系統調用入口與退出混淆,認爲您需要使用ENOSYS作爲系統調用號來實現系統調用,並且依賴於無效的系統調用是否在進入之前被丟棄ptrace的。我已經更新了答案。 – 2011-04-01 10:29:28

0

當你在eax中得到-38時,我仍然沒有得到,但是當做系統調用時eax包含一個定義系統調用的數字(在2.6內核中你可以看看arch/x86/include/asm/unistd_64 .h查看每個通話的號碼)。

所以順序如下:

  1. 您PROGRAMM
  2. 集EAX到系統調用(DEP隨叫隨到,也有一些其他的REG)
  3. 的init系統調用(通過INT 0x80的)
  4. 結果在EAX系統調用的
  5. 您PROGRAMM再次

也許你的問題沒有這麼明確,但是如果你沒有編寫內核代碼/驅動程序,最簡單的方法告訴你,你是在系統調用入口之前還是在系統調用結束之後:當你在你的代碼中時是TRUE ;-)。入口/出口本身在一條指令中立即發生(或多或少),所以無論你在系統調用(那麼你會知道,因爲它必須是一些內核代碼或阻塞調用),或者你不是(幾乎每次調試時你的代碼)。

+0

評論應該澄清問題。我選擇了一個答案。感謝您的幫助,非常感謝! – ofosho 2011-03-31 20:39:22

相關問題