Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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 kernel insmod之后,我无法在/proc/devices中看到设备条目_Linux Kernel_Device Driver - Fatal编程技术网

Linux kernel insmod之后,我无法在/proc/devices中看到设备条目

Linux kernel insmod之后,我无法在/proc/devices中看到设备条目,linux-kernel,device-driver,Linux Kernel,Device Driver,执行命令“insmod demo_device”后,安装/proc/modules中列出的模块 **demo_device 2528 0 - Live 0xe02da000** fp_indicators 5072 1 - Live 0xe02d2000 (P) screader 22672 1 - Live 0xe02c5000 (P) icamdescrambler 12912 0 - Live 0xe02b2000 (P) icamemmfilter 16208 0 - Live 0xe0

执行命令“insmod demo_device”后,安装/proc/modules中列出的模块

**demo_device 2528 0 - Live 0xe02da000**
fp_indicators 5072 1 - Live 0xe02d2000 (P)
screader 22672 1 - Live 0xe02c5000 (P)
icamdescrambler 12912 0 - Live 0xe02b2000 (P)
icamemmfilter 16208 0 - Live 0xe02a4000 (P)
icamecmfilter 14992 0 - Live 0xe0294000 (P)
但“p”在这之后就不起作用了

在触发命令
cat/proc/devices
后,此处未列出设备“demo\u device”

因此,我的问题是:(
cat/proc/modules
)中的(p)代表什么?设备未列在(
cat/proc/devices
)中的原因是什么

提前谢谢

源代码如下:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/errno.h>
#include <asm/uaccess.h>
#include "query_ioctl.h"

#define FIRST_MINOR 0
#define MINOR_CNT 1

static dev_t dev;
static struct cdev c_dev;
static struct class *cl;
static int status = 1, dignity = 3, ego = 5;

static int my_open(struct inode *i, struct file *f)
{
    return 0;
}
static int my_close(struct inode *i, struct file *f)
{
    return 0;
}
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
static int my_ioctl(struct inode *i, struct file *f, unsigned int cmd, unsigned long arg)
#else
static long my_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
#endif
{
    query_arg_t q;

    switch (cmd)
    {
        case QUERY_GET_VARIABLES:
            q.status = status;
            q.dignity = dignity;
            q.ego = ego;
            if (copy_to_user((query_arg_t *)arg, &q, sizeof(query_arg_t)))
            {
                return -EACCES;
            }
            break;
        case QUERY_CLR_VARIABLES:
            status = 0;
            dignity = 0;
            ego = 0;
            break;
        case QUERY_SET_VARIABLES:
            if (copy_from_user(&q, (query_arg_t *)arg, sizeof(query_arg_t)))
            {
                return -EACCES;
            }
            status = q.status;
            dignity = q.dignity;
            ego = q.ego;
            break;
        default:
            return -EINVAL;
    }

    return 0;
}

static struct file_operations query_fops =
{
    .owner = THIS_MODULE,
    .open = my_open,
    .release = my_close,
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
    .ioctl = my_ioctl
#else
    .unlocked_ioctl = my_ioctl
#endif
};

static int __init query_ioctl_init(void)
{
    int ret;
    struct device *dev_ret;

    printk("Before calling alloc\n");
    dev=150;
    if ((ret = register_chrdev_region(dev, MINOR_CNT, "demo_device")))
    {
        return ret;
    }
    else if((ret = alloc_chrdev_region(&dev,0,MINOR_CNT,"demo_device")))
    {
        return ret;
    }
    printk("After alloc %d %d\n",ret,dev);


    cdev_init(&c_dev, &query_fops);

    if ((ret = cdev_add(&c_dev, dev, MINOR_CNT)) < 0)
    {
        return ret;
    }
    printk("After cdev_add\n");

    if (IS_ERR(cl = class_create(THIS_MODULE, "char")))
    {
        cdev_del(&c_dev);
        unregister_chrdev_region(dev, MINOR_CNT);
        return PTR_ERR(cl);
    }
    printk("After class_create\n");

    if (IS_ERR(dev_ret = device_create(cl, NULL, dev, NULL, "demo")))
    {
        class_destroy(cl);
        cdev_del(&c_dev);
        unregister_chrdev_region(dev, MINOR_CNT);
        return PTR_ERR(dev_ret);
    }
    printk("After device_create\n");


    return 0;
}

