2016-10-03 229 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用於**用戶空間程序**,不用於*內核模塊*。一些系統調用有類似於內核使用。我不知道'ioctl','bind'和'socket'的in-kernel類似物。 – Tsyvarev

回答

1

sys_bind()sys_ioctl(和sys_socket)是(低電平)用戶空間接口給內核。您沒有向我們展示您編寫的代碼,但您需要爲您的網絡訪問使用更合適的內核內部接口。

+0

添加代碼。請建議如果使用內核模塊創建套接字的過程。 – user2522685

+0

對不起,我從來沒有在內核模塊中做過高級網絡。我看了一下NFS看看它是如何打開連接的,但是迷路了 - 也許NBD是一個更簡單的起點?嘗試閱讀'/ drivers/block/nbd.c',也許。 –

+1

使用以下函數可以在內核中創建套接字: sock_create()/ *創建套接字*/ sock-> ops-> bind()/ *綁定套接字*/ sock-> ops-> release()/*關閉套接字*/ struct socket是內核中套接字的結構,而不是用戶空間中的文件描述符。 – user2522685