深入理解Linux内核构建系统(一)

Linux内核编译命令

作者:西邮 王聪

{做人要厚道,转载请注明出处!}

make tags
生成tags文件,供浏览代码使用。
make cscope
生成cscope索引文件,也是为了方便浏览源代码。

make oldconfig
在旧的.config基础上生成新的.config,非常有用。
make silentoldconfig
同上,但比较安静。;)
make defconfig
生成包含全部默认选项的.config文件。
make allyesconfig
生成包含全部选项的.config文件。
make allnoconfig
拒绝全部选项。
make randconfig
随机选择一些选项,一般供开发者测试使用。
make {config|xconfig|gconfig|menuconfig}
手工选择选项,只是用户界面不同,比如xconfig和gconfig都是图形界面的。

make
默认编译。
make bzImage
编译生成压缩的内核二进制文件,一般你用到的是这个。
make vmlinux
编译生成纯二进制内核文件。
make modules
编译生成内核模块。
make modules_install
安装生成的内核模块。
make {bzdisk|fdimage|isoimage}
编译生成启动软盘镜像,或光盘镜像。
make install
安装编译生成的内核文件,包括设置你的Lilo或Grub。
make all
等价于vmlinux+modules+bzImage。
make rpm
构建内核rpm包。
make foo/bar/foobar.ko
编译单个内核源文件。
make headers_install
安装内核头文件,默认安装到usr目录。
make M=some/sub/dir
编译一个指定的目录。
make O=/path/to/some/dir
把编译过程中生成的文件都放到指定目录中去。
make C={1|2}
用sparse检查内核代码。
make V={0|1|2}
控制编译过程中输出信息的多少。

make help
列出所有的make目标及其相关描述。
make kernelversion
输出Makefile里读到的内核版本信息。
make kernelrelease
输出内核发行标识。

make {rpm-pkg|deb-pkg|tar-pkg|targz-pkg|tarbz2-pkg}
构建{rpm|deb|tar|tar.gz|tar.bz2}格式的内核包。

make {htmldocs|mandocs|pdfdocs|psdocs|xmldocs}
生成{html|man|pdf|ps|xml}格式的内核文档。

make clean
清理生成文件,但会保留.config和一些模块文件。
make mrproper
清理全部文件,包括.config和一些备份文件。
make distclean
在make mrproper的基础上还清理编辑器可能生成的备份文件,patch的rej文件等。

Linux磁盘使用分析

以前分析都是用df和du,突然间发现了一个巨好用的图形化工具——磁盘使用分析器,英文名叫Baobab。看看下面的截图就知道它有多么友好。

经过仔细分析,发现/tmp目录下的某些cscope文件居然占据了很多空间,马上rm -rf掉。结果根分区的使用率一下从74%下降到60%。妈呀,虚惊一场。

Been there, done that...

在crquan的帮助下,总算找到了自己所有汇入Linus内核树的补丁了。可以在这里看到:

http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git&a=search&h=HEAD&st=author&s=xiyou.wangcong%40gmail.com

数了数,才十一个。印象中应该比这多,貌似被Andrew拒了几个,-mm树里似乎没了。看来还得努力啊,以后尽量不做clean up这种工作了。得做点儿实际的东西了~~

加油~!我们还刚刚开始~!^_^

vimpress的几个不爽之处

自从老大上次推荐vimpress之后,就尝试用vimpress写了几次博客。可是用了之后发现,其实很不爽。原因如下:

1. 仅支持一个博客的撰写。因为我还要编辑xiyoulinux博客,也想用vimpress,无奈vimpress配置里只能记录一个blog的帐号。

2. 不支持草稿。虽说可以用vim保存到本地,但有时也想保存草稿到服务器,可惜vimpress不支持。

3. 编辑功能不完善(?)。好几次用的时候,BlogOpen之后再BlogSend,结果和没编辑一样~!费解中……

我个人心目中理想的功能应该是:

1. BlogList ALIAS

列出ALIAS指代的博客上的文章。ALIAS可以在配置文件中指定,对应帐号也应该在里面。

2. BlogEdit abc@ALIAS

编辑ALIAS博客上的ID为abc的文章。草稿或许应该有另外的表示方式。

