2010/10

各种被相亲

作为一个适龄男青年,每次回家难免经历各种相亲。好在我爸妈够彪悍,早在我察觉之前已经为我挡住了各种被相亲。

一开始不知道,我爸妈连提都没给我提,看那样子也没认真提的打算。今天吃饭的时候聊起我去西藏的事来,然后我妈就开始了,一直谈到了我谈女朋友的问题,然后历数了这半年多来各种给我们家提亲的事。不说不知道啊,一说吓一跳,原来哥也是这么抢手。。。T_T

好在我妈无比强悍,我妈早在我知道这种事之前就已经先儿子之忧而忧,为我挡住了各种提亲的要求,其中有女大学生,护士等……理由堂而皇之,说我儿子这么优秀,凭什么找个这样的……囧,其实我当时很想插一句说,如果那个护士漂亮的话还是可以考虑的……可惜以我妈那种强悍的叙述方式我是连插话的机会都不会有的……

可是,按照现在姑娘的们观点,其实我连及格都算不上,我一没车,二没房,更可气的是压根就没有拥有这两种东西的欲望,更确切地说是深恶痛绝。因为我一直认为大多数人是愚蠢的,而他们追求的东西自然也是愚蠢,换句话说,我抵制的不是房子,不是车子,而是傻子。就像当那群傻逼抵制日货的时候我偏偏就去喜欢日货!无奈我认识的姑娘之中能意识到这一点的不屈指也可数。可见,要求一个女人既有胸又有脑是多么困难的一件事儿……

所以我觉得还是别相什么亲,以免浪费彼此的时间,否则见了面你觉得我是傻逼,我觉得你是傻逼,最后都恨不得拿起筷子、刀子、叉子来火拼了,何必自找不快呢?相亲不成还搞得遍体鳞伤……还不如去搞一夜情更安全一些。

更何况,我现在也没时间去谈恋爱啊!我想去骑海南岛,我想去骑台湾岛,我想去骑川藏线,我想去骑车绕大半个中国,路线我都想好了:从北京出发,经过石家庄,太原,经过西安,经过兰州,一直到新疆,到祖国的最西端,然后回青海,进西藏,走川藏线出去,到成都,到重庆,到广西,到广州,然后沿祖国的海岸线一路北上,到祖国的最东端去,到祖国的最北端去,最后回到祖国的首都!到时候我想看看还有哪个抵制日货的傻逼能有资格说比我还爱国!

我妈听着一愣一愣的,多半是因为很多地方她根本不知道。她说这得多长时间啊,我说怎么着也得一年吧!不辞职不行的。她对此表示十分淡定……我为有这么一个妈感到深深的骄傲!

月底下江南

十一没放假,照常上班了,我把假期挪到了月底。准备先回家一趟,然后去江南那边转一下,正好有不少同学和朋友在那里。一路没什么挑战性,算是纯休闲游了。

初步计划:

26号,一早到南京。

27号,绩溪,开始走徽杭古道徒步,晚上或第二天一早到杭州。

28,29号,杭州。

30,31号,宁波。

1号早上回北京上班。

一个人走,计划随时可能会变。我要充分利用一个人的好处。;-)

也有爱情甜如蜜

那谁快要结婚了,就是小红同学。认识这个姑娘好几年了,给我的印象一直都是大大咧咧的,没脾气,而且常以姐姐自居,用我的话说是动不动就“母仪天下”!瞧,这不等结婚生娃之后就可以实现“母仪天下”的夙愿了嘛?

这姑娘大概是从小就特没安全感,所以基本上没怎么出过我们泰安市。家在我们宁阳,然后大学是在泰安读的,毕业后马上就跑回家上班去了,她说宁愿在我们那种小地方待一辈子。

她和男朋友是大学认识的,好了很多年了,终于熬到结婚了,让人煞是羡慕。在这个“婚姻和爱情变得越来越短”的年代,能一直从恋爱走到结婚确实不容易,真心祝福他们!“有情人终成眷属”是多么美好的一件事!

还有那谁,简佳同学,已经远渡非洲织毛衣去了,这不到现在还没回京呢!走之前我就逗她说,你去非洲那种鸟不拉屎的地方干嘛,我们祖国又不是没有赵忠祥老师解说的《动物世界》,非得去那边看现场版的?可她就是铁了心要去看远在他乡的如意郎君,八匹马都拉不住!一个中国白妞儿,不远万里去非洲织毛衣,这是一种什么样的精神?

这个姑娘大我好几岁,按理说已经是传统意义上的“剩女”了。去年刚认识她那会儿应该是刚失恋没多久,要不怎么会闲着蛋疼跑去后海酒吧呢。经历了那么多不靠谱的人,相了那么多次亲,这次可总算是找到了一个到目前为止很靠谱的人了!姑娘,我只想说这是你应得的!

