在路上...

The development of life
我们一直都在努力,有您的支持,将走得更远...

站内搜索: Google

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

2009年8月27日

摘要: splice()其实是渗透了零拷贝的思想。splice()的本质是把一部分内核缓冲区暴露给的用户空间,具体的,暴露的是位于零拷贝两端之间的“中间缓冲”,这个“中间缓冲”描述的是数据位置信息,而不是数据本身,否则也就不是什么零拷贝了。 阅读全文
posted @ 2009-08-27 21:28 palam 阅读(3036) 评论(0) 推荐(0) 编辑

摘要: 介绍Linux内核中netfilter,iptable,连接跟踪,NAT功能。这个分析基于内核版本2.6.28。 阅读全文
posted @ 2009-08-27 21:26 palam 阅读(1337) 评论(0) 推荐(0) 编辑

摘要: (主要是摘译Programming with POSIX threads)如果想停止一个进程的主线程,而允许其他线程继续运行,必须使用pthread_exit(),而不是直接退出main()。从第三方的角度上看,一个线程通过返回正常退出或者通过pthread_exit()退出,与通过取消机制结束执行的唯一区别就是被取消的线程返回值总是PTHREAD_CANCELLED。一旦pthread_join... 阅读全文
posted @ 2009-08-27 21:24 palam 阅读(342) 评论(0) 推荐(0) 编辑

摘要: 经过反复摸索,我终于找到反汇编bzImage的方法。虽然还有些不完善(在结果中还不能看到.text段之外的符号),但我们总算是有机会看到可爱的汇编代码了,聊胜于无吧。 不要被bzImage的名字迷惑了,其实b代表着big的意思。而不是说这个image是用bzip2压缩。实际上,这个压缩过程是用gzip程序完成。我们在编译内核可以看到这一点。如果编译2.2或者2.4内核的话,可以直接看到,如果是2.... 阅读全文
posted @ 2009-08-27 21:23 palam 阅读(1019) 评论(0) 推荐(0) 编辑

摘要: SLAB的设计理念是基于对象缓冲的,基本想法是避免重复大量的初始化和清理操作。SLAB也可考虑到了CPU缓冲的有效利用。SLAB主要可以用于频繁分配释放的内存对象。 SLAB的设计目的是作为系统的核心缓冲系统,当然,在各个子系统里也可以使用独立的缓冲系统,但这种方法有三个缺点:(选译自:The Slab Allocator: An Object-Caching Kernel Memory Allo... 阅读全文
posted @ 2009-08-27 21:21 palam 阅读(1290) 评论(0) 推荐(0) 编辑

摘要: e1000驱动中有个宏计算所需发送描述符的数量: #define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1 )X应该是按比特计数的,可是我在调用它时,不小心把X用成了更大的值。在静态分析代码时我理所当然地认为,右移结果当然应该是0喽。但根据“凡走过必留下痕迹”的原则,我还是在这里还是加来了一个printk(),运行之后,唉,我发... 阅读全文
posted @ 2009-08-27 21:13 palam 阅读(378) 评论(0) 推荐(0) 编辑

摘要: #if 0变态的C表达式 1、局部变量i,是保存在栈上的,没有拷贝!2、不要试图编译成汇编代码分析,它们对你理解代码没有什么帮助,这招儿我试过了,后来想想也是不应该有用~3、后缀++,和前缀++的求值时间是理解以下程序的另一个关键点。4、程序中的注释,也是一些提示。嗯?你觉得它们更像谜语?猜吧。5、开动你的脑筋,只有自己想出来的答案,记忆才是最深刻的。#endif#include <stdi... 阅读全文
posted @ 2009-08-27 21:07 palam 阅读(216) 评论(0) 推荐(0) 编辑

摘要: 首先,“公平”绝不意味着“相等”,也就是说在分配处理器资源时,不能简单地将系统内所有任务都一视同仁,而要区别对待。这是因为系统内的任务本身就不是平等的,例如许多内核线程生来用来应付某种比较紧急的情况的,它们理应比普通的用户空间任务更优越一些(事实上CFS的早期版本确实会引起某些内核线程的饥饿)。从另一方面上看,绝对公平也是不可能实现的,CFS所关注的是时间上相对长程(long-term)的公平(也可看成是总体上的,统计上的公平),在每个小的时间区间很可能看起来并不是公平的,引起这种现象的可能是需要对以往的不公平作补偿、系统的负载发生变化、实现方法限制等诸多原因。此外,公平也应该是层次化的。不过,现在CFS并没有支持这种性质的公平,所以这里先按下不谈。所以说,CFS中的“C”和“F”其实都不是绝对的。 阅读全文
posted @ 2009-08-27 21:06 palam 阅读(511) 评论(0) 推荐(0) 编辑

摘要: Linux在调度任务时主要依靠两个优先级参数:1、静态优先级。“静态”得名于内核从不主动修改它,对于普通任务它被初始化为优先级中值120(最小100,最大140),只有通过系统调用才会修改它。内核在计算时间片、判断任务的交互性、计算动态优先级时都要直接或间接地使用到它,可以将它看成任务的“本性”;2、动态优先级。Linux任务是不能直接接触到这种优先级的,内核根据任务的平均休眠时间判断其交互特征进而计算出动态优先级。交互性强的任务会得到更高的优先级。特别提醒一下:此前内核也是支持一定的实时特征的,主要支持设施有三个:SCHED_FIFO和SCHED_RR调度策略和抢占式调度。 阅读全文
posted @ 2009-08-27 20:59 palam 阅读(566) 评论(0) 推荐(0) 编辑

摘要: Linux内核是个复杂的软件,作为一个成熟的操作系统核心部件,最可贵的就是它的开放源码。我想,有着“忧国忧民”抱负的程序员恐怕每天都会有“我要读懂它”的冲动。正是在这股“贼心”的驱使下,我开始了对Linux内核的学习。一路走来,我还远不能说是已经AtoZ了Linux内核,甚至不敢确定自己是不是已摆脱了“啮齿动物”的行列。但在领略其中的独特风景后,踏踏实实地体会到真是有些欲罢不能了。例如,内核中表面上看似稀松平常的五六行代码,有时却隐藏了许多秘密,反复思考之后,有时依然不得要领,在请教LKML上的牛人之后,才恍然大悟。每逢此时都禁不住感叹,“同是程序员,咋差距凑这么大哩?”。这种探索的乐趣是研究学习一般软件所不能获得的,我想这也是Linux内核的魅力所在吧。 阅读全文
posted @ 2009-08-27 20:52 palam 阅读(2391) 评论(0) 推荐(0) 编辑