内核部分代码
在include\uapi\linux\sockios.h文件内增加如下消息定义
#define SIOCGIFBRCM 0x8984 /* */
#define SIOCSIFBRCM 0x8985 /* */
在net\socket.c文件内增加
static DEFINE_MUTEX(brcm_ioctl_mutex);
static int (*brcm_ioctl_hook) (struct net *, void __user *arg);
void brcm_ioctl_set(int (*hook) (struct net *, void __user *))
{
mutex_lock(&brcm_ioctl_mutex);
brcm_ioctl_hook = hook;
mutex_unlock(&brcm_ioctl_mutex);
}
EXPORT_SYMBOL(brcm_ioctl_set);
void brcm_ioctl_set(int (*hook)(struct net *, void __user *));
对应内核模块初始化
brcm_ioctl_set(brcm_ioctl_handler);
回调函数
static int brcm_ioctl_handler(struct net *net, void __user *arg)
{
int err = 0 ;
struct brcm_ioctl_args args;
if (copy_from_user(&args, arg, sizeof(struct brcm_ioctl_args)))
return -EFAULT;
printk(KERN_INFO "brcm_ioctl_handler %d\n", args.cmd);
return err;
}
static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
{
...
case SIOCGIFBRCM:
case SIOCSIFBRCM:
err = -ENOPKG;
if (!brcm_ioctl_hook)
request_module("brcm");
mutex_lock(&brcm_ioctl_mutex);
if (brcm_ioctl_hook)
err = brcm_ioctl_hook(net, argp);
mutex_unlock(&brcm_ioctl_mutex);
break;
...
return err;
}
用户空间通信部分
int io_socket = socket(AF_INET, SOCK_DGRAM, 0);
struct brcm_ioctl_args args = {0};
args.cmd = DEL_BRCM_CMD;
if (ioctl(io_socket, SIOCSIFBRCM, &args) < 0) {
perror("ioctl");
return -1;
}

本文介绍了一种在Linux内核中增加自定义IOCTL命令的方法,并展示了如何实现内核与用户空间之间的数据交互。具体包括在内核中定义新的IOCTL命令、实现相应的处理函数、设置钩子以及用户空间的调用示例。
1871

被折叠的 条评论
为什么被折叠?



