当前位置: 技术问答>linux和unix
驱动程序的write问题
来源: 互联网 发布时间:2016-07-23
本文导语: 我整了一个开发板的字符驱动,交叉编译的,运行起来没问题,以后跑客户程序,简单的: open后ioctl然后再write,但问题是open和ioctl都能调用到驱动中的注册函数,即struct file_operations中的 struct file_operations ed_ops ={ ...
我整了一个开发板的字符驱动,交叉编译的,运行起来没问题,以后跑客户程序,简单的:
open后ioctl然后再write,但问题是open和ioctl都能调用到驱动中的注册函数,即struct file_operations中的
struct file_operations ed_ops ={
.owner = THIS_MODULE,
.read = device_read,
.write = device_write,
.ioctl = device_ioctl,
.open = device_open,
...
};
到write(fs,buf,len);即开始向设备文件中写的时候就总是返回-1,关键是没有调用到device_write。
而同样的程序在linux2.6版本下,用gcc编译后能write正常。
不知什么原因?如果不行那应该都不行,但是open,和ioctl可以
open后ioctl然后再write,但问题是open和ioctl都能调用到驱动中的注册函数,即struct file_operations中的
struct file_operations ed_ops ={
.owner = THIS_MODULE,
.read = device_read,
.write = device_write,
.ioctl = device_ioctl,
.open = device_open,
...
};
到write(fs,buf,len);即开始向设备文件中写的时候就总是返回-1,关键是没有调用到device_write。
而同样的程序在linux2.6版本下,用gcc编译后能write正常。
不知什么原因?如果不行那应该都不行,但是open,和ioctl可以
|
贴代码才是正途。。
|
可以读吗?
|
能看到printk打印信息,说明系统可写.换个内存分配方式.
-- static unsigned char demoBuffer[256];
++ char *demoBuffer;
int DEMO_init_module(void)
{
......
if(result)
{
printk(KERN_NOTICE "Error %d adding DEMOn", result);
goto fail;
}
++ if ((demoBuffer = kmalloc(sizeof(char) * 256, GFP_KERNEL)) == NULL) {
-- static unsigned char demoBuffer[256];
++ char *demoBuffer;
int DEMO_init_module(void)
{
......
if(result)
{
printk(KERN_NOTICE "Error %d adding DEMOn", result);
goto fail;
}
++ if ((demoBuffer = kmalloc(sizeof(char) * 256, GFP_KERNEL)) == NULL) {
|
会不会是缓冲?用系统调用sys_write 还是直接调用的?
如果是sys_write的话, 使用了页缓冲,并没有马上写,因此不会调用device_write.
如果是sys_write的话, 使用了页缓冲,并没有马上写,因此不会调用device_write.
|
这个问题我建议你还是一层一层的跟下去, 字符驱动上面的一层是基本的文件调用sys_write, 最低层的write没有调用到可能是在它的上面一层就歇菜了, 你要把那个代码点找到, 然后看看是什么原因导致的.
"__ratelimit: 1692149 messages suppressed
BUG ed0 code -16 qlen 0"
这个错误说明你在做write的时候陷入一个死循环了, 他在不断得打印BUG ed0 code -16 qlen 0. 这样子当然不会往下走了.
"__ratelimit: 1692149 messages suppressed
BUG ed0 code -16 qlen 0"
这个错误说明你在做write的时候陷入一个死循环了, 他在不断得打印BUG ed0 code -16 qlen 0. 这样子当然不会往下走了.
|
发帖子真是越来越贵了,有钱发帖的也越来越少。
|
楼主是不是开了cache导致无法访问外设?