Archives

ELF Extended Numbering

ELF格式天生就有个不小的缺陷—— segment 个数最多 65535 个,这是由e_phnum来决定的,其类型是16位的无符号整数。对于一些程序来说,65535是不够的,如果它使用了很多mmap(2)的话。

要解决这个问题并不容易,e_phnum是用了多年早已定型了的东西,不能随意修改,只能在别的地方想办法去补救,于是下面这个方案就出来乐。这个方案在Solaris上已经使用了长时间了,但 Linux 上一直还没有。其原理是:e_phnum保持不动, 如果 segment 的个数大于等于0xffff时,e_phnum设为0xffff ,同时下标为0的section header中的sh_info被设为真实的 segment 数。而 sh_info 是32位无符号类型,所以它最多能支持4294967295个。使用这个 sh_info 是合理的,因为下标为0的section header平时是没用的,其类型是 SHT_NULL。随之相应改变的还有 sh_size 和 sh_link,它们分别被设为 e_shnum和 e_shstrndx(见该文档P215)。

Daisuke HATAYAMA 提交了Linux上的补丁,主要分为三部分:内核,gdb,和binutils。内核部分补丁不少,但真正起作用的补丁只有一个,其它的都是refactor,见下:

8d9032bbe4671dc481261ccd4e161cd96e54b118 elf coredump: add extended numbering support
93eb211e6c9ff6054fcf9c5b9e344d8d9ad29175 elf coredump: make offset calculation process and writing process explicit
1fcccbac89f5bbc5e41aa72086960059fce372da elf coredump: replace ELF_CORE_EXTRA_* macros by functions
088e7af73a962fcc8883b7a6392544d8342553d6 coredump: move dump_write() and dump_seek() into a header file
05f47fda9fc5b17bfab189e9d54228025befc996 coredump: unify dump_seek()

gdb 的补丁如下:
78999a9bcf9d87f72cd67a782e1e859a6a09d9de  * common.h (PN_XNUM): Define.
cce546478afe296ebbb69f208b708a8b3fe5f7e5 * elfcode.h (elf_swap_ehdr_out): Handle e_phnum > 0xffff.

