应用程序调用hello驱动,写入数据是打印写入的数据为0,这种问题该怎么排查呀老师

驱动代码如下:





设备文件

应用程层序运行结果

!

copy_from_user() 是一个用于将用户空间数据复制到内核空间的函数,常用于驱动程序和内核模块中。它的返回值是复制失败的字节数,如果复制成功,则返回0。

但是是应用层的write函数返回值为零

在驱动中的 wirte 函数中,将 return ret; 修改为 return 100; 实验一下,你就明白了;

这个驱动中的write返回值会给到应用层write,然后作为应用层write返回值??

驱动中的 wirte 函数中,将 return ret; 修改为 return 100 是一样的效果!应用层的write还是0,驱动中的 wirte 函数中返回值跟应用层的write函数返回值没有半毛钱关系!

在 return 100; 前添加打印 printk(“hello_write return 100\n”); 然后截图看看结果;

这是何意??怀疑驱动程序的write没有调用到???可是dmesg都已经有打印write函数了的呀

我个人认为 write 函数的返回值会返回给应用;怀疑你驱动没有更新什么的;你试一下吧;

驱动程序是在编译过内核、设备树后编译的,内核与设备树都按照文档放进去了的,然后我写完驱动程序只用了 make modules 编译模块,难道是这个问题??

我一般都是通过打印来调试问题;如果驱动是 ko 文件,那就手动装载;如果驱动是编译进内核的,那就更新内核文件;

嫌弃每次重启后都要手动加载 .ko 文件才能在/dev/目录下才能看到设备文件,所以我就在/etc/init.d/rcS文件里让其自动加载的

这样可以的;所以应用还是收到 0,并且有 hello_write return 100 打印?

暂时没时间试,要等到下班就回去试。但我的判断依旧是一样的结果

嗯嗯,按实际结果理解就行;我也不懂这些;

。。。。。等到回去试了再联系你结果

应用层源代码如下

fc8c94c7ca0ddc6067e53539540204d

运行结果,奇怪的是在关闭文件之后触发段错误。
11f801e3f5674cdbc537aaa78fcf714

还有就是内核拷贝用户空间的那俩函数返回值为啥会给到应用层作为应用层的函数返回值??