2013-06-24 1 views
0

"sendto"소켓 함수의 구현을 탐색하려고합니다. 나는 리눅스에서 구현을 찾으려고 노력했다.sys_sendto Linux systemcall implementation

Linux에서 sendto 함수는 "sys_sendto"시스템 호출에 해당합니다.

asmlinkage 긴 sys_sendto (무효) 속성 ((약한, 별칭 ("sys_ni_syscall"))

말의 : 나는 그것을 따라하려고 할 때, 나는 단지 다음 인 그것을 하나의 정의를 발견 sys_sendto는 sys_ni_syscall에 대한 별칭입니다. 값을 반환하는 것 외에는 아무것도 수행하지 않습니다. 문제는 sys_snedto 구현을 어디에서 찾을 수 있습니까? 일부 어셈블리 코드에서 구현됩니까?

답변

1

You 리눅스 구현을 찾을 수 있습니다 sendtohere. 당신이 볼 수 있듯이, 그것은 본질적으로 더 강력한 주위 래퍼입니다 sendmsg.

구현이 아닌 시스템 호출의 선언 (프로토 타입)을보고있는 것처럼 보입니다.

+0

이 페이지를 이미 보았습니다. 코드는 다른 함수 "sock_sendmsg"가 작업을 수행하고 있음을 보여줍니다. 그러나 구현을 시도 할 때 구체적인 것은 없습니다. 내가 원하는 것은 sendto 기능의 맨 아래에있는 것입니다. 즉, 버퍼가 어떻게 전송되고 매개 변수 (주소, 포트, ...)가 전달되는지. – user2410592

+0

음,'sock_sendmsg'는 매우 동일한 파일에 정의되어 있습니다. 그냥 * 무엇을하는지보십시오. '__sock_sendmsg'가 호출되어'__sock_sendmsg_nosec'을 호출하는 것을 볼 수 있습니다. 그리고 어떤 종류의 소켓이 관련되어 있는지에 따라 호출이 전달된다는 것을 알 수 있습니다. – Celada

1

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의 출처를 참조하십시오.