2013-09-23 2 views
3

리눅스에서 모든 소켓 관련 시스템 호출은 socketcall이라는 하나의 시스템 호출을 던집니다. 핸들러는 /net/socket.c에 있습니다. 인수에 copy_from_user가 있고 모든 소켓 기능에 스위치가있을 것으로 기대할 수 있습니다.리눅스 '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), 바인딩을 받아, 등등 정말 별도의 시스템으로 구현됩니다 socketcall 디스패처는 x86_32 때마다 x86_64에 사용 86의 경우,

그래서 호출 별도의 시스템을 사용 각 소켓 API를 호출합니다.