有一次吃饭时我问她,你喜欢一款类型的男人啊,我看看我手头上有没有给你介绍一下。她说喜欢外向的、善于交际的那种。我当时就不同意了,那种男人一般都不靠谱。后来,就是前两天,她从非洲给我发来几张照片,我一看他们俩的那张照片就乐了,一眼就能看出他是很老实内向的那种挨踢男!看,到最后你还是找了一个老实的吧!我语重心长地对她说:人靠谱而且真心对你好,那比什么都重要!衷心希望这一对也能一起走到最后。那谁,我还打算去吃你们的喜糖呢!

还有我们老大,就是Amankwah同学。当年稀里糊涂地去了广州那啥公司,可没过了多久就给我们收获了一个“大嫂”,当时我等就震惊了!真是迅雷不及掩耳盗铃之势!这家伙现在哪都不想去了,就一心一意待在广州陪大嫂了。

我们几个每次谈起老大都感叹良多,除了重色轻友就是……瞧这嫩草啃的……看来还是老男人吃香啊!记得我去广州的时候他们刚认识没多久,这不到现在已经两年了都。每次有哥们去看他们总是带回来大嫂如何贤惠以及老大如何幸福的消息,用我的话说大嫂可真是“持家有道,教子有方”啊!我看他们也快结婚了,我已经做了好去广州参加他们婚礼的心理准备了。老大,我看好你们哦!

瞧这一对又一对的……在这喧闹的人世间,物欲横流的社会,每次看到这让人羡慕的爱情,都感觉到一种窝心地甜美!莫不静好!

gcc 太聪明了!

gcc 越来越聪明了,有时候为了故意不让它优化某一部分代码(但同时还要开启-O!)我真可是费尽了心思。

举两个简单的例子来说明一下。一个是exp()的问题,不带-lm编译下面这段代码:

[c]

include

include

int main(void)
{
printf(“%lf”, exp(4.0));
return 0;
}
[/c]

你会发现可以得出正确的结果,没任何链接错误。它被预处理掉了吗?gcc -E告诉我们没有。那到底怎么回事呢?看一下生成的汇编,你会发现里面根本就没有call exp这样的指令!也就是说它被gcc在编译的时候处理了!这是因为像exp(4.0)这样的常量表达式是可以在编译的时候优化的,它的结果是个常量,所以gcc编译的时候就已经把这个值计算出来了,并把计算结果作为一个常量放到那个位置去了!为我们省去了一个函数调用!:-) 所以,如果你把上面的4.0换成一个double变量传递给exp(),你就会得到链接错误了。

另外一个例子是一个非常真实的例子。我们知道内核中有个著名的结构体叫struct skbuff,而我们公司内部的一个补丁中在某个函数中错误地把skbuff拼写成了skbuf!但编译和运行没任何问题!这个问题是后来别人在code review的时候才发现的!为什么呢?这明明应该通不过编译啊!我花费了不少时间去追踪这个问题,最后发现了问题的根源。为了方便叙述,我把问题的关键部分抽象成了下面的代码:

[c]
int foo(struct non_exist *n)
{
if (n)
return 0;
else
return 1;
}
[/c]

我们这么编译:gcc -c foo.c,你会发现我们只有警告,没有错误!警告我们可以忽略,因为我们只关心为什么不会有错误,换句话说,为什么gcc依旧可以成功地编译出代码来?仔细想一下你会明白,其实在foo()里面,我们根本就不用关心n到底是一个什么样的指针,只要知道它是一个指针就可以了!因为我们一没有对它进行dereference操作,二没有进行++或者—运算!而所有指针在特定的机器上长度是一定的。这正是为什么它可以通得过编译,但警告是肯定不会少的。;-)

如果你读过-O(或以上)生成的汇编的话,你还会发现一大坨gcc优化的例子,这可苦了我这种读汇编的人了,每次都得去猜gcc到底做了那些优化,不过这也相当有乐趣!

关于内存泄漏

不少编写用户空间程序的人都关心内存泄漏到底会造成多少影响。这里简单澄清一下。

无论用户空间是通过malloc()也好,mmap()也好,最终都是通过Linux内核管理的。只要内核没有bug,这些和这个进程相关的页面都是会被记录的,而且会在进程exit()的时候由Linux内核全部释放掉。所以对于运行时间不长的应用程序,有一些内存泄漏一般是没多大问题的。作为用户程序的编写者,如果释放内存真的很麻烦,或者说会让你的某一块代码变得很难读,你完全可以直接exit()。虽然很多时候我并不建议你这么做,道理很简单,因为你申请了资源就应该自己去释放,这不光是资源浪费的问题,而且是你代码逻辑和你作为开发者职责的问题。

实际上,Linux内核根本就不会注意到用户空间的泄漏不泄漏,它只关心你申请的这个页面有没有被它记录,所以进程退出时所有和此相关的内存页面都会被内核释放掉,管你是因为泄漏留下的还是用作其它用途的。

