Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux ioctl命令正在用户空间和内核空间之间更改_C_Linux_Ioctl - Fatal编程技术网

Linux ioctl命令正在用户空间和内核空间之间更改

Linux ioctl命令正在用户空间和内核空间之间更改,c,linux,ioctl,C,Linux,Ioctl,不确定这里是否有人有任何想法,我以前从未见过。我正在编写一个存根来测试我的内核模块,当我在用户空间中检查命令的值时,我得到的值与在内核空间中查看命令的值不同 存根的一部分: #include <stdio.h> #include <errno.h> #include <string.h> #include <fcntl.h> #include <sys/stat.h> #include "ain.h" #include "ain_ioc

不确定这里是否有人有任何想法,我以前从未见过。我正在编写一个存根来测试我的内核模块,当我在用户空间中检查命令的值时,我得到的值与在内核空间中查看命令的值不同

存根的一部分:

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "ain.h"
#include "ain_ioctl.h"
#define AI_DEVICE   "/dev/ain"

void main()
{
    int fd, error, ioctl_par = 0;
    char* dev;
    long ret;

    dev = AI_DEVICE;

    printf("Starting driver test\n");

    fd = open(dev, O_RDWR);
    if (fd < 0) {
    /* Failed to open -> Print error-message and exit */
    printf("%s failed to open, error: %s\n", dev, strerror(errno));
    }

    printf("Doing the IOCTL now... cmd: %d\n", AIN_IOC_GET_AN0_CONF);
    fflush(stdout);

    ret = ioctl(fd, AIN_IOC_GET_AN0_CONF, &ioctl_par);
内核中的ioctl例程:

int ain_ioctl (struct inode * inodep, struct file * filp, unsigned int cmd, unsigned long arg)
{
    printk("In the ain_ioctl function, cmd: %d. type: %d, dir: %d, nr: %d, size: %d\n", 
        cmd, _IOC_TYPE(cmd), _IOC_DIR(cmd), _IOC_NR(cmd), _IOC_SIZE(cmd));

    printk("Testing against command: %d. type: %d, dir: %d, nr: %d, size: %d\n",
        AIN_IOC_GET_AN0_CONF, _IOC_TYPE(AIN_IOC_GET_AN0_CONF), _IOC_DIR(AIN_IOC_GET_AN0_CONF), 
        _IOC_NR(AIN_IOC_GET_AN0_CONF), _IOC_SIZE(AIN_IOC_GET_AN0_CONF));
现在,我希望用户空间中的输出与内核中的输出相同。在内核中的第一组打印到第二组。然而,这不是我看到的

输出:

mike@linux-4puc:~> ./a.out 
Starting driver test
Doing the IOCTL now... cmd: -2147195602

mike@linux-4puc:~> dmesg | tail
[75253.205136] In the ain_ioctl function, cmd: -1078168112. type: 117, dir: 2, nr: 208, size: 16316
[75253.205140] Testing against            cmd: -2147195602. type: 101, dir: 2, nr: 46, size: 4
当我通过ioctl命令将命令传递给内核时,与我通过硬编码检查值时(就像我在打印中所做的那样),有人知道为什么我的命令的行为不同吗

我在构建时看到的唯一警告似乎与ioctl调用无关:

makedepend: warning: ignoring option -Wall 
makedepend: warning: ignoring option -Wall 
makedepend: warning: ain.c (reading /usr/src/linux/include/linux/compiler-gcc.h), line 94: incomplete include == "#include gcc_header(__GNUC__)" 
makedepend: warning: ain.c (reading /usr/src/linux/include/linux/string.h, line 13): cannot find include file "stdarg.h" 
谢谢。

这个-1078168112(为什么不用十六进制打印呢?)看起来像一个堆栈指针。可能
&ioctl\u par
。这表明ioctl方法接收的参数与预期的不同

在当前的内核源代码中,我看到ioctl方法使用3个参数,而不是4个。4参数ioctl似乎是一个较旧的接口

在模块编译期间,您是否收到任何警告?注意他们

-1078168112(为什么不以十六进制打印它们?)看起来像一个堆栈指针。可能
&ioctl\u par
。这表明ioctl方法接收的参数与预期的不同

在当前的内核源代码中,我看到ioctl方法使用3个参数,而不是4个。4参数ioctl似乎是一个较旧的接口


在模块编译期间,您是否收到任何警告?注意他们

艾伦·库里的回答不是完全“正确”的,但它让我找到了解决办法。该命令的十六进制值偏离了很多,所以我查看了内核中的其他ioctl调用

我的系统基于一个旧的2.4X内核,我正在将它更新为3.1。这里的问题是ioctl调用的参数列表。将inode指针放在参数列表中会导致问题,因为它将文件指针作为命令

正确的解决方案:

long ain_ioctl (struct file * filp, unsigned int cmd, unsigned long arg) { 
    ...

艾伦·库里的答案不是完全“正确”的答案,但它让我找到了解决办法。该命令的十六进制值偏离了很多,所以我查看了内核中的其他ioctl调用

我的系统基于一个旧的2.4X内核,我正在将它更新为3.1。这里的问题是ioctl调用的参数列表。将inode指针放在参数列表中会导致问题,因为它将文件指针作为命令

正确的解决方案:

long ain_ioctl (struct file * filp, unsigned int cmd, unsigned long arg) { 
    ...

我没有关于ioctl的警告。关于构建选项,我将在原始问题中包括这些选项。十六进制值为:0x8004652e=-2147195602 0xbf9c28e0=-1078168112I没有关于ioctl的警告。关于构建选项,我将在原始问题中包括这些选项。十六进制值为:0x8004652e=-2147195602 0xbf9c28e0=-1078168112