系统调用未定义!编译内核模块



我是内核模块编程的新手,并试图在我的内核模块中使用'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!!rn");
    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!!rn");
    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 socketrn");
    return OFC_FAILURE;
}

sys_bind()sys_ioctl(和sys_socket)是(低级)用户空间内核接口。您还没有向我们展示您编写的代码,但是您需要为您的网络访问使用更合适的内核内部接口。

最新更新