2014-09-26 34 views
0


的#define SYSCALL_DEFINEx(X,SNAME,...)

在3.14 linux內核有以下宏:

#define SYSCALL_DEFINEx(x, sname, ...) 

它位於在include/linux/syscalls.h

我在源代碼中添加了一個系統調用,我編譯了它,並使用系統調用編寫了一個小程序。它似乎工作,因爲我的系統調用已被調用並打印一條消息。

但我沒有使用宏。我閱讀有關它的事情。我明白這個宏是爲了爭論。但是我不明白什麼時候需要使用它,因爲我做了一個「grep」,看起來大部分帶參數的系統調用都沒有使用它。

我必須使用它嗎?爲什麼?

我對同一個文件(SYSCALL_METADATA(sname,nb,...),SYSCALL_TRACE_ENTER_EVENT(sname)等)中的其他宏也有同樣的問題。即使我的系統調用有效,我是否也必須全部使用它們?

我怕如果我不使用這些宏錯過的東西,我不能找到它足夠的信息:/

謝謝!

+0

雙向試用你的程序。如果輸出是相同的,那麼你不需要,但如果它不同,那麼研究它們的差異。 – eyoung100 2014-09-26 17:01:57

+0

我試過但我不明白有什麼區別。現在更清楚了。謝謝! – Kany 2014-09-28 15:15:18

回答

2

您應該閱讀Anatomy of a system call, part1part 2

SYSCALL_DEFINEx宏不應該直接使用,而是SYSCALL_DEFINE0SYSCALL_DEFINE1SYSCALL_DEFINE2等,這取決於你的系統調用需要的參數數量。

這是在Linux中定義系統調用的常用方法。宏的目的是確保將適當的編譯器編譯指示應用於該函數 - 標準function prologuecalling conventions不適用於系統調用。

根據內核的配置,而不是您的個人偏好,您在系統調用宏中看到的其他代碼片段是否包含在內。您可以看到整個SYSCALL_METADATA代碼僅包含if CONFIG_FTRACE_SYSCALLS is set

+0

好吧,我需要它現在好多了!謝謝! – Kany 2014-09-28 15:16:03