编写驱动程序遇到的数的问题,然后请问哪里有内核说明文档,谢了
本帖最后由 RYefccd 于 2014-11-18 20:20 编辑刚才看的关于内核bug的帖子,想起来半年前的课上的一个问题。想跟大家讨论一下,最后要做毕业设计了,需要内核的文档,请问在哪里找?
上个学期在刚开始学习编写驱动时,一个同学发现的。一般会判断大小是否超过一页,1024B。文件指针有一个相对位置移动的功能,如果向反方向移动,会用当前指针减去要移动的位数(即s为负数),并判断其结果是否小于1024. if(p + s < 1024 ) ........
结果if结果为假,本来只是为了程序的健壮性才做的判断,因为刚开始学,基本上一页内存的缓冲区就够了,排除了其他可能的错误,结果发现这里错了,当时觉得很不可思议,想了很久,是因为它没有执行减法,而是负数s被表示为它的补码,是一个大于1024的数字,明白这个以后,我就先进行判断,如果s大于2的16次方减1,那么他就是负数,手动用2的32次方减去这个数。得到应该向左偏移的位数,再用当前指针p减去s就可以了。
这应该算是个bug吧,是一个同学发现的,她没有用老师要求的内核版本,不过我忘了具体的是哪一个版本。我们的就没有这个情况,看来他们应该更正了这个缺陷。我觉得可能是在传递s这个参数的时候,不小心把有符号长整参数变成了无符号数吧,不过,我不知道怎么看内核代码,就没找出出错的点。不知道谁遇到过类似的情况。 内核没有全面的文档,要学就买本书吧。 看似类型转换的问题吧~
文档只有代码doc目录下很小的一部分,确实书上写的最全面。 回复 3# humjb_1983
谢了啊,我是这么猜测的。是因为有符号数传递过程中变成了无符号数,不过不能肯定。关于文档的问题,那些写linux的书的人的资料不是从文档中来的吗?我还以为有完整的说明文档呢,网上找半天也没有,内核代码下载的地方也没看见,谢了啊,我去看看doc下面的。 回复 2# Tinnal
谢了,你们平常怎么看源码呢?如果我想在win7下看看,有什么好的方法么? 回复 5# RYefccd
source insight win下看代码就source insight,书嘛就那么基本经典的
1.毛德操 源码剖析,这本书会把主要的函数讲的非常细致,细致到函数中主要代码的含义 比较适合新手看版本2.4
2.深入理解linux内核,侧重讲原理,不会大篇幅的讲代码 版本2.6
3.深入理解linux内核架构和2互补吧,篇幅更长,比2讲的稍微细致些版本2.6 回复 7# super皮波
谢了,我会去看看的 回复 6# Tinnal
谢了, if(p + s < 1024 ) 不要这样写代码,要养成好习惯,即使是在贴吧里面。
页:
[1]
2