Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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 内核在4.9.82-ti-r102 debian 9.3中写入字符设备文件时抛出错误_Linux_Linux Device Driver_Beagleboneblack - Fatal编程技术网

Linux 内核在4.9.82-ti-r102 debian 9.3中写入字符设备文件时抛出错误

Linux 内核在4.9.82-ti-r102 debian 9.3中写入字符设备文件时抛出错误,linux,linux-device-driver,beagleboneblack,Linux,Linux Device Driver,Beagleboneblack,我成功地在/dev文件夹下创建了设备文件,但写入该设备文件会导致内核抛出以下错误消息 kernel:[10090.943733] Internal error: : 1b [#3] PREEMPT SMP ARM kernel:[10091.049020] Process echo (pid: 3728, stack limit = 0xdc40a218) kernel:[10091.054880] Stack: (0xdc40be60 to 0xdc40c000) kernel:[10091.

我成功地在/dev文件夹下创建了设备文件,但写入该设备文件会导致内核抛出以下错误消息

kernel:[10090.943733] Internal error: : 1b [#3] PREEMPT SMP ARM
kernel:[10091.049020] Process echo (pid: 3728, stack limit = 0xdc40a218)
kernel:[10091.054880] Stack: (0xdc40be60 to 0xdc40c000)
kernel:[10091.059267] be60: c15491c6 00000022 dc5cb14c bf30430c dc40bedc dc40be88 c075312c c074fe5c
kernel:[10091.067488] be80: c0753018 ffffff04 ffff0a00 c140414c c0d407c8 bf30430c c140414c 40cfbcf3
kernel:[10091.075709] bea0: 00852878 ffffff04 ffff0a00 00040952 c01a7404 c140414c 00852878 00852878
Segmentation fault
我知道Linux设备驱动程序的基本知识

有人能帮我吗

我正在附加这个字符设备驱动程序的代码

#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/module.h>
#include<linux/fs.h>
#include<linux/uaccess.h>
#include<linux/device.h>


MODULE_AUTHOR("RUCHA");
MODULE_DESCRIPTION("Character Driver First test");
MODULE_LICENSE("GPL");
MODULE_VERSION("0.0.1");


static int MajorNum;
static struct class* RetValOfClassRegistration = NULL;
static struct device*  RetVal = NULL;
static char message[1024];
static int openDev(struct inode * , struct file *);
static int closeDev(struct inode * , struct file *);
static ssize_t readDev(struct file *, char *, size_t, loff_t *);
static ssize_t writeDev(struct file *, const char *, size_t, loff_t *);

static struct file_operations FileOps = {

    .owner = THIS_MODULE,
    .open = openDev,
    .read = readDev,
    .write = writeDev,
    .release = closeDev,

};

static int registerCharDev(void){

    return register_chrdev(0,"MyDev",&FileOps);
}

static int __init Loaded(void){

    // registering device

    MajorNum = registerCharDev();

    if(MajorNum < 0){
        printk("Can not register device\n");
        return -1;
    }

    printk("Driver Loaded with %d \n",MajorNum);


    // registering device class

    RetValOfClassRegistration = class_create(THIS_MODULE,"MyCharacterDriver");

    if(RetValOfClassRegistration < 0){

        printk("can not register class for driver number : %d\n",MajorNum);
        return 0;
    }


    // register the driver

    RetVal = device_create(RetValOfClassRegistration,NULL,MKDEV(MajorNum,0),NULL,"MyDev");


    return 0;

}


static void __exit Removed(void){
    device_destroy(RetValOfClassRegistration,MKDEV(MajorNum,0));
    class_unregister(RetValOfClassRegistration);
    class_destroy(RetValOfClassRegistration);
    unregister_chrdev(MajorNum,"MyDev");
    printk("Driver Removed\n");
}


module_init(Loaded);
module_exit(Removed);


static int openDev(struct inode *inodep , struct file *filep){

    printk("Device is now open to read write operations\n");
    return 0;
}


static int closeDev(struct inode *inodep , struct file *filep){

    printk("Device Closed\n");
    return 0;
}

static ssize_t readDev(struct file *filep, char *c, size_t v, loff_t *lp){

    printk("Read From the device\n");
    return 0;
}

static ssize_t writeDev(struct file *file, const char __user *buf, size_t count, loff_t *offset)
{
    sprintf(message, "%s(%zu letters)", buf, len);
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
模块作者(“RUCHA”);
模块描述(“字符驱动程序第一次测试”);
模块许可证(“GPL”);
模块_版本(“0.0.1”);
静态内部主节点;
静态结构类*RetValOfClassRegistration=NULL;
静态结构设备*RetVal=NULL;
静态字符消息[1024];
静态int-openDev(结构索引节点*,结构文件*);
静态int closeDev(结构索引节点*,结构文件*);
静态ssize_t readDev(结构文件*,字符*,大小,loff_t*);
静态ssize_t writeDev(结构文件*,常量字符*,大小,loff_t*);
静态结构文件\u操作文件操作={
.owner=此_模块,
.open=openDev,
.read=readDev,
.write=writeDev,
.release=closeDev,
};
静态整数寄存器chardev(void){
返回寄存器\u chrdev(0,“MyDev”和文件操作);
}
已加载静态int\uu init(void){
//注册设备
MajorNum=registerCharDev();
如果(主值<0){
printk(“无法注册设备\n”);
返回-1;
}
printk(“加载了%d\n的驱动程序”,MajorNum);
//注册设备类
RetValOfClassRegistration=class_create(该_模块,“MyCharacterDriver”);
如果(RetValOfClassRegistration<0){
printk(“无法为驱动程序编号:%d\n”注册类,MajorNum);
返回0;
}
//登记司机
RetVal=device_create(RetValOfClassRegistration,NULL,MKDEV(MajorNum,0),NULL,“MyDev”);
返回0;
}
静态无效uu退出已删除(无效){
设备销毁(类注册检索,MKDEV(MajorNum,0));
类别(未注册)(RetValOfClassRegistration);;
第二类销毁(收回类别登记);
注销chrdev(MajorNum,MyDev);
printk(“已删除驱动程序”);
}
模块_init(已加载);
模块_出口(已拆除);
静态int-openDev(结构inode*inodep,结构文件*filep){
printk(“设备现在打开进行读写操作\n”);
返回0;
}
静态int closeDev(结构inode*inodep,结构文件*filep){
printk(“设备关闭\n”);
返回0;
}
静态ssize\u t readDev(结构文件*filep,字符*c,大小\u t v,loff\u t*lp){
printk(“从设备读取\n”);
返回0;
}
静态ssize\u t writeDev(结构文件*文件、常量字符*用户*buf、大小计数、loff\u t*偏移量)
{
sprintf(消息,“%s(%zu个字母)”,buf,len);
返回0;
}
用户输入是


echo“1”>/dev/MyDev

您不能直接访问用户数据指针(
buf
)。首先需要使用将数据复制到内核内存中。另外,使用
snprintf
代替
sprintf
,以避免缓冲区溢出


另外,特别是
CONFIG\u DEBUG\u INFO
,以在内核日志中获取更多有用的错误消息。

那么,您是如何创建文件的,主要/次要编号是什么,它属于什么设备和驱动程序?此错误属于字符设备驱动程序,我在问题中添加了整个代码段。