binutils 的补丁:
[http://sourceware.org/ml/binutils/2010-01/msg00393.html](http://sourceware.org/ml/binutils/2010-01/msg00393.html)

man-page 补丁:
[http://permalink.gmane.org/gmane.linux.man/1302](http://permalink.gmane.org/gmane.linux.man/1302)

自动生成内核config

配置内核的人都清楚要选择内核的配置项是一件比较麻烦的事:要是多选了吧,内核体积可能变大,编译时间会变长;要是选少了吧,恐怕系统连启动都启动不了。所以一般我们的做法是拿过系统提供的 config 来直接make oldconfig。

但这么做并不是很好,因为发行版通常为了照顾不同配置的机器而选中了很多的模块,这样一来对本机器没有用的东西也会被编译进来,从而导致编译时间变长,这还是次要,关键是模块数量会增多,内核体积也有可能变大。

理想的情况是我们根据本系统运行时加载的模块来决定到底选中哪些模块。问题就来了,我们怎么才能知道自己的系统需要哪些模块不需要哪些模块呢?

为了解决这个问题,Steven Rostedt写了一个脚本,叫作streamline_config.pl,来解决这个问题。而且他已经把此脚本提交到内核,见scripts/kconfig/streamline_config.pl。这样一来,我们就可以通过 make localmodconfig 或 make localyesconfig 来生成我们真正需要的最小的config了。不同的是,后者会把系统正在使用模块编译进内核,而前者不会,它只会保留系统使用的模块而且继续以模块的形式存在。

这个脚本不复杂,原理也很简单,通过 lsmod 找出正在使用的驱动, 然后通过解析所有的Makefile中的obj-$(CONFIGXXX) += xxx.o模式来找到驱动对应的CONFIG*,不过还要解决依赖性的问题。

2010上半年旅行计划

前一段时间天气比较冷,懒得出去。最近比较宅,不想出门。可是好久不出门旅行浑身难受,每个月总有那么几天……再这么宅下去不行,得出去活动活动了!

于是乎我制定了下面的近期旅行计划,初步计划,具体时间待定。

4月17号——19号,内蒙古,库布其沙漠穿越。已定。

4月底或5月初,苏州,南京,乌镇。本打算去山西平遥,但一想山西那么近,什么时候去都成,没必要在这么好的季节去,还不如趁着春天下江南,更主要的是看看传说中的江南美女!

5月底或6月份,青海,西藏。待详细计划。

6月底,大连。

一直以来都是一个人出门旅行,提前征征旅伴,最起码拍照方便一些。不靠谱人士免谈,极品人士请绕行。

改去西藏了

鉴于地球日益危机,外星人犯我之心不死,不明飞行物频繁光临地球和太阳系,我深刻感觉到2012真的快要来了!同志们,你们的船票买好了吗?我不管了,我的船票已经通过黄牛买到,所以我得赶紧去西藏看看诺亚方舟建得如何了!葡萄牙等到2012过去后我坐诺亚方舟过去!

以上纯属虚构。真实原因如下。

感谢国家,贵国的护照除了去一些我都没听说过的国家不需要签证,去哪都需要!所以说就算你只是为了换个好用的护照你也得移民啊!我发现申请去葡萄牙的旅游签证比我想象中的还麻烦,还要搞什么财产证明之类的,就我这点儿财产还不够证明的呢。钱咋就花得这么快捏?反正葡萄牙今年7月份是去不成了,等我什么时候攒够钱了再去吧。决定改去西藏了,一直想去但没机会去的地方。花钱不多,省下的钱还可以买个单反。而且,我现在积攒了大约10天的假期,加上3个周末一共16天,估计去西藏应该差不多了。

于是从现在开始征旅伴,同去西藏的,估计可能会5月底或者6月去,坐火车。可以见我发起的豆瓣活动

痛定思痛,我深刻反思了一下上面的问题:我的钱到底都花到哪里去了呢?我发现,相当一部分钱交给了国家,交税不说了,还交了根本就没有用的住房公积金(我交一辈子也买不起首都的一个厕所啊!)和基本上是在忽悠人的养老保险金等。剩下拿到手的钱一部分贡献给了贵国的房地产,贵国的水泥盒子租也不便宜啊!其余的钱中,相当一部分花到了旅游、户外以及户外装备上,虽然我在旅途上已经算是很节省的了;一部分钱给了爸妈,这没的说,我又不是富二代,穷二代还倒是差不多;一部分外债,是借给别人的;一部分花在了吃上,穿很少花钱,差不多半年才买一次衣服,而且买的比去动物园买贵不了多少。这么一算心里踏实了,钱虽然花得快但没浪费,也算是持家有道吧。

下一步就是要买个单反,去西藏之前。有人给我推荐佳能550D,不知道到底怎样。哎,玩单反比玩户外烧钱还厉害,入行有风险,出手须谨慎啊!

傻逼们的原理

傻逼们运行的基本原理是:

你永远不能战胜一个纯傻逼,因为他会把你的智商拉到跟他一个水平,然后用丰富的经验打败你!
Do not argue with an idiot. He will drag you down to his level and beat you with experience.

所以,没有足够的时间不要跟傻逼们斗。别把他们当正常人看就是了!

某些人就别对号入座了!

bonding和bridge对netpoll的支持

最近我在做 netpoll 的东东,具体说是让 bridge 和 bonding 支持 netpoll,这样我们就可以通过 bridge 和 bonding 设备来使用 netconsole 和 netdump 了(注:netdump 已经被遗弃)。三个补丁见这里:

http://lkml.org/lkml/2010/4/5/13

http://lkml.org/lkml/2010/4/5/14

http://lkml.org/lkml/2010/4/5/15

其实很简单,无非就是实现几个回调函数,传递几个关键的指针。最纠结的地方是 netpoll 的那几个成员变量,一步错了导致后面全错,不过说到底,还是对 net 部分的代码不熟悉。

最气人的是,不少时候明明是一个成员忘了赋值,结果导致 lockdep 警告,有时甚至连警告都没有直接死掉,非常莫名其妙!所以我就说啊,你遇到 oops,soft lockup 不要紧张,你最起码是已经得到很多错误信息了,真要是一条错误信息都没有,那才紧张呢!你问我这时候怎么办?没什么好办法,只能尝试缩小可疑代码的范围,然后凭直觉去猜问题应该在哪里!比如我这个,我可以通过使用或不使用 netconsole 来判断问题是出在我的补丁上还是原有代码中(不要太迷信原有代码,它们也会有 bug 的),如果是出在我的补丁中,那到底是哪一块,哪个函数。如果没任何信息,系统死掉很可能是因为什么?当然是加锁了!重新检查锁到底有没有用对。如果还不行就老老实实地加 printk 吧!

还有就是,不要迷恋现象,现象并不一定能正确表明问题所在,它只是问题带来的症状,仅此而已!换句话说,可能是前面的一个小问题引发了后面大的症状,这并不意味着问题就是后面的一个大问题,也不意味着问题就真如症状直接表明的那样。静下心来仔细分析症状的每一个细节,不要轻易下结论说问题应该在哪里。

赤果果的教训啊!

党妈的关怀

先上CCAV的新闻

山西王家岭矿难救援现场,伴随着营养液传送到井下的,有塞在空矿泉水瓶子里的两封信。

一封信写道:

亲爱的工友们:党中央、国务院和全国人民时刻都在关注你们的安危;省委、省政府领导正在现场指挥抢险工作。同志们都为你们传递的生命的信息万分高兴,都在争分夺秒、全力以赴救援。你们一定要坚定信心,坚持到底!坚持就是胜利!

另一封信写道:

弟兄们你们好:请耐心等待,地面上国家领导、省领导带领队伍在全力以赴,加管、加泵排水。很快就会排下去的,一定要坚持、坚持、再坚持!!!下面气体、风量情况如何?需要我们做些什么?请回信。山西焦煤汾西救护大队。

==================关怀的分割线==================

看完之后我灰常鸡动!我们知道,贵党早在抗战时期就靠书信和地下工作者连络,而如今建国60多年了依然笔耕不辍!对于地下工作者们来说,党妈的关怀比空气,比水,比食物更重要!真是“纵做鬼,也幸福”!

我只有一个疑问:地下工作者们在下面怎么回信呢?

愚人节的两个玩笑

1. 那天 kernel.org 翻了,有图有真相(截图来自linuxtoy):

看到之后首先就是看其html源代码,你会发现,其实里面的字母也是翻的。怎么说呢?就比如说字母q,翻过来就是b,这个是最简单的,其它的字母就没这么容易了,所以他们就找其它语言里的字母。我估计很可能有俄文,俄文里好多字母感觉就是英文字母翻转的……总之,字母都是这样翻转的。作成一个表格,然后用程序什么的就可以完成了。

2. LKML 上果然有人故意搞笑。原帖在这里,大体是说,我有两台机器,第一个是赛扬,第二个是四核,这是主要区别,/proc/cpuinfo是只读的,可我想让第一台机器的性能赶上第二个,我能不能在第一台机器上运行:

echo -n “model name      : Intel(R) Core(TM)2 Quad CPU    Q6600  @
2.40GHz” > /proc/cpuinfo

捏?回复说,chmod +w /proc/cpuinfo就可以啦!

啧啧,这两个人真有默契。

你们知道的太多了

不知道怎么回事,除了我那几个朋友之外,在我这里留言的人几乎每次都在变,每次评论都有不少需要审核的,给我的错觉是怎么这人换了一茬接一茬?你说是不是某些人闲着蛋疼老是换ID捏?

反正,总体上给我的感觉是这里来的人太多了。

我有的同事也知道我的博客。我就纳闷了,我又没告诉他们,他们怎么就知道捏?如果万一哪一天我那美国的上司也知道我的博客,然后借助 google translate 来看,那我写着写着估计连奖金都没了!这让我写博客很尴尬——公司的不少事不能写;家里的事想写没啥可写;技术的东西吧,不能老写;写贵国时政的东西吧,这种事又不能写太细!

写博客这种东西,就像是吸毒,明知道有害你还偏偏上瘾!有百害而无一益!写技术吧,费力又不讨好,写的不好了遭骂遭鄙视,写得好了被转载了半天连出处和作者都找不到的。这还不如稍加润色润色,整理整理,然后投给杂志社什么的,这样还能赚点儿零花。写生活吧,唉,本来就那么点儿糗事这么一说谁都知道了,连从未谋面的人都知道,搞得跟路人皆知似得,很尴尬。爷们儿还好些,关键是姑娘!你说要是哪一天我约一个姑娘出来,人家姑娘第一句话就是:我看你的博客了,我觉得你是一个^%^&#的人……刚见面就被剥了两层皮!情何以堪?而且你说写这玩意儿有啥用!能当饭吃嘛?不能。能当姑娘看嘛?也不能。而且也没见有哪个姑娘说我看了你的博客想认识一下你啊!

写博客最好的状态是只有你的朋友们知道,写了也是让他们看的,省我电话费。其他人看了就是知道的太多了!

所以本博即日起决定进行分级分类处理,技术的东西放到一个博客上,生活等其它东西放到另一个博客上。正好,最近空间提供者 cocobear 同学在转移空间,我的博客也需要拆迁搬迁。而且鉴于国内大局域网发展的大好形势,也为了不给党国抹黑,本域名 wangcong.org 已经决定移民人quan环境最差的美利坚。所以未来几天内,本网站及其博客将处于被维护的状态,开放时间未定,视美利坚信产部备案手续审核时间以及本博主心情而定。重新开放后本博内容将会因此做出调整。

哦,顺便说一句,我最近心情不好。你懂的。

工作和生活

有同学说我工作和生活不分,这其实蛮对的。对于一个上班时间打台球,下班回家继续处理邮件的人来说,工作就是生活,生活也是工作!水乳交融。

可是,比起我们西朝鲜的领导来,我真是太惭愧了!看看日记局韩局长,工作时间在家玩手机,下班后仍然坚持在妇女工作前线,夜深了也要加班加点和女同志在床上讨论工作。这样的领导难道不值得我们学习嘛?这样的精神难道不值得我们提倡嘛?国家有这样的好领导让你先感谢国家咋了!你还有什么不满的呢?有什么不满组织给你解决!

恩,这个国家我先感谢了,你随意!