它位于v3.10-rc7 的第 1747net/socket.c
行。
/*
* Send a datagram to a given address. We move the address into kernel
* space and check the user space data area is readable before invoking
* the protocol.
*/
SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
unsigned int, flags, struct sockaddr __user *, addr,
int, addr_len)
{
struct socket *sock;
struct sockaddr_storage address;
...
SYSCALL_DEFINE6
宏是用于定义带六个参数的系统调用的宏。它定义在include/linux/syscalls.h
. 这非常复杂,所以让我们先来看看无参数版本中发生了什么:
#define SYSCALL_DEFINE0(sname) \
SYSCALL_METADATA(_##sname, 0); \
asmlinkage long sys_##sname(void)
getuid()
中定义的系统调用如,kernel/sys.c
编码如下:
SYSCALL_DEFINE0(getuid)
{
/* Only we change this so SMP safe */
return from_kuid_munged(current_user_ns(), current_uid());
}
宏扩展为
SYSCALL_METADATA(_##sname, 0);
asmlinkage long sys_getuid(void)
{
/* Only we change this so SMP safe */
return from_kuid_munged(current_user_ns(), current_uid());
}
这是函数的简单定义sys_getuid
。
元数据可选地编译到内核中以进行跟踪。有关详细信息,请参阅源代码syscalls.h
。