net/socket.c
, line 1747 of v3.10-rc7입니다.
/*
* 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
매크로는 6 개의 인수를 취하는 syscall을 정의하기위한 매크로입니다. include/linux/syscalls.h
에 정의되어 있습니다. 그것은 꽤 복잡, 그래서 인수 없음 버전에서 무슨 일을보고 시작하자 : kernel/sys.c
에 정의 getuid()
같은 시스템 호출은, 다음과 같이 코딩
#define SYSCALL_DEFINE0(sname) \
SYSCALL_METADATA(_##sname, 0); \
asmlinkage long sys_##sname(void)
:
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
의 출처를 참조하십시오.
이 페이지를 이미 보았습니다. 코드는 다른 함수 "sock_sendmsg"가 작업을 수행하고 있음을 보여줍니다. 그러나 구현을 시도 할 때 구체적인 것은 없습니다. 내가 원하는 것은 sendto 기능의 맨 아래에있는 것입니다. 즉, 버퍼가 어떻게 전송되고 매개 변수 (주소, 포트, ...)가 전달되는지. – user2410592
음,'sock_sendmsg'는 매우 동일한 파일에 정의되어 있습니다. 그냥 * 무엇을하는지보십시오. '__sock_sendmsg'가 호출되어'__sock_sendmsg_nosec'을 호출하는 것을 볼 수 있습니다. 그리고 어떤 종류의 소켓이 관련되어 있는지에 따라 호출이 전달된다는 것을 알 수 있습니다. – Celada