3. BlogSave

把当前正在编辑的保存为草稿,如果是新建文章的话。否则就应该直接保存到原文。

4. BlogNew ALIAS

在ALIAS博客上撰写一篇新文章。

5. BlogPublish ALIAS

把当前的文章发布到ALIAS博客上去。

有兴趣的同学可以根据上面的建议给vimpress打补丁,然后提交给作者。

喝酒

最近真是闲得不行了,居然连着三天晚上都喝酒了。。。

前天,和新浪的唐僧舍得一起吃饭,陪大家一起喝。

昨天,和高中一个铁哥们出去玩,回来兴致不错,又喝了瓶酒。

今天,眼看就要是金经理的小金一下子跌了下来,又陪他喝了瓶闷酒。

不行,这样下去不行~!我要好好学习,天天向上~!

好,从明天起,积极参加各种招聘会,专挑考C语言的笔试面试去,考上给西邮的同学占个位,排挤一下交大的,打击一下面试官。至于名字嘛,要是有xxx市N日游就填自己的,否则就在手机上随机一个美女的名字填上好了。恩,我看行~!

一段精彩的汇编代码!

无意间在Linux内核中发现这么一段汇编代码,更准确地说应该是gcc内联汇编,写得很精彩,拿出来和大家分享一下。

代码是在include/asm-i386/string.h中,是针对i386对memcpy做进一步优化。我们知道,一个简单的memcpy其实和strcpy差不多,区别只是前者检查的是复制的个数,而后者检查的是当前字符是否是’’。

而这显然还有很大的优化余地,首先像这种非常常用的库函数是可以用汇编重写来提高速度的。当然了,可移植性是降低了,但我们可以针对每个平台写一套汇编。这样速度上的提升还是蛮乐观的。其次,memcpy显然没必要一个一个字节地复制,其实我们最多每次也就复制4个字节(当然是在i386上),但如果复制数量大的话,这种提升还是很明显的。于是下面的汇编就出来乐~!

 

评论如下:

34~36

rep=>重复

movsl=>以long为单位拷贝,从from(%esi)到to(%edi),复制n/4次。别担心,这里是i386。

37~38

恩,用n/4去和n相与。

39

若n/4个4就是全部则完成,跳转到后面的标号,结束。

40

还有剩下的,好,把n%4剩下的一个一个字节地复制。

41~44

这里看不懂的就去学gcc的嵌入汇编语法吧!

该去哪??

昨天去听了Google宣讲会,还顺便投了简历。今天就等面试的通知了,可到现在还没等着。。。估计石沉大海了。

今天早上突然接到了徐继哲的电话,让我考虑一下去新浪工作。他说我要想过去的话,直接找他就可以了,连面试都不用,而且他还会给我安排最适合我的职位。这真是很大的诱惑啊。Google啊,Intel啊,虽然都比新浪要好,可要经过层层面试,那进不进得去就难说了。虽然对自己的实力有信心,但这里面也不全靠实力,还有很多其它因素,一想起来就打退堂鼓了。

摆在面前有两条路:一条是去新浪,跟着徐继哲工作,而且可靠性100%,职位还会很适合我。其实仔细想想这也挺不错,按理说我也应该知足了。另一条是去找比新浪更好的,不过进不进得去就得看我的实力+运气了。抑或是我该趁年轻赌一把?

征求了N个人的意见,大约50%的人认为我应该再考虑考虑,看一下有没有更好的机会,没有的话就去新浪。可是这也拖不了太久啊!剩下的就都认为我应该直接去新浪,那里不错,也省得在费心找其它工作,而且以后有的是去更大的公司的机会。没有一个人认为我应该直接走第二条路的。

我到底怎么办呢?是冒一下险去找更好的公司?还是知足地稳稳当当地去新浪?

Reverse Mapping in Linux kernel

从vm_area找到其映射的struct page那叫mapping,反过来,从一个struct page找到所有映射上来的vm_area就叫reverse mapping。

对于匿名映射,情况是这样的:

而对于非匿名映射,应该这样:

前者的技巧是加了anon_vma链表,而后者是加了一个layer——address_space。瞧~这名字起得多好,如果你第一次见绝对会把你绕晕~!

