DongHao: 09 2010存档
这个是以前的事。
我在读研,晚上买3元钱的面包,第二天早上吃掉一半当早餐,第三天早上再吃另一半。
妈表示很生气:“怎么吃一半面包?都吃了呗”
我:“3元的面包,太贵了”
妈对着爸说:“你管管你儿子,瞎节约,不像话。一个面包每次只吃一半!”
爸:“一半?那也要看这个面包有多大呀,(指着家里的枕头)要是那么大,我也只能吃一半啊!”
这个是前天的事。
爸妈去浩沙健身中心游泳,爸忘了带泳帽,但还是下水了。一会儿管理人员就来了。
管理员:“老先生,这里游泳要带泳帽”
爸:“喔,我忘了带了,但是(就在水里划拉了两下)我这样游脑袋在水面上,不要紧的”
管理员:“......您的泳姿不是标准的蛙泳啊”
爸:“(继续在水里划拉)这难道不像青蛙吗?”
从一个虚拟设备里读取数据,我是用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
唉,一个简单的代码疏漏耗费半天时间。要是有个代码高手指导指导我就好了。