linux - 设备驱动程序 IOCTL 传递 int

标签 linux linux-kernel linux-device-driver ioctl

我已经编写了一个设备驱动程序,需要向它传递一个 int 值。为此我正在使用 copy_from_user()。这是我到目前为止所做的,

#define MY_MAGIC 'G'
#define TEST_IOCTL _IO(MY_MAGIC, 0)
#define PASS_STRUCT_ARRAY_SIZE _IOW(MY_MAGIC, 1, int )
#define TEST_IOCTL_ONE _IO(MY_MAGIC, 2)


int major;

int device_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg){

int ret, SIZE;

switch(cmd){

    case TEST_IOCTL:
        printk("NO argument IOCTL called\n");
        break;

    case PASS_STRUCT_ARRAY_SIZE:
            printk("Inside PASS_STRUCT_ARRAY_SIZE\n");
        ret = copy_from_user(SIZE, arg, sizeof(int));
        if(ret < 0){
            printk("Error in PASS_STRUCT_ARRAY_SIZE\n");
            return -1;  
        }
        printk("Struct Array Size : %d\n",SIZE);
        break;

    case TEST_IOCTL_ONE:
        printk("NO argument IOCTL_ONE called\n");
        break;

    default :
        return -ENOTTY;
}

return 0;

}

当我调用 TEST_IOCTLTEST_IOCTL_ONE 时,模块工作正常。但是,当我调用 PASS_STRUCT_ARRAY_SIZE 时,系统会卡住。

用户空间代码是这样的,

if(ioctl(fd, PASS_STRUCT_ARRAY_SIZE, 10) < 0){
    perror("PASS_STRUCT_ARRAY_SIZE : ");
        return -1;
}

我做错了什么?

最佳答案

对不起,我之前的回答是错误的。由于参数是一个整数,您应该只使用它而无需 copy_from_user:

SIZE = arg;

当参数是指针时,您只需要copy_from_user

关于linux - 设备驱动程序 IOCTL 传递 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12128546/

相关文章:

logging - 将 Linux 内核日志缓冲区扩大到 2M 以上

linux-kernel - 编译 Ubuntu-8.04 时生成中间 .i 文件(预处理文件)

linux - 如何区分内核中的软锁定和用户空间中的软锁定?

linux - 如何获取UBUNTU IOS?

linux - 在 Linux 中将音频流式传输到 "speaker server"

linux - 服务文件中的 After 和 Requires 标签是什么意思?

c++ - #include <cmath> : "In FIle included from" error message?

c - 关于在多线程环境中捕获 SIGSEGV

linux - CentOS 错误 :/lib/ld-linux. so.2:错误的 ELF 解释器:没有这样的文件

c - 谁在驱动代码中调用了 "probe"函数?