SOCKET使用者介面與系統呼叫關係

2021-08-07 07:01:24 字數 2697 閱讀 3373

所有的socket系統呼叫的總入口是sys_socketcall(),在include/linux/syscalls.h中定義

其中,@param call 標識介面編號,

@param args 是介面引數指標

介面編號的定義在 include/uapi/linux/net.h中定義

介面編號對應的引數個數在net/socket.c檔案中的nargs陣列中定義

在net/socket.c中有乙個函式syscall_define2(socketcall, int, call, unsigned long __user *, args)便是socket呼叫的入口。

其中syscall_define2是乙個巨集,定義在include/linux/syscall.h中

下面我們來展開展開syscall_define2(socketcall, int, call, unsigned long __user *, args):

展開第一步得到:

syscall_definex(2, _##socketcall, int, call, unsigned long __user *, args)

繼續展開syscall_definex,

syscall_metadata(_socketcall,2,int, call, unsigned long __user *, args) \

__syscall_definex(2, _socketcall, int, call, unsigned long __user *, args)

syscall_metadata定義是空,忽略

繼續展開__syscall_definex,

asmlinkage long sys_socketcall(__map(2,__sc_decl,__va_args__));\

static inline long sysc_socketcall(__map(2,__sc_decl,__va_args__)); \

asmlinkage long sys_socketcall(__map(2,__sc_long,__va_args__))\

\syscall_alias(sys_socketcall, sys_socketcall);\

static inline long sysc_socketcall(__map(2,__sc_decl,__va_args__))

這時候的巨集包括__map(),__sc_decl 將其展開得到,其中__map是乙個降維的過程,繼續展開得到:

asmlinkage long sys_socketcall (int call, unsigned long __user *args);

static inline long sysc_socketcall(int call, unsigned long __user *args);

asmlinkage long sys_socketcall(int call, unsigned long __user *args)

syscall_alias(sys_socketcall, sys_socketcall);

static inline long sysc_socketcall((int call, unsigned long __user *args)

到目前為止,sys_socketcall似乎並沒有定義,原因是還有乙個巨集未展開,syscall_alias,在include/linux/linkage.h中定義,

在include/linux/export.h中定義,

將 syscall_alias(sys_socketcall, sys_socketcall) 展開得到:

asm (".globl" sys_socketcall

".set" sys_socketcall, sys_socketcall)

即sys_socketcall是sys_socketcall的別名。

所以:展開之後是:

那核心為什麼要這樣呢?可以參考

SOCKET使用者介面與系統呼叫關係(2)

上一節中講述了socket呼叫的總入口sys socketcall的巨集定義形式,該定義形式還廣泛用於其他介面api。現在我們來看看sys socketcall的實現方式。在net socket.c 中,sys socketcall的實現如下 2465 2466 api序號鑑定,需要在socket ...

Socket 與系統呼叫深度分析

本次實驗主要從以下幾個方面對socket和系統呼叫之間的關係 socket api 和 系統呼叫關係 系統呼叫機制 socket相關系統呼叫核心函式和跟蹤驗證 系統呼叫一般發生在中斷的時候。當中斷發生時,系統就會進入核心態指向相關的系統呼叫。相信考過408的同學對下圖應該是很熟悉的。這個圖大概的描述...

Socket與系統呼叫深度分析

一 系統呼叫 由於需要限制不同的程式之間的訪問能力,防止他們獲取別的程式的記憶體資料,或者獲取外圍裝置的資料,併發送到網路,cpu劃分出兩個許可權等級 使用者態和核心態。核心態 cpu可以訪問記憶體的所有資料,包括外圍裝置,例如硬碟,網絡卡,cpu也可以將自己從乙個程式切換到另乙個程式。使用者態 只...