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

问题描述 投票:0回答:1
我成功在/ 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; }

并且用户输入为

echo'1'> / dev / MyDev

我已成功在/ dev文件夹下创建了设备文件,但是写入该设备文件会使内核抛出以下错误消息。内核:[10090.943733]内部错误:: 1b [#3] PREEMPT SMP ...

linux linux-device-driver beagleboneblack
1个回答
0
投票
您无法直接访问用户数据指针(buf)。您需要先使用copy_from_user将数据复制到内核内存中。另外,请使用copy_from_user而不是snprintf以避免缓冲区溢出。
© www.soinside.com 2019 - 2024. All rights reserved.