【问题标题】:system calls undefined! Compiling kernel module系统调用未定义!编译内核模块
【发布时间】:2016-10-03 16:57:58
【问题描述】:

我是内核模块编程的新手,并尝试使用“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;
}

【问题讨论】:

  • 简而言之:系统调用适用于用户空间程序,而不适用于内核模块。一些系统调用有类似的内核使用。我不知道ioctlbindsocket 的内核类似物。

标签: c linux-kernel kernel-module


【解决方案1】:

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

【讨论】:

  • 添加了代码。请建议是否使用内核模块创建套接字的过程。
  • 对不起,我从来没有在内核模块中做过高级网络。我查看了 NFS 以了解它如何打开连接,但迷路了 - 也许 NBD 是一个更简单的起点?试试看/drivers/block/nbd.c,也许吧。
  • 可以使用以下函数在内核中创建套接字: sock_create() /* 创建套接字/ sock->ops->bind () / 绑定套接字 / sock->ops->release() / 关闭套接字 */ struct socket 是内核中套接字的结构,而不是用户空间中的文件描述符。
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
相关资源
最近更新 更多