上面的图片也清楚地向我们展示了这么一个结论:C语言编程其实就是Find a Needle in the Haystack~~!怎样?这次你信了吧~!

腐败了一把

哎,别提了,我们班某群人现在都结成吃饭同盟了,于是每次请客吃饭必是十几人,一人请必须带全部,更不幸的是,我也在其中。吃饭同盟基本是由我们宿舍和书记所在的女生宿舍的人组成,还有一个其它宿舍的,这样每个人的生日,某些人拿奖学金,某些补考通过等等时候就会找尽理由一起吃一顿。还好,我基本上一年就请一次,其余时候就是被请。

昨天,根据我们班长Monitor Tian指示,把同盟里后面四个过生日的人放到昨天一起过了,理由是考研时间紧迫。说实话,其实我们这些不考研的并不同意(那得少吃三顿啊),可是考研的人势力强大,也只好被迫同意这个决议。经商议后,决定这次吃一次狠的,去吃顺风肥牛!去了果然很奢侈,具体不提了,反正俺这辈子基本上没去过那种地方吃过几次饭。关键问题是,吃到最后的时候,赵娜同学吃出一只苍蝇来!!

赵娜不爽了,旁边几个人却乐了,因为那就意味着我们可以让饭店被迫给我们打折了。经过和饭店主管交涉,给我们减了不少钱。那几个乐的人又开始提议了,这钱不能白省啊,咱们得再去哪里玩一次?于是,去钱柜唱KTV的计划就酝酿出来了~汗,而且还是通宵的……不过一听说里面还有免费的自助餐我就乐了,呵呵,因为我还没吃饱。^_^

因为通宵KTV是12:00才开始,所以到十二点之前的这段时间去那里就成了问题。我想到我的电脑还没关,就说我要回去关电脑,否则就被闪了,结果话音未落就被众人集体鄙视。汗,只能跟着这群人逛{东|西|南|北}大街去了。

晃悠了半天果然还是晃到网吧去了,我趁机看了一把《生化危机3》,不错的说,推荐一把(如果你没看过1,2,也推荐一下)。快到12:00时就往回赶,准备通宵KTV。插一句:在钱柜那里等的时候看到好多美女~!

说是去KTV,结果一坐包厢就都开吃了。我发现,那里的一种奶茶特别好喝,结果这个晚上就基本上光喝那了。唱KTV也是我们书记最拉风,上半场基本上就她表演了,其中N多张惠妹的歌。没事,后面我还点了N个刘若英的呢~!轮到我唱时自然是当仁不让了,刘若英的我都唱,唱完了后来还跟着他们唱别的。结果把我们书记唱惊了,一些歌都只有偶自己会唱,比如她们最喜欢的张惠妹的《如果你也听说》。唱到蔡琴的《天涯歌女》时,书记怒了,这种女人唱的赤裸裸的情歌你都可以唱?!一般了,到最后时偶和Monitor一起唱的《有多少爱可以重来》很有感觉地说,高音都顶上去了~欧耶!

早上六点出来,累得不行了,赶快回去睡觉~~

论文终于憋出来了

经过三天的奋战,论文终于于昨天晚上憋完了。。。

这次是提交给aka-kernel大会的论文,pdf格式的全文可以在<—这里—>下载。也顺便作为我们科研训练的作品交给老师了。(注:文章全英文,慎览。)

感觉这次收获最大的不是论文内容本身,那是小菜。而是通过这次写论文重新认识了LaTeX,并熟悉了最基本的LaTeX命令和使用。 别的不说,光看最后生成的pdf,那个帅呆啊,这哪能是Office比得上的?!更何况某公司的Office连pdf都无法生成呢~~~

KDE下的Kile巨好用!语法加亮就不说了,关键是能自动补齐LaTeX命令,还有其它一堆好用的功能,强烈推荐一下! 不过这个中文支持嘛。。。麻烦啊,网上N多说法,皆需要2^N步。。。试了其中一个,未果。看来只能求助于安装TeXLive了。抽空装一下再说吧。等中文支持搭建好之后,俺那书也准备全部迁移至LaTeX。

Goodbye, cruel office!