!编译内核模块
我是内核模块编程的新手,并尝试使用'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;
}
sys_bind()
和sys_ioctl
(和sys_socket
)是(低电平)用户空间接口给内核。您没有向我们展示您编写的代码,但您需要为您的网络访问使用更合适的内核内部接口。
添加代码。请建议如果使用内核模块创建套接字的过程。 – user2522685
对不起,我从来没有在内核模块中做过高级网络。我看了一下NFS看看它是如何打开连接的,但是迷路了 - 也许NBD是一个更简单的起点?尝试阅读'/ drivers/block/nbd.c',也许。 –
使用以下函数可以在内核中创建套接字: sock_create()/ *创建套接字*/ sock-> ops-> bind()/ *绑定套接字*/ sock-> ops-> release()/*关闭套接字*/ struct socket是内核中套接字的结构,而不是用户空间中的文件描述符。 – user2522685
简而言之:Syscalls用于**用户空间程序**,不用于*内核模块*。一些系统调用有类似于内核使用。我不知道'ioctl','bind'和'socket'的in-kernel类似物。 – Tsyvarev