关闭

从seq_file接口读取的数据不全

738人阅读 评论(0) 收藏 举报

好久没写博客了。每当一天过去感觉毫无收获,工作内容无趣,或者觉得做这些事完全是浪费时间时,就会想通过某种方式督促自己有所总结,重新思考学习方式,改变学习策略。总之,在工作内容很不乐观的情况下,维持原状是最坏的选择。应急而变,多试一下学习方法与模式,一来调节下当前状态,二来后续若再遇此境,转变也会来的及时。


标题所述的事已经是一个月前遇到的了。彼时的任务只是从内核态导出一些数据。seq_file大名早有耳闻,难得有此机会,何不使用一番?


虽说这东西很早就知道了,却一直懒于思考其原理。在工作环境中用了,思考的驱动力自然要大一些。好在东西并不复杂,尝试几番,很快就实现了功能。本以为事情至此便结束,不料几天以后,发现数据总是读少了。这还不一定是seq_file的原因,说不定是内核生成的数据少了。几经排查,问题确实出在seq_file接口上。稀奇的是,用cat读到的和用dd读到的数据数量居然不一样。就算是用dd,设置不同的bs,得到的结果也不尽相同。要求交差日期逼进,使用陌生接口带来的窘境立马显现了出来。顶着压力看代码确实不是滋味。好在后来需求变化,这个东西最终没有用上场。


可是问题仍未解决。没有工作的压力,自己又懒得去研究其中的细节。话说回来,也没“要使用接口先看懂接口实现”这种事。虽然心里有一丝放不下,此事最终还是过去。不得不感叹工作以后,激情骤减,毅力全无。若是一年前还在校园时,必然会全力搞懂细节。现在却感觉这样做很累。这种转变,也才发生在不一年之内。


一次在网吧下东西,闲来无事,想起了这个东西。这种情况已经发生太多次了,以前这种时候是玩ZUMA,后来腻了,碰到这种时候就看资料。我记得在这种情形下看过USB spec,USB Mass Storage spec,这一次,自然是研究seq_file。


在lxr上看了半天,大致找到了原因。seq_start'的时候返回第一个object,我采用的策略是:如果内部的一个index为0就返回处一个object,不然返回NULL。背后的想法是,我不打算支持seek。看了代码才知道,就没有seek,当seq_file扩大内存时,还会重新调一次seq_start,于是悲剧发生。


找到了这个地方,我又不想往下看了。这东西在工作中也无需再使用,因此也没有验证。但是后来在某份内核文档里看到,因为seq_file实现的原理,dd或者cat可能读不全数据。这让我觉得很稀奇,这难道不是一个BUG?可能seq_file最终就是如此,也有可能文档太老,seq_file初期是如此,后面已经改好了。


虽然最终没有透彻地搞懂,这次经历就当是业余自主学习吧。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:111106次
    • 积分:1552
    • 等级:
    • 排名:千里之外
    • 原创:47篇
    • 转载:6篇
    • 译文:0篇
    • 评论:12条
    最新评论