2014-10-31 117 views
1

我正在實現一個程序,儘可能經常在用戶空間運行。所以我試圖調用進入和離開內核空間的函數儘可能少。例如,我使用了一些可讀寫的DMA API,但繞過了內核。如何判斷一個函數是否進入內核

我不知道如何判斷一個函數是否需要輸入內核空間。例如,我想調用getenv()來獲取主機設置的環境變量,但擔心它可能會傳遞我的程序並進入內核空間。我無法從手冊中找到這些信息。這裏是getenv()的手冊頁。

+1

'getenv()'返回的信息不存儲在內核空間中,所以它不會轉換到內核。但是,我不知道有一個簡單的方法可以從手冊頁等方面做出決定。 – 2014-10-31 15:33:06

+0

@JonathanLeffler謝謝。這是否意味着一個函數是否進入內核空間是一種動態行爲? – 2014-10-31 15:43:00

+1

可能或多或少 - 至少在某種意義上,例如getchar()通常不會進入內核空間(當數據仍然要在緩衝區中讀取時),但有時會進入內核(當緩衝區中沒有數據時)。所以,這是動態行爲。其他函數(例如'getpid()')將始終進入內核。這取決於功能。 – 2014-10-31 15:45:25

回答

4

你是否通過strace運行你的程序?這會讓你知道你在哪裏進行系統調用,它將進入內核空間

+0

謝謝。我只是從你身上知道strace。那麼,沒有文件說明哪些進入了內核,哪些沒有進入內核?我們需要運行它。這是否意味着一個函數是否進入內核空間是一種動態行爲? – 2014-10-31 15:42:27

+0

你試過了「man strace」:)如果你沒有訪問它,這裏是聯機版的manpage:http://linux.die.net/man/1/strace – 2014-10-31 15:54:27

+0

strace產生了很多輸出,如果你不習慣它,看起來很嚇人,並且沒有很多好的教程。看看這個http://www.ibm.com/developerworks/cn/library/au-unix-strace.html – 2014-10-31 15:58:07

0

我認爲大多數IO函數都會導致你的程序進入內核? 也許你應該檢查你使用的系統API

+0

我不知道去哪兒檢查。例如,這是''getenv()''http://man7.org/linux/man-pages/man3/getenv.3.html頁面,我不知道它是否進入內核空間。 – 2014-10-31 15:25:17

相關問題