2013-09-23 99 views
3

在linux中,所有與套接字相關的系統調用都被gated拋出一個名爲socketcall的系統調用。它的處理函數在/net/socket.c中找到。正如人們可以預料的那樣,有一個用於參數的copy_from_user,然後是所有套接字函數的開關。Linux'socketcall'系統調用實現

我希望在每種情況下都能看到一個普通函數的調用,但似乎有對另一個系統調用的調用。例如,對於「插座」的情況:

case SYS_SOCKET: 
    err = sys_socket(a0, a1, a[2]); 
    break; 

sys_socket在/net/socket.c如也被定義:

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

我的問題是,爲什麼它是這樣定義的。我猜它是爲了向後兼容,還是我在某個地方有錯誤?

回答

2

man 2 socketcall

注 在少數的架構,例如IA64,沒有socketcall()系統調用;代替插座(2),接受(2),綁定(2),依此類推真的 作爲獨立的系統來實現調用

所以,在86 socketcall調度程序只用於x86_32每當x86_64的情況下,使用單獨的系統調用每個套接字API。