2016-10-03 2 views
0

커널 모듈 프로그래밍에 익숙하지 않고 'sys_socket'을 사용하여 커널 모듈에 원시 소켓을 만들려고합니다. 이 소켓을 'sys_bind'및 'sys_ioctl'(인터페이스 번호를 가져 오는 데 사용)을 사용하여 인터페이스에 바인딩합니다. 시스템 호출이 정의되지 않았습니다! 커널 모듈 컴파일

내 모듈을 컴파일하는 동안, 나는 다음과 같은 오류를 얻을 :

make -C /lib/modules/3.13.0-68-generic/build M=/root/Kernel_Module modules 
make[1]: Entering directory `/usr/src/linux-headers-3.13.0-68-generic' 
CC [M] /root/Kernel_Module/kernel_module.o 
Building modules, stage 2. 
MODPOST 1 modules 
WARNING: "sys_ioctl" [/root/Kernel_Module/kernel_module.ko] undefined! 
WARNING: "sys_bind" [/root/Kernel_Module/kernel_module.ko] undefined! 
WARNING: "sys_socket" [/root/Kernel_Module/kernel_module.ko] undefined! 
CC  /root/Kernel_Module/kernel_module.mod.o 
LD [M] /root/Kernel_Module/kernel_module.ko 
make[1]: Leaving directory `/usr/src/linux-headers-3.13.0-68-generic' 

가 어떻게이 문제를 해결할 수 있습니까?

아래 코드 지정 :

struct sockaddr_ll socketBindAddr; 
struct ifreq  ifreq; 
int    socketFd = 0; 

socketFd = sys_socket (AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); 
if (socketFd < 0) 
{ 
    printk (KERN_CRIT "Failed to open data socket!!\r\n"); 
    return OFC_FAILURE; 
} 

memset (&ifreq, 0, sizeof(ifreq)); 
strcpy (ifreq.ifr_name, gOfcGlobals.aDataIfName); 
if (sys_ioctl (socketFd, SIOCGIFINDEX, (unsigned long) &ifreq) < 0) 
{ 
    printk (KERN_CRIT "Ioctl failed to get IfIndex!!\r\n"); 
    return OFC_FAILURE; 
} 

memset (&socketBindAddr, 0, sizeof(socketBindAddr)); 
socketBindAddr.sll_family = AF_PACKET; 
socketBindAddr.sll_protocol = htons(ETH_P_ALL); 
if (sys_bind (socketFd, (struct sockaddr *) &socketBindAddr, 
    sizeof(socketBindAddr)) < 0) 
{ 
    printk (KERN_CRIT "Failed to bind socket\r\n"); 
    return OFC_FAILURE; 
} 
+0

간단히 말해서, Syscalls은 ** 커널 모듈 *이 아닌 ** 사용자 공간 프로그램 ** 용입니다. 몇몇 syscall은 커널 내 사용을위한 아날로그를 가지고있다. 나는'ioctl','bind'와'socket'에 대한 커널 내부의 유사점에 대해서 알지 못합니다. – Tsyvarev

답변

1

sys_bind()sys_ioctl (및 sys_socket)는 커널로 (낮은 레벨) 사용자 공간 인터페이스이다. 작성한 코드는 표시하지 않았지만 넷 액세스에 더 적합한 커널 내부 인터페이스를 사용해야합니다.

+0

코드가 추가되었습니다. 커널 모듈을 사용하여 소켓을 생성하는 절차를 제안하십시오. – user2522685

+0

죄송합니다. 저는 커널 모듈에서 고급 네트워킹을 한 적이 없습니다. 연결을 어떻게 열어 볼 수 있는지 NFS를 살펴 보았지만 잃어 버렸습니다. 아마도 NBD가 더 간단한 시작점일까요? 아마도'/ drivers/block/nbd.c'를 읽어보십시오. –

+1

소켓은 다음과 같은 기능을 사용하여 커널을 만들 수 있습니다 : sock_create를()/* 소켓 */ sock-> ops-> 바인드()/* 바인드 소켓 */ sock-> ops-> 자료를 작성()/* 소켓 닫기 */ struct socket은 사용자 공간의 파일 설명 자 대신 커널의 소켓 구조입니다. – user2522685

관련 문제