static void __exit query_ioctl_exit(void)
{
    device_destroy(cl, dev);
    class_destroy(cl);
    cdev_del(&c_dev);
    unregister_chrdev_region(dev, MINOR_CNT);
}

module_init(query_ioctl_init);
module_exit(query_ioctl_exit);

MODULE_LICENSE("GPL");
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“query\u ioctl.h”
#定义第一个小0
#定义次要内容1
静态开发;
静态结构cdev c_dev;
静态结构类*cl;
静态智力状态=1,尊严=3,自我=5;
静态int my_open(结构索引节点*i,结构文件*f)
{
返回0;
}
静态int my_close(结构索引节点*i,结构文件*f)
{
返回0;
}
#if(LINUX版本代码<内核版本(2,6,35))
静态int my_ioctl(结构索引节点*i,结构文件*f,无符号int cmd,无符号长参数)
#否则
静态长my_ioctl(结构文件*f,无符号int cmd,无符号长参数)
#恩迪夫
{
查询参数;
开关(cmd)
{
案例查询\u获取\u变量:
q、 状态=状态;
q、 尊严=尊严;
q、 自我=自我;
if(复制到用户((查询参数*)参数,&q,sizeof(查询参数)))
{
回报-反应;
}
打破
案例查询\u CLR\u变量:
状态=0;
尊严=0;
自我=0;
打破
案例查询\设置\变量:
if(从用户复制参数(&q,(查询参数*)参数,大小(查询参数)))
{
回报-反应;
}
状态=q状态;
尊严=尊严;
自我=自我;
打破
违约:
返回-艾因瓦尔;
}
返回0;
}
静态结构文件\u操作查询\u fops=
{
.owner=此_模块,
.open=my_open,
.release=my_close,
#if(LINUX版本代码<内核版本(2,6,35))
.ioctl=我的ioctl
#否则
.unlocked\u ioctl=我的\u ioctl
#恩迪夫
};
静态int\uuu init查询\u ioctl\u init(void)
{
int ret;
结构设备*dev_ret;
printk(“调用alloc之前”);
dev=150;
if((ret=注册chrdev区域(开发、次要设备,“演示设备”))
{
返回ret;
}
else if((ret=alloc_chrdev_region(&dev,0,MINOR_CNT,“演示设备”))
{
返回ret;
}
printk(“在分配%d%d\n之后”,ret,dev);
cdev_init(&c_dev,&query_fops);
如果((ret=cdev\u add(&c\u dev,dev,MINOR\u CNT))<0)
{
返回ret;
}
printk(“在cdev_添加\n之后”);
if(IS_ERR(cl=class_create(这个模块,“char”))
{
cdev_del(和c_dev);
取消注册chrdev地区(dev,MINOR_CNT);
返回PTR_错误(cl);
}
printk(“类后创建\n”);
if(IS_ERR(dev_ret=device_create(cl,NULL,dev,NULL,“demo”))
{
类别(cl);;
cdev_del(和c_dev);
取消注册chrdev地区(dev,MINOR_CNT);
返回PTR_ERR(dev_ret);
}
printk(“在设备\u创建\n之后”);
返回0;
}
静态无效\uuuu退出查询\uIOCTL\u退出(无效)
{
设备销毁(cl、dev);
类别(cl);;
cdev_del(和c_dev);
取消注册chrdev地区(dev,MINOR_CNT);
}
模块初始化(查询初始化);
模块退出(查询ioctl退出);
模块许可证(“GPL”);
插入模块后,我可以看到以下消息:

$insmod demo_device.ko
在调用alloc之前
分配后0 217055232
在cdev_之后添加
课后创建
在设备创建之后

$

查看kernel/module.c中的
module\u flags\u taint()


“p”标志仅表示其他模块为专有模块。您的设备没有出现在
/proc/devices
中的原因可能是因为初始化有问题,但我们无法帮助您,除非您向我们显示代码。

在执行linux/应用程序源代码后,请清理并重新构建它…使其正常工作。现在,插入模块后,相应的条目将显示在/proc/devcies文件中:)

确保设备的主编号不被其他设备文件占用。使用以下命令检查占用的主要号码

   cat /proc/devices
使用以下代码捕获init函数中的初始化错误

   int t=register_chrdev(majorNumber,"mydev",&fops);

   if(t<0)
   printk(KERN_ALERT "device registration failed.");
int t=register\u chrdev(主要编号,“mydev”和fops);

如果我认为这个问题属于