SYSCALL DEFINE3巨集定義的分析

2021-06-22 21:38:13 字數 2012 閱讀 2865

syscall_define3分析

1.syscall_define3(socket, int, family, int, type, int, protocol)

2.#define syscall_define3(name, ...) syscall_definex(3, _##name, __va_args__)

3.#define syscall_definex(x, sname, ...)\

__syscall_definex(x, sname, __va_args__)

4.#define __syscall_definex(x, name, ...)\

asmlinkage long sys##name(__sc_decl##x(__va_args__))

5.#define __sc_decl1(t1, a1)t1 a1

#define __sc_decl2(t2, a2, ...) t2 a2, __sc_decl1(__va_args__)

#define __sc_decl3(t3, a3, ...) t3 a3, __sc_decl2(__va_args__)

#define __sc_decl4(t4, a4, ...) t4 a4, __sc_decl3(__va_args__)

#define __sc_decl5(t5, a5, ...) t5 a5, __sc_decl4(__va_args__)

#define __sc_decl6(t6, a6, ...) t6 a6, __sc_decl5(__va_args__)

上面四步就是整個syscall_define3巨集定義的每個步驟下面對他們進行組合

name...

socketint, family, int, type, int, protocol

syscall_define3(socket, int, family, int, type, int, protocol)

等於syscall_define3(socket, ...)

等於syscall_definex(3, _socket, int, family, int, type, int, protocol)

等於__syscall_definex(3, _socket,int, family, int, type, int, protocol)

等於asmlinkage long sys_socket(__sc_decl##3(int, family, int, type, int, protocol))

等於asmlinkage long sys_socket(__sc_decl##3(int, family, int, type, int, protocol))

等於asmlinkage long sys_socket(__sc_decl3(int, family, int, type, int, protocol))

asmlinkage long sys_socket(int family ,__sc_decl2(int, type, int, protocol))

asmlinkage long sys_socket(int family ,int type ,__sc_decl1(int, protocol))

asmlinkage long sys_socket(int family ,int type ,int protocol)

這樣分解之後就得到了函式

asmlinkage long sys_socket(int family ,int type ,int protocol)

備註:__va_args__:總體來說就是將左邊巨集中 ... 的內容原樣抄寫在右邊 __va_args__ 所在的位置。它是乙個可變引數的巨集,是新的c99規範中新增的,目前似乎只有gcc支援(vc從vc2005開始支援)。要注意的是,printf 的輸出格式是括號內左邊是字串,右邊是變數,而且右變數與左輸出格式是一一對應的。所以在上面那個例子中, __va_args__只能是一些不含任何變數的字串常量。因為上面的例子中若__va_args__含有變數,整個printf的輸出與變數便不能一一對應,輸出會出錯。

一 巨集定義(3) 檢視巨集展開

從乙個巨集定義開始說起 define mul a,b a b 乍看之下這個巨集定義並沒有什麼問題,但是當你採用如下用法的時候就會出現問題了 int main char argv intargc 執行後輸出 可以看到結果並不是我們預期的 5 9 45,這個時候我們可能就會想到怎麼去檢視巨集展開後是變成...

VBA系列 3 巨集錄製器

使用巨集錄製器的注意事項 啟動巨集錄製器 啟用excel,選擇 開發工具 錄製巨集 命令 在 錄製巨集 對話方塊中有一些可以設定的選項。清理已錄製的巨集 在很多情況下,錄製好的巨集 中包含了可以被刪除的無關命令。巨集錄製器生成的 不一定是最有效的,理解這一點很重要。如果檢驗生成的 會看到excel通...

switch to巨集第3個引數分析

switch to巨集第3個引數很多初學者不能理解,我經過多方查詢,終於得到解答,寫個博文,給大家參考。在switch to巨集呼叫前prev指向程序a,同時也是程序a的區域性變數,switch to巨集呼叫後,因為棧發生了切換 包括esp和ebp prev成為了程序b的區域性變數,而在schedu...