커널 모듈 프로그래밍에 익숙하지 않고 '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;
}
간단히 말해서, Syscalls은 ** 커널 모듈 *이 아닌 ** 사용자 공간 프로그램 ** 용입니다. 몇몇 syscall은 커널 내 사용을위한 아날로그를 가지고있다. 나는'ioctl','bind'와'socket'에 대한 커널 내부의 유사점에 대해서 알지 못합니다. – Tsyvarev