3

在 linux 中,所有与套接字相关的系统调用都被门控抛出一个名为socketcall的系统调用。它的处理程序位于/net/socket.c. 正如人们所预料的那样,参数有一个 copy_from_user ,然后是所有套接字函数的开关。

我希望在每种情况下都能看到对普通函数的调用,但似乎有对另一个系统调用的调用。例如 'socket' 的情况:

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)

我的问题是为什么它是这样定义的。我猜它是为了向后兼容,还是我在某个地方有错误?

4

1 回答 1

2

man 2 socketcall

注意 在一些架构上,例如 ia64,没有 socketcall() 系统调用;相反,socket(2)、accept(2)、bind(2) 等实际上是作为单独的系统调用实现的

因此,在 x86 的情况下,socketcall调度程序仅用于x86_32,而x86_64对每个套接字 API 使用单独的系统调用。

于 2013-09-23T15:02:41.823 回答