但是,你也知道,有些进程是不会主动退出的,那就是后台进程。这样的程序要是存在内存泄漏的话,还是可能会很浪费系统的内存资源的,因为内核没机会去释放这些页面,而且对用户空间的泄漏情况完全不知,它只会不停地给用户空间分配内存,直到用户空间地址耗尽或者物理内存趋近用完。

CVE-2009-0029 和 CVE-2010-3301

从我出去旅行到现在这段时间内,Linux内核似乎是漏洞频频啊,光我看到的安全漏洞就已经若干个了,有机会真想八一八这些安全漏洞。

CVE-2010-3301是其中一个。这个漏洞的成因是,在64位的内核上执行32位的系统调用时,作为传递系统调用号的%rax高32位未被清零处理,而且在进行比较的时候直接使用的%eax,导致高32位被忽略:

        cmpl $(IA32_NR_syscalls-1),%eax
        ja ia32_badsys
ia32_do_call:
        IA32_ARG_FIXUP
        call *ia32_sys_call_table(,%rax,8)

这样以来,通过静心构造的%rax就可以跳转到它想要的位置去!在这个exploit中,它就利用ptrace()来跟踪系统调用,并把计算好的想要跳转地址的偏移传递到%rax中,然后执行事先放置好的代码来提升权限!

修复方法很简单,要么把%rax的高位清零,要么比较的时候使用%rax。修复这个问题的commit是:

http://git.kernel.org/linus/36d001c70d8a0144ac1d038f6876c484849a74de
http://git.kernel.org/linus/eefdca043e8391dcd719711716492063030b55ac

和这个问题类似的问题之前也曾出现过,CVE-2009-0029,问题更严重,涉及很多的系统调用。不同的是,这个涉及64位的内核和64位的用户空间,来自用户空间的传递系统调用参数的寄存器的高32位同样没被清零,而带32位参数(比如int)的系统调用就会有问题,内核代码只会检查对它有意义的低32位,高32位就被忽略而直接传递到后面去了,这就会带来问题了。

问题的解决方法也很简单,就是要把这些寄存器高位清零。说起来简单,做起来难。要是和上面一样直接用汇编处理的话,参数的类型的信息就丢失了,因为你汇编里分不清它到底是32位还是64位;而如果用C处理的话,有那么多系统调用,一个一个处理?那不符合Linus的作风!他是怎么做的呢?用宏!而且用强制转化,把所有的32位参数声明为long,然后再强制转化成实际的类型,比如int。去看看SC_CASTx()和SC_LONGx()的定义就知道了:

[c]

define __SC_CAST1(t1, a1) (t1) a1

define __SC_LONG1(t1, a1) long a1

define __SYSCALL_DEFINEx(x, name, …)

    asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__));           
    static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__));       
    asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__))            
    {                                                               
            __SC_TEST##x(__VA_ARGS__);                              
            return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__));    
    }                                                               
    SYSCALL_ALIAS(sys##name, SyS##name);                            
    static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))

[/c]

可见Linus大神把宏用到了何等出神入化的地步。:-) 这也是为什么你在内核中看到系统调用都是用SYSCALL_DEFINEx()来定义了。

何喜之有?

今天是贵国的生日,帝都上下一片喜洋洋的景象。不过今年贵国没有像去年那样施展世界领先的天气控制技术把天上的乌云给赶走。

我就纳闷了,贵国都建国六十一年了,连人民的住所都保护不了,和本国居民之间的土地纠纷比和领国之间的土地纠纷都多,人民群众摆个地摊都得和一种叫做城管的东西发生纠纷,有什么值得庆贺的?

我就奇怪了,贵国都建国六十一年了,普通人民不吃不喝一辈子连一间很普通很普通的房子都买不起,老老实实上班的不如炒房的,踏踏实实做研究的不如炒股的,勤勤恳恳干活的不如投机倒把的,有什么值得鼓舞的?

我就郁闷了,贵国都建国六十一年了,我都活了二十四年了,每个月税不少缴可我连选票长什么样子都没见过,还动不动就被代表,连上网写一篇老爷们不喜欢的文章都得担心会不会被删除,有什么值得骄傲的?

贵国全称中华人民共和国,你怎么好意思叫得出口呢?一,贵国眼中只有人民币,没有人民;二,共和的理念是自由、平等、博爱,这三条贵国实现哪条了?我觉得贵国不如改叫“中华官国”好了。

六十一年了,贵国连自己要建设一个什么样的国家都没搞明白,连我们为什么要在一起形成一个统一的国家都没搞清楚,一个自称强大的国家却时常因为某一个手无寸铁的人的言论就可能被颠覆一下,何喜之有?

就像那首歌里唱的那样,“伟大的祖国它超有钱呐,四万个亿跟我有蛋关系呀?骄傲的GDP它噌噌地涨啊,能给我换来几包尿不湿吗?”