linux 内核ioctl,Linux内核模块/ IOCTL:设备的ioctl不合适

我正在编写一个

Linux内核模块(LKM)作为伪驱动程序 – 我无法弄清楚如何在LKM(wait.c)和用户级程序(user.c)之间进行IOCTL调用).

设备驱动程序的幻数是0xBF – LKM不与物理块/字符设备通信,它只是一个练习.据我所知,对KERN_IOCTL_CREATE_EVENT的IOCTL调用格式不正确&幻数不正确.

我试图使用的IOCTL调用是:

#include

#define KERN_IOCTL_CREATE_EVENT _IOWR(WAIT_DEVICE_MAGIC,1,int)

int main(){

int ret;

int fd;

fd = open("/dev/wait",0);

if(fd < 0){

return -1;

}

ret = ioctl(fd,KERN_IOCTL_CREATE_EVENT,0);

[fail]: KERN_IOCTL_CREATE_EVENT: Inappropriate ioctl for device

用户模式应用程序可以打开/关闭指向设备的文件描述符:/ dev / wait但是case / switch语句不接受IOCTL调用.有什么建议?

这是#uname -a的输出

Linux vagrant-ubuntu-trusty-64 3.13.11.11+ #1 SMP Mon Dec 1 20:50:23 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

wait.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "wait.h"

MODULE_LICENSE("GPL");

MODULE_AUTHOR("Tyler Fisher ");

MODULE_DESCRIPTION("In-kernel wait queue");

static unsigned long event_table_size = 50;

module_param(event_table_size,ulong,(S_IRUSR | S_IRGRP | S_IROTH));

MODULE_PARM_DESC(event_table_size,"Size of event table (i.e. how many processes can be blocking)");

/* IOCTL function headers */

static int wait_open(struct inode *,struct file *);

static int wait_close(struct inode *,struct file *);

static long wait_ioctl(struct inode *,struct file *,unsigned int,unsigned long);

/* other function headers */

static long event_open(int event_id);

/* file operations */

static struct file_operations wait_fops = {

.owner = THIS_MODULE,.open = wait_open,.release = wait_close,.llseek = noop_llseek,.unlocked_ioctl = wait_ioctl

};

/* device handler */

static struct miscdevice wait_misc_device = {

.minor = MISC_DYNAMIC_MINOR,.name = WAIT_DEVICE_NAME,.fops = &wait_fops

};

/* open wait device */

static int wait_open(struct inode *inode,struct file *file){

dev_t node = iminor(inode);

if(MINOR(node) != WAIT_DEVICE_MINOR){

return -ENODEV;

}

return 0;

}

static int wait_close(struct inode *inode,struct file *file){

return 0;

}

static long wait_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long sub_cmd){

switch(cmd){

case KERN_IOCTL_CREATE_EVENT:

printk(KERN_INFO "[wait device]: create event %lu\n",sub_cmd);

return event_open(sub_cmd);

default:

return -ENOENT;

}

}

static long event_open(int id){

return 0;

}

static long __init wait_init(void){

if(misc_register(&wait_misc_device) < 0){

printk(KERN_ERR "[wait device] Failed to register device\n");

return -1;

}

printk(KERN_INFO "[wait device] has been registered\n");

return 0;

}

static void __exit wait_exit(void){

misc_deregister(&wait_misc_device);

printk(KERN_INFO "[wait device] has been unregistered\n");

}

module_init(wait_init);

module_exit(wait_exit);

wait.h

#include

#define WAIT_DEVICE_NAME "wait"

#define WAIT_DEVICE_MAGIC 0xBF

#define WAIT_DEVICE_MAJOR 200

#define WAIT_DEVICE_MINOR 0

#define KERN_IOCTL_CREATE_EVENT _IOWR(WAIT_DEVICE_MAGIC,0x01,int)

#define MAX_WAITING 5

IOCTL调用的测试程序:

user.c的

#include

#include

#include

#define WAIT_DEVICE_MAGIC 0xBF

#define KERN_IOCTL_CREATE_EVENT _IOWR(WAIT_DEVICE_MAGIC,int)

#define KERN_IOCTL_DESTROY_EVENT _IOWR(WAIT_DEVICE_MAGIC,0x02,int)

#define KERN_IOCTL_LOCK_EVENT _IOWR(WAIT_DEVICE_MAGIC,0x03,int)

#define KERN_IOCTL_UNLOCK_EVENT _IOWR(WAIT_DEVICE_MAGIC,0x04,int)

int main(){

int fd;

if(fd = open("/dev/wait",O_RDWR) < 0){

perror("Failed to open /dev/wait");

return -1;

}

/* test IOCTL: event creation */

if(ioctl(fd,0) < 0){

perror("[fail]: KERN_IOCTL_CREATE_EVENT");

return -1;

}

return 0;

}

Makefile文件

obj-m += wait.o

CFLAGS_wait.o += -DDEBUG

all:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

为了测试LKM – 清除dmesg,编译&执行user.c w / GCC:

# dmesg -c > /dev/null 2>&1

# make

# rmmod wait.ko

# insmod wait.ko

# gcc user.c -o user && ./user

调试错误的数量令人尴尬.我感到很难分享这一点 – 并且意识到这可能会导致问题被关闭/失去遗忘.

# sh test.sh

[+] cleared dmesg

make -C /lib/modules/3.13.11.11+/build M=/home/vagrant/PROG40000-kernel-synchronization modules

make[1]: Entering directory `/home/vagrant/ubuntu-trusty'

CC [M] /home/vagrant/PROG40000-kernel-synchronization/wait.o

/home/vagrant/PROG40000-kernel-synchronization/wait.c:61:1: warning: initialization from incompatible pointer type [enabled by default]

};

^

/home/vagrant/PROG40000-kernel-synchronization/wait.c:61:1: warning: (near initialization for ‘wait_fops.unlocked_ioctl’) [enabled by default]

In file included from include/linux/moduleparam.h:4:0,from /home/vagrant/PROG40000-kernel-synchronization/wait.c:11:

/home/vagrant/PROG40000-kernel-synchronization/wait.c: In function ‘__inittest’:

include/linux/init.h:297:4: warning: return from incompatible pointer type [enabled by default]

{ return initfn; } \

^

/home/vagrant/PROG40000-kernel-synchronization/wait.c:167:1: note: in expansion of macro ‘module_init’

module_init(wait_init);

^

Building modules,stage 2.

MODPOST 1 modules

CC /home/vagrant/PROG40000-kernel-synchronization/wait.mod.o

LD [M] /home/vagrant/PROG40000-kernel-synchronization/wait.ko

make[1]: Leaving directory `/home/vagrant/ubuntu-trusty'

[--dmesg--]

[13112.810008] [wait device] has been unregistered

[13112.819049] [wait device] has been registered

[-/dmesg--]

[+] compiled user-mode program

-----

[fail]: KERN_IOCTL_CREATE_EVENT: Inappropriate ioctl for device

[fail]: KERN_IOCTL_CREATE_EVENT: Inappropriate ioctl for device

[+] executed user-mode program

-----

[--dmesg--]

[13112.810008] [wait device] has been unregistered

[13112.819049] [wait device] has been registered

[13112.893049] SOMEONE DARE READ FROM ME!?

[13112.893057] [wait device] invalid magic number: 0:0:191

[13112.893535] [wait device] invalid magic number: 0:0:191

[-/dmesg--]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值