软件开发: 09 2010存档
从一个虚拟设备里读取数据,我是用read系统调用一次读完,发现反复读取多次后,数据出现了问题。
由于是自己写的虚拟设备,所以先怀疑是kernel module写的有问题,我自己实现了虚拟设备的read方法,难道偏移量的处理有问题?于是拿出万能的printk,调试......咦,怪了,怎么dmesg里打出的消息数不对?喔,dmesg的缓冲区设小了,改个大的,10M:
dmesg -s 10485760
测完,我在把内核数据通过copy_to_user拷给用户态之前还是正常的,拷了就不正常了,这这这,我记得copy_to_user就是判断一下内存空间的有效性,本身不会乱来的呀,好,为了证明,我改成memcpy。
还是不行,似乎只要把数据拷贝一下就不对了,神了......
最后终于发现,和module的代码没关系,是我在read的时候没有对读取的数据做结尾:
read(fd, buffer, BUFFER_SIZE);
// process buffer
正确的做法是:
int res = read(fd, buffer, BUFFER_SIZE);
buffer[res] = 0;
// process buffer
唉,一个简单的代码疏漏耗费半天时间。要是有个代码高手指导指导我就好了。