wpe7.jpg (11495 bytes)

我的征尘是星辰大海。。。

The dirt and dust from my pilgrimage forms oceans of stars...

-------当记忆的篇章变得零碎,当追忆的图片变得模糊,我们只能求助于数字存储的永恒的回忆

作者:黄教授

二〇一三


一月六日 当前压倒一切的目标只有一个就是h264

中日是否会开战?现在主导权在共产党一边,因为他们菜系望通过战争来转移国内矛盾,巩固政权。但是他们敢不敢打取决于他们对于战争风险的评估和国内矛盾激化 的现状,打赢了也许能够多维持五年,但是打输了可能直接导致矛盾爆发。同期英国和阿根廷对于福克斯群岛的争议又隔空喊话,当初大英帝国靠武力征服了阿根廷 对于福克斯群岛主权的争议,太阳报对于阿根廷总统的旧话重提是:你去问一问福克斯群岛的当地居民要不要回归阿根廷。假如钓鱼岛上也有土著居民,你去问一问 他们是否愿意归属中共的统治?我在十几年前对于台湾要求独立的想法及其难以理解甚至愤怒,经过了十几年的变迁,我现在非常的理解而且支持,中国的问题就在 于大一统的中央集权过于强大阻挡了各地方的自治与民主,这个是现代社会发展的直接障碍,废除中央集权用邦联制是唯一的可行的出路,为了达到这个途径中共必 须在下一次大规模冲突中
战败,导致国内矛盾激化然后瓦解共产党的独裁集权,这个重担只有日美同盟可以担当。
在我看来中国的问题很简单,归纳起来就是对于共产党的六个字:交权,交钱,缴枪。所谓的政治体制改革无非就是这六个字,我看是一点都做不到,因为改革就是 自杀。不改革迟早要死,改革是加速死亡,所以,胡锦涛告诫习近平两条路都不要走,维持现状,能拖几天是几天,全党上下人人都知道这一点,所以,能捞多少就 捞多少,晚了就没了。

一月十日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

世界上最难的事情很多时候却好似再容易不过,比如决策无论是多么的难最后也不过是一个是否,白痴也能做,具体如何只有事后才能决定。世界上最容易的事情却往 往并非那么简单,比如很多人认为提出问题比解决问题容易的多,可是恰恰是很多问题人们无法提出,因为有时候提问题和回答问题的难度是两个完全不同的复杂 度,就好像np-complete遇到的一些问题的验证算法也许很简单但是解决的算法无比的复杂,而大多数我们常人所熟知的算法却往往相反,或者是验证的 算法和解决的算法并无二至,这就是事物的特性。以上言论遵循毛泽东式的百无一用的哲学思想,纯属浪费时间的东西。
K要去amazon也许让我有些羡慕,可是西雅图就算我能去我也不想去,除了<icarly>之类的女同其他对我并无多少吸引力。不过他对于 诺基亚的lumia的执着让人感到好笑,他的论点是windows phone可以整合多种设备,这一点我赞成,但是是否只有wp才能做到呢?当然不是,我的smartTV搜索youtube是一个很费力的事情,因为遥控 器输入字幕不论软件多么强也很麻烦,youtube可以让你用手机/电脑来绑定你的电视,在手机/电脑上搜索然后在电视上播放,这个完全不需要众多设备来 源于一个厂商也达到了同样的效果,因为程序都是基于互联网的,完全不需要在乎硬件的。这就是为什么windows phone失败的根本
原因,人们不需要把电脑搬移到手机使用windows,因为人们使用的是服务不是软件,微软由于自身的原因就算明白这个道理也不可能改变,这一点如同洗礼 新政一样,连戊戌变法的百日维新都不及,因为务虚所以无需毋需无序。

一月十一日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

以 前面试的时候老是被问到stl里面的算法,我基本上只是熟悉container,而algorithm里面大部分都很陌生,很多看上去简单的算法我却不一 定写的出来,现在就补课吧,单单一个rotate就让我花了不少时间才看明白,不需要额外buffer的算法当然是不简单了。而且stl好像也有很多种的 实现,stl的网站 的代码很简单而且只是针对无buffer的实现,可是我在电脑里看到的是hp/sgi的标准似乎有很多的优化?
对于这个我还真的所知甚少。

一月十二日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

我 模糊记得曾经的一个面试我的家伙喜欢讨论stl里的算法,我没有看过所以很多都答不上来,现在看stl-algorithms的确是很有增益,比如这个 inplace-merge就不简单,有很多种情况,比较难的是不用buffer,我看了好一会儿才明白这个做法是很像quicksort一样的递归分 解,就是找出类似qsort的pivot然后rotate把两段的低-低与高-高合在一起继续分别作Inplace-merge,这个算法还是挺好的。
那么有buffer的情况就很简单吗?不尽然,因为分好几种情况,可能buffer分配的没有那么大,两段的长度加起来太长,buffer分配的只有其中 一个的长度,这里面又有学问,第一段长度够buffer,从前面merge,和后一段有buffer反过来merge,中间merge过程中随时检查是否 一边耗尽要及时的变merge为copy,当然这个是原本的merge就有的,不属于Inplace-merge。总之,一个小小的函数就有这么多的机 关,看stl的代码是很有好处的。学习使人进步,学习使人自信。
不惑之年才能开始欣赏音乐剧之类的阳春白雪,姑且这么说吧,其实是有些高抬了,但是虽然比不上歌剧也绝不是大众传媒追捧的对象。《les miserables》是让人泪流满面的感人,主题曲震撼人的灵魂深处开启了“悲惨世界“的大门,一幕幕地掀开了我童年的记忆,不要误解,我说的是我小时 候看的法国电影版《悲惨世界》,在当年被作为阶级斗争活教材的观摩,让我幼小的心灵烙小了一系列的痕迹,《雾都孤儿》,《卖花姑娘》,《流浪者》等等的讲 述幸福的社会主义中国以外的“悲惨世界“每每都让我感到幸运与幸福,更加坚定的好好学习天天向上。而如今泪流满面的我才真正的感受到所谓的“悲惨世界“就 是生活在谎言
与欺骗中的前半生。红色代表人民的愤怒,黑色代表统治阶级的专治,热血的革命青年在酒精与火药的怂恿下谋划着明天的流血与牺牲,憧憬着为之拯救的劳苦大众 的觉醒,义无反顾的和为自己支付的昂贵的大学学费的贵族家庭的决裂,准备慷慨就义的荷尔蒙激发一见钟情的性欲,第三者的暗恋转变为所爱而得不到的爱情的殉 情,被拯救者原本是旧专制皇权的忠实的维护者,站在道德制高点的卫道士在肉体被拯救的同时灵魂被彻底摧毁导致了极度无助彷徨的自我毁灭,在流血成河的革命 后苟延残喘的资产阶级后代重新开始享受精神物质的天堂,而悲惨世界的结局是因为一个贼被牧师拯救了灵魂之后与上帝签署的契约导致一生一
世的救赎。让 我们再次聆听《悲惨世界》的音符,这是在为了生存出卖发肤牙齿之后只能再出卖最后的肉体的母亲在嫖客在她身上发泄完兽欲后无助的悲吟。所有的演员的表演及其出 色,是真正的艺术电影。

一月十八日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

每 天早晨研读stl的algorithm,以前对于stl仅仅有container的级别的了解,主要都是05年回国曾经在丽江的路上研读过一些侯捷的 stl的书,对于三大块的algorithm/functional所知仅限于皮毛,现在看algorithm的代码算是补课,这个是一个程序员的必修 课,假如有人号称精通算法却没有看过stl的代码那么一定会有大言不惭的感觉的。wiki 上说merge-sort需 要额外的buffer,但是对于inplace-merge来说算法复杂度也是nlogn不需要任何的buffer,(一个肯定是要的,不然rotate 也不行啊)呃,我这才意识到我错了,merge是把已经sort的merge,那么其sort的时间度还没有计算呢,所以,这个inplace -merge的nlogn当然是额外的,难怪我会惊讶,本来就应该是线性的,需要nlogn是因为节省buffer的代价。

一月十九日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

关 于末日世界的言论无处不在,这个仅仅是一个而已,它主要是鼓励人们买黄金,但是话草理不草,美元的统治地位的支撑点一个是美国的强大的经济军事,再一个就 是美国政治经济的稳定,现在美国经济的衰落削弱了第一个支柱和第二个支柱,军事没有强大经济支持也不可长久,现在已经越来越显现出来了,如果美国经济不是 这样的衰弱美国早就把伊朗和北朝鲜灭了,否则每年维持这么庞大的军费又不用岂不是浪费?
再一个美元的投资回报低到为零难道还不能说明美元的不能持久?也许有人说这个正说明了美元的强劲,因为美联储哪怕把十年利率降低到低于通胀依然有大量的美 元购买者,这部说明美元的强劲需求吗?可是,真的如此吗?资本总是追求回报最大化,如果美国现在能够维持仅仅因为资本现在还没有找到更好的避风港,一旦新 的竞争体出现美元的花落速度将会超过任何我们可以想象的速度。人民币真的可能成为美元的替代者吗?世界上没有人相信,连共产党自己也不相信,那么还有候选 人吗?也许资本吸取了教训再也不相信任何政府的空洞许诺,未来的硬通货将是资源作为支撑的体现,这就是大宗商品定价机制,石油天然气黄金白银。
2013中日是否会开战?我深表怀疑,两个政权都陷于政治经济的泥潭希望借助外部压力转移国内矛盾,但是战争并不能解决任何人的问题,反而使得两个脆弱的 经济体陷入更深的泥潭,而且世界霸主美国绝对不允许这个战争危机危及自身。然而两个政权都已然超越了回头的红线,任何退却都意味着难以承受的国内压力。

一月二十日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

奥巴马就职宣誓,我 几乎就把今天的日记定名为奥巴马日了,我对于这个人现在是极端的厌恶,因为他误国误民把美国搞得一塌糊涂,如果有人告诉我说他是塔利班或者前苏联派来美国 卧底的,我也不会十分怀疑。
听到一句评论很有感触:writing is thinking。的确,一个人看到自己写下的文字能够听到自己的心声,能够触摸到自己的灵魂,这就是写作,不论是小说还是法律文件,还是计算机程序还是 情书,这些都是心声的体现,然而很多的文字却不是心声的痕迹,那些是谎言的实体化,那些是谬论的文字化,我们生活在这些文字的海洋里究竟那些是真实的想 法,那些是欺世盗名的浮华?
温故而知新,关于排序算法有多少值得学习的,可能一个人一辈子也学不全排序的算法,有时候我觉得排序就是计算机科学的核心,因为我们之所以能够计算就取决 于排序,不是吗?自然数是一个天然的序列,我们
借用这个天然序列进行各种各样的数序计算和数据查找,没有顺序(order)一切都沦为混沌(chao)这大概也是熵(entropy),今天看到一个inversion的 概念我惊讶的是我居然从来没有听过这个计算机科学和离散数学里的概念,这个似乎可以用来描述我们的序列的混乱程度。bubble sort有一对乌龟和兔子在赛跑,这个是我以前所不知道的,因为大数可以很快地被送到尾巴,可是在尾巴的小数却慢慢第爬向头部,这一点和 selection sort相反,他总是先把小数挑出来先排在头部,所以,面对混沌治理的策略的不同导致了不同的算法,最终的顺序要求的不仅是小数或者大数归位,而是所有都 要各就各位,可是着手之际有人从头开始,有人从尾开始,形成了不同的算法,政治家们大都不是科学家,仅仅是一些社会明星,在取悦于愚夫愚妇之际博取大资本 家的施舍,仿佛那个喂猴子的农夫无非就是早上三个下午四个的朝三暮四式
的拆东墙补西墙,最后美国的坠落似乎是不可避免的了,这么多人搭车拉车的就那么几个能行吗?
整个世界在慢慢地走向混沌,这个是热力学描述的世界末日,同时也是人类的终极必然。

一月二十一日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

看 电影《lincoln》,你可以更加深刻的理解美国社会的现在和过去,美国的政治和经济,美国的人民和政府。毋庸置疑这部电影是一部非常棒的电影,同样地 和《les miserables》一样不适合中国观众,首先是大段的对白我都听不懂,好几个笑话只听明白了那个林肯讲的华盛顿肖像挂在英国厕所的。只要你稍稍关注奥 巴马就明白林肯在他心目中的地位,他有多么渴望自己的名字能和林肯一样名垂青史,同样地,看了电影你才知道真实的林肯是多么的不择手段要通过废除黑奴的法 案,不惜使用无所不用其极的卑鄙手段,通过贿赂民主党议员,通过欺骗封锁消息,甚至不惜以牺牲更多的士兵的生命来延迟南北战争的结束来通过这部法案,这和 当前奥巴马的做法如出一辙,就是他认为他要做的就不惜以牺牲正义和公正来实施,当然在他心目中的公正和正义有着他自己的定义。同样地,林肯为了他的法案付 出了生命的代价,奥巴马也深知
这一点于是他签署了历史性的新法案要求美国政府出钱保护他终生,算是为了不惜背水一战而作的准备,美国人真的有人恨他入股要取他的生命吗?他对伊斯兰恐怖 分子那么友善,显然恐怖分子不会想要他的命,那么谁那么恨他呢?

一月二十三日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

应该说我的思路没有 错只是运气不好碰到了一个重载很多种型式的string::append才导致编译错误,google很强大,找到了我想要解决的问题的答案,只能说明我 的想法是千千万万人的共同的想法
stackoverflow可能是最好的技术论坛,技术帖的水平普遍高很多。我的关键是mem_fun到底要采用那个append,模板通常在能够找到明 显的函数类型就不需要模板参数,只有在有含糊的时候才需要你的指示:
cout <<"append a string is="<< bind1st(mem_fun<string&, string, const char*>(&string::append), &combined)("append a string") << endl;
这样子的一行代码折腾了我很久很久,就因为选择了append这个成员函数导致mem_fun老是抱怨从而让我以为这个做法思路有问题。

一月二十四日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

vector<MyClass> my(10);这里的MyClass在vector里有10个对象实例是不错,但是他的constructor被调用了10次吗?换句话说是否等同于 MyClass array[10];
vector<MyClass> my(array, array+sizeof(array)/sizeof(MyClass));两者是不同的,因为后者MyClass是实实在在创建了10个实例,前者仅 仅是分配了10个内存空间。大体相当于malloc,也就是说没有调用constructor,因为c++里的所谓new是malloc+ constructor的结合。
这里的例子是把实例的指针作为成员函数的functor的实例参数,但是问题是返回的值是string不是string*所以,我只好transform 到一个vector<string>里去:
vector<string*> words(10);
vector<string> names(10);
string* mynew(string* unused) return new string; //awkard way...
transform(words.begin(), words.end(), words.begin(), ptr_fun(mynew));
transform(words.begin(), words.end(), names.begin(), bind2nd(mem_fun<string&, string, const char*>(&string::append), "append a string"));

二月二日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

去kelly 公园散步,顺便去历史博物馆散心,在葡萄牙展馆被热情的老人接待讲解葡萄牙社区的历史,他们是从大西洋的azores群岛来的,当时美国的捕鲸船从波士顿 出发基本很少载人和补给以便多捕鱼,然后到了azores群岛补充淡水食物,顺便也补充了当地的年轻人当水手,等到满载回到波士顿这些葡萄牙年轻人就留了 下来申请美国公民,随后把他们的家人亲戚都接过来,这就是葡萄牙族裔最早的由来,那时候适逢加州淘金热,很多人就来到圣何塞淘金,后来又转回老本行当了农 场主,至今这里的奶酪产业还是葡萄牙裔后代所垄断的。老人带着我参观讲解,有趣的是azores群岛在二战的时候成为英国和德国的共同的补给基地,因为二 战其间葡萄牙是中立国,德国的潜水艇在这里补充给养的时候用他们的军装和当地人交易,我看到那些衬衣裤子袜子质地非常的好,二战的德国潜艇待遇的确非常的 好,否则德国人不会那么热心打仗。
同样的日本人在二战的侵略中也是获得了巨大的经济效益的,这都是对当时的人民有好处的,所以发动战争也是受到了本国人民支持的,只有愚民政策的共产党才会 欺骗人民说发动侵略战争的国家的人民反对战争。
这实在是好笑,只有中国的愚民才会这样相信。
<wargame>无论如何都是一部经典的电影,尤其是前半部分非常的真实,在八十年代的美国真像是梦幻的国度,到处欣欣向荣,国家充满了希 望,科技日新月异,那时的硅谷真像是黄金遍地的沃土。今天,奥巴马搞得民不聊生,而他自己整天以所谓的林肯和马丁路的金自居期望把自己永载史册,真希望他 的下场和他的这两个偶像一样不得善终。我希望他是第一也是最后一个非洲裔美国总统。

二月三日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

花了十块钱看了两部 电影:《逃出德黑兰》(Argo)和《猎杀本拉登》(zero dark thirty)。都是非常棒的电影,都是反映中情局很正面的形象,都是反映伊斯兰邪恶国家的电影,一个是恐怖之国,伊朗。
The state of terror, Iran。一个是罪恶策源地及其首脑巴基斯坦和本拉登,这个是一个美国十年反恐的编年史,基本上把从911以来的所有反恐事件都串了起来,从美国中情局酷 刑逼供开始,各个重大的恐怖自杀行动,以及各个中情局的挫折,以及女主人公坚韧不拔一心一意消灭本拉登的经历,唱出了这个十年的最强音,谈出了时代的主旋 律,迸发出了无限的正能量。
argo是很有趣的电影,反映了美加两国人民的传统友谊,在患难时刻见真情,加拿大驻伊朗大使冒着生命危险救助了六名从美国使馆逃出来的美国外交官,中情 局委派孤胆英雄深入虎穴冒死拯救人质,用一个巧妙设计的计划把受困人员伪装成一部科幻片拍摄人员,在虎视眈眈的伊朗革命卫队的眼皮下乘飞机逃离了险境。影 片再现了那个恐怖国家的恐怖时刻,大街上到处是端着AK47伊朗革命卫队在巡逻,他们掌握着生杀大把美国人质蒙面捆绑用假枪决来恫吓取乐,他们随时随地以 伊斯兰可兰经的名义执行宗教警察的职责,他们同时又是和盖世太保一样的秘密警察,他们相信每一个美国人都是和他们的国家敌人以色列串通起来的间谍,对于美 国人恨之入骨,召集成百上千的小学生拼接从美国使馆碎纸机里的碎纸片来寻找失踪的美国人的线索,这是一个怎样的国家?

二月六日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

中央新闻电影局关于 以下电影不宜引进的原因说明:
1.《les miserables》艺术方面歌剧不适合中国国情,政治方面片面宣传宗教在人性方面影响力,丑化法国革命巴黎公社运动,票房收入预期很差。
2.《lincoln》违法我党对于美国历史淡化的一贯方针,其中大部分关于议会斗争人权要求部分不符合当前维稳政策。
3.《argo》丑化伊朗革命,恐怕会引起国内穆斯林维吾尔族过激反应,其中正面反映中情局的部分不符合我党一贯的宣传政策。
4.《zero dark thirty》违反我党关于伊斯兰敏感事件的一贯政策,其中正面反映中情局的部分不符合我党的一贯的宣传政策。

二月九日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

对 于我来说,这是深水区。首先我发现我的编译器太旧,很可能导致我无法使用amd的cpu指令,总之首先更新编译器就是一个让人惴惴不安的事情,尝试代码编 译?对于普通library我还可以应付,但是对于编译环境自身我还是谨慎为宜不去冒险,反正gcc4.7也是遍不过的,那么这个方法就比较适 宜了sudo add-apt-repository ppa:ubuntu-toolchain-r/test
然后update再安装gcc-4.7,这个要风险小很多的。这个更新不是很成功,因为我不知道怎么去设置。决定还是从源码编译做起:有三个主 要的以来的库

二月十日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

其 实gcc的开发已经很成熟了,你要升级编译器最好的办法就是义无反顾的全面升级,切不可首鼠两端,也就是说在编译的时候把那三个依赖的库的prefix设 成/usr,否则你编译肯定会和旧版本有冲突,我曾经尝试分别指定每个库的路径似乎都有些问题。所以,我现在顺利升级到了4.7版,现在还不敢说完全没有 问题,但是至少intrinsic的问题解决了,据amd的说法gcc4.7是对于amd的optron有很好的支持,这也是我要尝试gcc4.7的主要 动力,编译很顺利,使用make -j都要很久很久,我的24核的超级电脑都要运行很久。所谓的__m128就是4x4byte的数组类型,使用内嵌的_mm_xx_xx函数,比如 _mm_store_ps,
_mm_load_ps把一个地址的数据存入那种“数组寄存器”或者把数据从“数组寄存器”取到内存地址,(这个专用寄存器的名字我不记得了,大概是 intel的命名的吧,amd有支持)你需要include <ammintrin.h>
而最好的做法不是把指令集一个个的加入到编译开关里,而是笼统的-march=native,这样gcc自动把cpu支持的指令集都加入了。经过测试程序 比较用普通的循环和这个数组指令计算,速度差了3倍,这个是非常准确的,因为这个就是所谓的超标量(superscalor)或者是SIMD。准备尝试 AES。
花了好久才找到原因,不是eclipse也不是无辜的gcc-4.7而是scim输入法在作怪,他导致juno每次annotation window显示什么错误小窗口就把focus偷走了,right click eclipse editor and
choose input method as scim bridge
.同时编辑器的小功能被改动了,(可能是我慌乱中瞎改的),就是那个最 贴心的mark occurrence没有toggle。而我真的有些小白,mark occurrance是一个
很高级的功能,我却把他当作了单纯的字串比对,wow,他是在syntax前提下的search,很绚丽的高级功能。太超出我的期望了,有eclipse 如许,还复何求?
调用AES指令是没有问题了,但是对于nmac/emac之类的算法我要去看讲义,不是很确定。检验cpu是否支持AES指令集的会编码是这样自的:
#define cpuid(func,ax,bx,cx,dx)\
__asm__ __volatile__ ("cpuid":\
"=a" (ax), "=b" (bx), "=c" (cx), "=d" (dx) : "a" (func));
int Check_CPU_support_AES()
{
unsigned int a=0, b=0, c=0, d=0;
cpuid(1, a, b, c, d);
return (c & 0x2000000);
}
总之,这两天还是颇有斩获的,升级了gcc4.7,这个是一劳永逸的,gcc也不再是令人不敢触摸的怪兽,当然我只是 configure/make/install的操作员,但是毕竟不再胆怯系统的崩溃了,因为ubuntu有apt-get大不了从gcc4.3重新来 过。这个让我想起当初在cisco的运行server上发愁怎么安装gcc的难题,怎样在一个没有编译器环境下安装软件?前提当然是找不到现成的 binary。其次是在gcc4.7下调用cpu各种指令集大大的方便,在gcc4.3下似乎完全无从着手,因为各个intrinsic都不对,总之,我 现在完全可以去探索另一个空间了。现在出去活动一下。howard的那个题目我不想编程了,因为其实不难,
一次遍历就能解决。

二月十七日 当前压倒一切的目标只有一个就是h264,可是我却再无前进的动力,现在需要的是集聚能量

我被折腾的半死,这 才意识到我有可能上当了。这 里说是测试AES的testing vector,我的amd opteron 4234死活就是和他们不一样,我都要去尝试用汇编来验证了,结果还是intel的文档救了我。amd和intel是 一致的,说明我的cpu没有问题。我可以安心睡觉了。

二月十八日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

这是一个极其复杂的 操作,我看了好几个解说都没有明白,MSDN的解说尤其的让人困惑,而上面发帖的人的水平和stackoverflow上的人简直就是来自于两个星球的 人,当然msdn上的都是还处于进化初期的。
最后这个图帮助我理解了,虽然他的定义是原来标准的定义的重复,但是同样的文 字配合这个图终于让我明白了:两个bit是右移的byte数,当然就是用来选择四个byte之一了,当然然后还要怎么左移放到目的是不言而喻的, 我就是在这里产生了困惑,因为那个伪代码公式比较的费解。而同样的文字在这里越解释越让人糊涂,主要就是他画的那些连线包括 了所有四个让人无法理解。而msdn 的官方解释shuffle的例子
缺失了最关键的selector的具体操作,单单看结果会让你产生严重的歧义,我真佩服作者选择的恰到好处的例子,真不容易做到啊。微软我为你感到“自 豪”,因为你们的员工就是这样子的,所以你才有今天。
这个是我从intel的关于aes的白皮书拷贝下来的例子,就是这里的这个 ecb的全部操作才能让你得到我 之前困惑的测试例, 为什么不能全包装一个呢?也许crypto的lib确实是这么做得,我没有看懂而已,确实太复杂了,单单这个key-expansion就是头疼,需要这 样自作吗?不能用那个指令吗?(编译开关需要-march=native,当然前提是要支持AES,AMD在这方面很差,是只有最新的opteron系列 才开始的,我的古老的几个“龙”系列都没有,看来amd和intel在技术方面的差距还是很大的。
计算机的东西我的个人体会是没有一样是容易的,借用《清清百老汇》的一句:入门不易,登高更难。SIMD是并行计算中的一个更加直接的实现,我从接触编程 到现在十年有余直到现在才开始接触SIMD,当然这也是新cpu和操作系统以及编译器的进步才让我辈容易使用。

二月二十三日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

烤三文鱼配日本清 酒,而最合适的作料不是别的,而是《yes,minister》。
在我的小花园里我花了大量的钱买种子载种各种各样的花草,买各种各样的肥料棒,插在地里仿佛一根一根的香烟。然后用牛奶浇灌,用牛肉施肥。
照抄修改了一个小东西,基本上没有动脑子的拷贝粘贴代码
看到韩寒的关于中国逻辑的评论很有感触,这个年轻人确实很有思考的能力,文笔犀利如同当年的王朔。同时看到另一个所谓的当初民运人士转而作房地产发家的一 篇文章,尽是苦口婆心劝慰习近平在共党内搞两党制的,不可不为良苦用心的是千方百计为中共寻找出路,虽然很实在,却是痴心,甚至幼稚,共产党发家和恐怖团 体一个样子的,如果抛掉看家本领就会垮台,绝对不会退让的。所谓的交权,交钱,缴枪,一样都不能行,哪怕是党内派别之间进行也是你死我活,这在当年的林彪 江青华国锋,今天的薄熙来再一次的证明了,只有你死才有我活,不存在共生。
日本人虽然很明白中共的这一套,但是安倍不应当说出来,这个是共产党决不答应的。有一点可能是对的,就是今天和任何时候一样,共产党需要完全依靠军队的保 障来实行统治,那么军方要钱要权是无所不能满足的,那么怎么让这个变得合理,那就是战争的威胁,这就是当今的中国政治,需要外来的战争威胁来压制和转移国 内的主要矛盾。看明白这一点就应该能够预料到这两年也许有战争的气氛却无战争的实质,军队只是要钱和要权,但并不一定敢真刀真枪的动武,因为军队内部虽然 又黑又贪却不傻,明白战场上是国际间的真正的竞争来不了半点虚假,和美日同盟的真家伙对抗是自取其辱。
在《yes,minister》的《the devil you know》里面主人公们还不明了希腊加入欧盟的原因,他们认为法国加入是因为要保护他们的农业,德国是为了洗清二战大屠杀重返国际社会,比利时是为了欧盟 总部在其首都赚取外汇,现在他们应该明白希腊加入欧盟的目的就是提高本国人民的生活水平。更新了一点点的文件列表,但是表格的宽度不起作用

二月二十四日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

找到一个非常棒的关于cpu架构的网站
事情的原委是这样子的:我的小抄代码使用了AES的指令,但是没有想到和这个不用cpu特殊指令的实现居 然提高不多,大概就是14cyle vs. 20cycle吧,就是说从加密速度来看,每个byte我的代码仅仅减少了6个cycle,大约30%左右这个难以解释,我的amd opteron有超多的xmm寄存器,我小抄改写代码为4个8个甚至16个block一并处理结果依旧。这个时候我才想起了这个并行就是unroll loop之类的只有在O2才行,结果改为O2,速度提高到了大约不到3cycle/byte,而为了公平起见我看polarssh的编译开关,他是O2, 也就是说polar用了O2和我的使用AES不用O2的效率差不太多,大概慢30%左右,可是一旦我开启了O2,我的AES的效率是他的接近10倍,这个 是符合预期的。至于说4个或者8个block并行处理似乎没有什么大的改进。

二月二十五日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

这个是一个很有意思 的话题,怎样transpose matrix?看上去很简单,可是怎样用vectorized register去做呢?或者说使用SIMD的方法,这 个地方有一个答案,不过我认为说他的有错,这个是我的答案,有一行 的改动,我觉得这个是很难想出来的。
更加有意思的是,究竟这个SIMD比我们通常的循环快多少呢?我的测试很出人意料,其实仅仅快一倍而已,这个是在没有优化的情况下,如果O2,结果快的就 更少了。而且我很怀疑O2的正确性,首先,我一开始没有把我的全局变量“alarmed”声明为volatile,编译器直接就把他当作常数,我的循环就 变成死循环了。因为我在alarm signal的代码编译器不懂得那个改的是一个变量。其次,我在没有优化下看到的汇编代码的的确确是unpck之类的指令,可是O2我看不到了,而且O2 的速度快了十几倍压根就不可能,这个情况和我之前测试AES代码类似,O2能够快将近10倍非常的让人难以置信。
国内的csdn 确实藏龙卧虎。这对于AES 的解释非常的棒,有空仔细看。
写完以上又稍稍改动了一行代码,现在SIMD的transpose要比普通实现快一倍多,我相信这个仅仅是4x4matrix,如果是16x16差别会更 大,所以,这个方法还是很有潜力的。
共产党究竟有多么的邪恶?今天的大多数中国人已经渐渐忘却,而对于其倒行逆施甚至感激涕零,曰因为共产党的改革开放导致了今天的中国的繁荣,而实际上仅仅 是因为共产党的统治束缚了生产力的自然发展,当其为了巩固自身的统治挽救崩溃的经济而不得已采取了放送统治的手段让被压抑的生产力少许解放,结果竟然赢得 了大多数被奴役的人民的感恩戴德,思来真是让人难以置信。如果中国有更多几个像深圳一样的毗邻香港的口岸,而香港能够如同西柏林一样的发达,那么人民对于 共产党的统治的真相就更早的认识,也许能够在更早的时候觉醒而不给其技术改良的机会而崩溃。看看当年东德人民千方百计逃离东柏林到西柏林
的经历,看看当年柏林墙下多少冤死鬼魂就知道真相了。

三月一日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

无意中看到这个amd64 abi的文档,没有仔细看不过以后也许有用。但是 那么多的东西究竟和现 在的程序员有多大关系呢?除非你写汇编码。我现在关心的是更直接的问题,怎样用simd来提高速度,我写的测试例子比普通计算dct还要慢一倍, 看来是没有找对路子。当然也许说的对,如果用8x8效果就不同了。终 于找到了我需要的,下班再说吧

三月四日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

自 从使用ubuntu以来便养成处变不惊的心态,不论是升级内核到2.6.38.14失败,比如完全黑屏,这个在以前是完全让人惊慌失措的,可能在 windows下只好重装系统了,但是在ubuntu下这个是一个简单的配置问题:1.查询当前最新的官方的kernel版本:apt-cache search linux-image 2.apt-get install完全可以做到自动升级。
现在我无法正常启动那么只有求救于ubuntu的发行光碟启动到“试用“光盘模式,我需要修改的就是 /media/OCZ/boot/grub/grub.cfg文件,注意这个是我原先的启动硬盘mount在光盘模式下的。把menu里的那个失败的版本 删除。当然这个是权宜之计因为这个文件是自动产生的,仅仅为了恢复启动而已。随后我选择跳过2.6.38.xx直接升级内核到3.0.xx,结果当然是成 功的,(好像看到gpu的失败错误信息,无所谓的我的显卡没有那么高级吧。)apt-get install的最后有执行类似update-grub2的命令重新产生新的.cfg文件。我的超级电脑的两个强劲的cpu总共需要四个风扇,搞得机箱的 风扇电源都不够了,总共需要八个风扇电源,机箱里的线实在是密密麻麻,当初买了四个大大小小的SSD是一种很失策的决定,导致我现在剩余的两个500G的 硬盘没有接口了。

三月五日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

这个是gcc 内嵌函数(builtin)的一点说明,这个时候我才明白原来这些是所谓的标准库的一些gcc内部实现,有些有优化,没有的话就改调用 stdlib之类的。这 些对于函数功能几乎没有丝毫的解释,实在是让人头疼,难道我需要到Intel那里去找答案吗? 我原本想等到找到更好的算法来实现dct的SIMD的实现,可是根据经验如果我过了两天 还没有再做一件事我几乎永远不会再做,只好保存一个版本。

三月七日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

在 办公室编译一个小工具忙的忘记了下班。其实蛮有意思的,故事很简单,就是paypal的msg queue发送的msg的payload是一个所谓的压缩的binary,有个家伙问我有没有办法解开,我当时说不知道,后来看源代码找到一个办法就是使 用系统的所谓的compressedbinarydeserializer的这个解压缩的类翻转,主要是编译的问题。当我使用-L dir -l staticlib.a的时候g++老说那个lib找不到,而我给的路径肯定没有错。折腾了一两个小时才找到原因,原来paypal的所有的程序都是 32bit的,而redhat是64bit的,默认的g++要的是64bit的格式,那么对于32bit的staticlib完全不感冒,又不肯明说,害 的我摸不着头脑。所以你要加上-m32,其次-l是会帮你加上lib和.a的所以,要给正确的名字。后来老是抱怨一些unicode的函数没有实现,我想 当然的认为paypal的库里有对应的unicode的库,找了很久都没有才意识到是系统的,用的是ibm的icu库,这里有一个小插曲,就是看.so的 时候使用nm看不到任何symbol,必须要-C -D,至于你怎么知道那个binary是32还是64呢?用objdump -h就可以看到了。其次,我
老是犯的错误就是fread的两个参数,一个是大小,一个是数量,我总是混为一谈,大多数时候没有区别,nmem*num的总数对了就行了,但是当你在文 件尾巴的时候,如果你读的是1024大小的一个buffer,返回当然是0了,所以始终都应当是读大小是1的1024个,返回的是读取的size的个数。 这种低级错误我已经犯了很多遍总是记不住。另外,就是-L最好是不要多个拼接,使用分隔符好像不行的,使用多个-L吧。

三月十二日  现在需要的是集聚能量,也许我需要学习encryption而不是encoding

昨 天终于找到了paypal用的是certicom的crypto的库,这个现在应该是blackberry的子公司了,有趣的是这些库依旧和paypal 的core有circular dependency,链接的顺序要折腾。早上起来决定debug我的samsung galaxy s3的mtp连接,使用libmtp看来也许驱动不一定有什么问题吧?

三月十四日  现在需要的是集聚能量,也许我需要学习encryption而不是encoding

初 步看来libmtp写的有一点点粗糙,当然读取手机的文件结构的确很慢,看看我能否改进一点。

三月十五日  现在需要的是集聚能量,也许我需要学习encryption而不是encoding

ptp 也实现的有些粗糙,不过我只是第一眼的感觉,有些妄加评论。于是野心勃勃的下载了libusb决定从头开始。感觉和我所有的计划一样的会虎头蛇尾,真的好 想休息一下。

Doesn't gold and silver make you feel cold and shiver?

三月十七日  现在需要的是集聚能量,也许我需要学习encryption而不是encoding

使 用linux据说就是为了折腾,为了一个简单的问题居然要升级glib2犹豫了一两天还是轻率的实行了,我明明知道有一半的应用都依赖于glib而这个升 级的后果是什么我不明白吗?为什么我还要这么做?是无逻辑的侥幸心理。这就是人性。从头来过?几乎所有的服务都无法正常运行,无网络是最头疼的,似乎无法 恢复,而我居然没有备份的习惯,多么可笑!
编译alsa也是很多的问题,在linux内核3.0上可能才遇到的问题吧?一个据说是改变了smp的semaphore,所以,要改一些头文件,后来改 的不耐烦了,就索性不再编译alsa-1.0.24而是1.0.25或者更高版本,使用这个脚本是很方便的将来先去这里看最新的版本号然后修改脚本的版本就可以了。

#prepare to upgrade gcc to 4.7
curl -O http://www.mirrorservice.org/sites/ftp.gnu.org/gnu/gmp/gmp-5.0.1.tar.gz
tar zxf gmp-5.0.1.tar.gz
cd gmp-5.0.1/
./configure --prefix=/usr
sudo make install
cd ..

curl -O http://www.mpfr.org/mpfr-current/mpfr-3.0.0.tar.gz
tar zxf mpfr-3.0.0.tar.gz
cd mpfr-3.0.0/
./configure --prefix=/usr
sudo make install
cd ..

curl -O http://www.multiprecision.org/mpc/download/mpc-0.8.2.tar.gz
tar zxf mpc-0.8.2.tar.gz
cd mpc-0.8.2/
./configure --prefix=/usr
sudo make install

重头来过,反而是编译gcc4.7遇到了困难。

解决了一个很小的问题,就是多菜单启动我却始终看不到菜单,这个是解决的办法

# If you change this file, run 'update-grub' afterwards to update

# /boot/grub/grub.cfg.


GRUB_DEFAULT=0

GRUB_HIDDEN_TIMEOUT=

GRUB_HIDDEN_TIMEOUT_QUIET=true

GRUB_TIMEOUT=10

GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

GRUB_CMDLINE_LINUX=""


然后sudo update-grub,其实update-grub2可能也是调用的一个东西吧?忘了。

我现在不确定的就是为什么我现在编译gcc4.7会出现莫名其妙的错误,居然连系统是x86-64这一点都不确认?
the error is like this:gnu/stubs-32.h: No such file or directory
This is the link:
这位大仙说的太好了,实际上并不是什么x86-64宏或者开关没有,而是gcc默认的multi-build的开关打开,
要编译多种,可是我并没有装32bit的库,所以大侠说两个办法:
This error message shows up on the 64 bit systems where GCC/UPC multilib feature is enabled, and it indicates that 32 bit version of libc is not installed. There are two ways to correct this problem:

    Install 32 bit version of glibc (e.g. glibc-devel.i686 on Fedora, CentOS, ..)
    Disable 'multilib' build by supplying "--disable-multilib" switch on the compiler configuration command
我先是采用了第一个 sudo apt-get install libc6-dev-i386 但是发现要安装的库可能很多,所以还是用第二种简单。
重头来过真是一个奇妙的经历,把ubuntu重新安装配置多少次才能说满足?其实,我需要的是一个最简单的备份:
tar cvpzf backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/backup.tgz --exclude=/mnt --exclude=/media --exclude=/home --exclude=/sys --one-file-system /
but maybe I also need install java in my ubuntu???
sudo apt-get install openjdk-6-jdk
sudo apt-get install libjavatar-java

如果你看到什么make[3]: *** [all-recursive] Error 1这个多半是那个库没有安装,找entering后面的directory来猜猜看是什么库没有安装。

也许我应该先安装java再来配置编译gcc4.7?
./configure --prefix=/usr --disable-multilib
我发现了一个潜在的原因,就是编译gcc时候非常变态需要sudo来make因为是有直接写文件到目标的,结果我重新configure就有一些无法更 新,也必须使用su来做。
又是好多次的失败,终于我祭出我的杀手锏,那就是make的终极杀伐直接跑到那个出错的模块下去make -d,在漫长的debug信息下找到了端倪,一个非常模糊的警告,是说我的系统没有装textinfo。其实,这个是很不重要的步骤,大 概是允许gcc使用java?总之随后编译gcc4.7终于成功了。好累的一天,而这个仅仅是开始,一个glib2毁了我很多天的工作,很多都要 重来。
看到凤凰卫视《一呼一吸谈》(其实是一虎一席谈,可是我觉得肯定是个假名),很多的言论让人感到的是disturbing,这有两个层面,一个是太真实的 思想的碰撞,让人感到窒息,不愿意面对,一个是太过于敏感的话题。我现在脆弱的心灵最不愿意看到的就是机器人霸主出现之前人类就在核战中自杀了。
一两个号称军方的发言人在谈中国军费到底要增长到什么地步,说要达到每个军人十万美金,有一个颤巍巍的中年妇女说了几句就被打断了,我想她想说的是,美国 日本这些国家的每个军人的军费平均是几十万美金那是人家国民平均收入相匹配的,中国普通人每年十万美金是一个天文数字啊,中国有能力和美日军事争霸吗?想 当年苏联也是如此的扩军备战到底结果如何,而中国即便在发展二十年能够赶上当年苏联的国力都很困难,这不是痴心妄想吗?只能说军队内部贪污腐化的程度到了 登峰造极的地步。真正开战也好,正好和共产党一起毁灭。
非常喜欢斯琴高丽的 新专辑《爱上陌生》。加油啊!我本来是坚决支持要到处买正版的,可是找了很久就是找不到,只好盗版了一个,但是对于歌手的喜欢并不会影响,将来有机会我一 定补偿。

三月十九日  现在需要的是集聚能量,也许我需要学习encryption而不是encoding

我 的ubuntu安装包版本有些错乱,一开始我企图用蛮横的办法解决,就是不管三七二十一直接下载源代码一个一个编译安装,后来发现这个很费时,而且隐患很 多,发现还是图形界面的安装包管理工具好用,可以强迫重新安装标准版本。ubuntu真好啊。手机忘在了办公室,然后世界上的事情就是这么凑巧,这么难得 的事情就碰上了厕所漏水,而我没办法打电话报告。小概率事件是一定会发生的。终于在下班前明白了paypal的启动service的密码加密的原理了。一 高兴就吧手机忘了。

三月二十日  现在需要的是集聚能量,也许我需要学习encryption而不是encoding

关 于mixer,现在其实都很简单了,首先把pulse去除。sudo apt-get purge pulseaudio
并且去掉相关的配置文件:
rm -r ~/.pulse ~/.asound* ~/.pulse-cookie
sudo rm /etc/asound.conf
然后安装GNOME ALSA Mixer,这个太好用了。顺便把以前的声音菜单图标改成gnome-alsamixer
三月二十二日  现在需要的是集聚能量,也许我需要学习encryption而不是encoding
为了编译gmtp要改变gtk的安装版本,这造成了灾难,首先就是desktop无法启动,简单尝试安装gdm不解决问题之后就放弃了,所幸有备份,简单恢复,ubuntu真好。
对于paypal的同事关于Linux的问题我的答案始终是:入门也许有些痛苦,可是一旦拥有别无所求,你再也不想回到windows了。所以,linux是程序员的宠物。
我在系统崩溃前mtp能够正确检测samsung手机,现在居然报告说找不到设备,看来要恢复到之前的状态还要安装什么版本的包吧?libusb是没有问题的。


三月二十三日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

我的Ubuntu安 装的是mtp较低的官方版本,我为了研究mtp要编译他的example里的那些工具需要在eclipse里设定链接我下载的高版本,普通的-l mtp肯定会让你链接

系统的lib,而在-l后面给出全路经文件名gcc也不认,必须要加一个:就是在eclipse的lib里:/my/full/path/static/lib/name这个会自然的优先于系统lib的
链接。
四月四  现在需要的是集聚能量,也许我需要学习encryption而不是encoding

究竟朝鲜发生了什 么?我唯一能够猜测的就是朝鲜内部发生了什么不寻常的事情,也许统治者感觉现在政权基础不稳,或者他们觉得熬吧吗是一个软柿子要捏以下。
libmtp使用的ptp代码毛病很多,比如每次添加一个object就做一次查询插入数组非常的慢,我想改造,但是感觉是不是底子太差了?应不应该从 libptp2入手?要看懂代码还需要很多时间。
有人认为朝鲜想要武力统一,但也有人认为朝鲜想要拒绝韩国的武力统一的防御性的进攻。
四月七  现在需要的是集聚能量,也 许我需要学习encryption而不是encoding

我 把我的硬盘mount到了media,原本以为没有什么大不了的,最近经常发现locate不灵,但是仅仅是怀疑,因为大多数这种怀疑都被证明是我的记忆 力的衰退,电脑不会出错,出错的一定是人脑,或者什么脑之类的。偶然查看updatedb的帮助才发现/etc/updatedb.conf里面是把 /media过滤了,难怪!只好把磁盘重新在fstab里面mount到/mnt上。libmtp写的的确不好,ptp2作为一个协议层的平台,是一个很 好的起始点,总之学习。


四月十日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

看了好几天的代码才 明白了一些基本的道理。1.原始的libmtp可以支持libusb0.1.xx也可以支持libusb1.0完全是由于他自带了两个所谓的"glue “的不同实现,否则两个库是完全不兼容的。2.ptp2看来是和usb层无关的仅仅是ptp协议,取决于你怎么实现,他自代的ptpcam采用的是 usb0.1,我不知道这个是不是失败的原因。反正我觉得libusb1.0肯定是要比usb0.1的好,因为单从接口上看0.1就不大对,读写怎么能够 保证一定成功完成你要的长度呢?这是任何io都不会保证的,即便你自己retry那么从sdk的角度来看开发者也许为了效率需要你在第一时间返回而不是死 锁在那里retry,应该留给开发者决定是retry还是干脆失败,所以这个接口本身就不对。3.非常惊讶的发现libusb_device居然是一个不 透明的结构,让我打开眼界,以前也有遇到类似的不透明的结构比如opengl就有一个所谓的context,这一类型的东西在非常多的库里都有,通常的做 法都是只能声明成void*,使用起来其实并不方便因为少了编译器类型的检查,满篇的cast非常的难看。现在发现居然你可以完全在libusb1.0里 隐藏这个结构,怎么做呢?很简单,在头文件里仅仅前置声明,并且所有的头文件用到的都是指针类型,真正的定义在库里不给你看到。这样编译器就不抱怨了,因 为反正是指针他知道怎么分配内存。我现在在想为什么以前我没有想到呢?或者为什么其他的库非要声明成void*呢?也许是为了将来升级随便改?但是你既然 隐藏了,你想怎么改不都是你的事情吗?而遵循面向对象的继承还可以保证你的指针也是兼容的。当然c代码的人喜欢void*的肯定是一种传统。5.我把我的 git的config设置了一个core.excludesfile=~/.gitignore这样子就省的每次都设置了。要改写别人的代码没有git之 类的版本控制是不可能的。6.昨天我用我的三星手机读取我的vta的卡才明白这个挺复杂的,卡本身是nfc的卡,里面有好几个文件,都有使用不同的key 访问的权限,读写权限是不同的,更换key的权限也是不同的,还有备份文件,完全不是一个简单的id之类的小数据,这个不简单。同时也明白了一个简单的道 理,为什么磁卡是不安全的,为什么smartcard里面有所谓的ic卡之称,明白着这个要实现加密的逻辑没有ic电路是做不到的,磁卡是没有什么安全性 可言的。
这些都是粗浅之极的道理,但是还是需要认识到的,因为在之前我还真没有意识到。

四月十一日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

老话题struct Data{char data[];};这个结构的sizeof是多少?很多人都会认为是指针的大小,其实是0.至于这种空结构的data[]是什么用意呢?是为了不定长度结 构的定义,不是Union,因为那个实际上是先分配最大的长度,而且是已知长度。

四月十三日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

非 常好的关于libusb的教程, 虽然我几乎不需要就明白80-90%,但是有这个等于不需要我自己去做实验来 验证,当然,有源代码可以随时查验胜过任何解说,不过,终归是好的,我说这么多废话完全是面子作怪,就见不得自己承认自己对于一个简单的libusb都不 能自己看代码,虚荣心。当然说老实话,作者还是比较业余的。


四月十四日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

gcc实在是太智能化了,有时候很困扰的。我的代码里有一行比较是在uint16_t与uint8_t之间的,而那个uint16_t是一个大于256的 常量,明显的这个比较永远都是false,所以gcc压根就把行代码优化掉了,结果我花了不知道多少时间去找原因,一直以为编译器除了问题或者是 debugger还是eclipse的问题,这个教训就是出错的永远是人类,电脑是永远不会出错的,不坚信这一点就不算拥有正确的价值观与人生观。我的 nautilus不再显示我的硬盘了,因为我把他们改在/mnt下mount,而不是/media,我化了一些时间想要改变,结果发现何必呢?找到你需要 的硬盘的位置按以下ctrl+D就好了,多方便?!为什么要改变nautilus的默认设置呢?ubuntu真好。
初步完成了Usb的初始化就是找到interface/endpoints,需要三个:in/out/int,现在需要学习一些基本的ptp的 Protocol,结果早上意外断电导致我又要重新设置一些东西。比如断电后我的声卡又找不到了,只好再次编译安装alsa,只是不再下载了。aplay -l显示没有声卡。

四月十七日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

关于ptp的协议,其实就是数码相机的一个协议。我的 eclipse-juno意外crash,于是修改eclipse.ini把几个参数改的很大,反正我的内存有的是,总共192G的内存平常都用不完。早 上身体很不舒服,躺在床上看BBC记者偷拍的朝鲜纪录片,的确任何一个有理智的人都会明白社会主义和法西斯的等同关系绝不是耸人听闻。

pima 15740是ptp协议所依赖的,虽然很简 单,可是我现在身体状态看来没办法。

想钱想疯了想要挖金子,下载bitcoin,需要Openssl编译,官方版本0.98编译有问题,懒得解决就下载最新的,记住了他们是用. /Configure类似bootstrap的意思来配置。/config,所以你要./config --prefix=/usr来避免版本的问题。然后需要libdb4.8++,这个ubuntu有官方的,我一开始搜到一个莫名其妙的libdb,这个名 字太流行了。此外还需要miniupnp的客户端。


四月十九日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

为了编译bitcoin客户端我需要下载安装不少东西,而且自从我升级内核和gcc之后系统的lib的版本有些混乱,时不时的我需要强制改写版本,导致更 多的混乱,终于我改变了libcurl还是什么的,导致gnome几乎崩溃,首先是top panel完全消失了,随后很多命令都没有了,比如gksudo居然不认,我完全没有概念了,例如gnome-panel居然找不到了,我万般无奈只好恢 复备份,这个是我的命令:tar cvpzf backup-`date +"%m%d%Y"`.tgz --exclude=/proc --exclude=/lost+found --exclude=/backup.tgz --exclude=/mnt --exclude=/media --exclude=/sys --one-file-system /
可是gnome恢复了但是panel还是没有,后来下载这个好用的小工具 。而我也想起来了其实就是命令我忘记了gconftool-2 --recursive-unset /apps/panel
看了《oblivion》号称是今年最好的片子,前两天看了《emporer》,这也是一部注定被中国政府禁播的禁片,原因很简单,理由注定是所谓的为日 本侵略战争罪行解脱,可是历史究竟如何呢?我不是历史学家也无意去浪费时间,某些国家的政治就是把任何事情都和宣传挂钩,无非就是一部电影,仁者见仁智者 见智,我很喜欢这部片子,就如同去年的获奖片<argo>一样,无非就是一个历史上的小故事,真人真事,还原一下为何不可?说的有道理可信, 那么我就相信,说的有条理就应该肯定。首先,美国不是不打算清算日本战犯,难道美国人恨日本人比中国人少吗?但是,第一,文明进步的意义就在于战胜者并不 打算将失败者的尸体吃掉,复仇不能代替正义。其次,如果审判日本天皇会导致日本整个国民的反抗,这不符合美国的利益,美国需要的是改造日本而不是用原子弹 来摧毁它。赦免天皇并没有什么不合理。本来在明治维新君主立宪下天皇就多多少少是一个国民崇拜的偶像而已,未必能够在具体的事宜上做决断,所以在发动珍珠 港偷袭的御前会议上说他吟诗应该是真的,大意:“海内皆应归化,何来四海兴波“。这种模棱两可的诗词怎么理解都对,这个作为傀儡皇帝应该是可信的。其实, 就算退一万步来说天皇是发动战争的倡导者又能怎样?只要他被本国人民拥戴,那就是日本人民的意志,美国能够惩罚日本全体国民吗?

四月二十日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

折腾了许久,通过跟踪libmtp的代码意识到我犯的几个错误,首先是低级错误,拷贝粘帖把out的endpoint搞错了。其次是要害的问题,作为ptpcontainer,协议规定的container只 有这么几个东西:length/type/code/transactionid/payload,而其中的payload才是pima15740里 的那个结构:code/session/transaction/param1...param5,所以我有混淆了一些东西,container的那个 code是和作为payload的其中的code是一致的,transactionid也一样,这的确有重叠,但pima15740没有session的 概念,这个是container独有的,在调用opensession的时候把sessionid作为payload的param1参数传递,那么 payload的size就是4了,不过这个好像是无关紧要的,samsung似乎完全无视这个参数,返回的时候session一定是0,这个好像是协议 规定的opensession的时候session/transaction必须都为0,返回的response只有成功不带参数。再一点就是 galaxy作为mtp或者ptp现在在我看来基本的支持基本上是一致的,就是在简单的操作usb的传输上是兼容的,大概只是额外实现了ptp的照相机的 功能,两个pid不同而已:0x6860和0x6865,vid:0x04e8虽然进展一点点毕竟是在前进。这要归功于eclipse,有了它你几乎无望 而不生!

四月二十二日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

找到了一个我的错误,就是每一个transaction都需要response阶段,data是Optional但是一定要get response,另一个现在还不是非常肯定的就是transactionid的问题,是否应当我根据response从device返回的 transaction+1来处理最可靠?我现在觉得这个是比较合理的,为什么当初没有想到?还是理解协议的问题。这也难怪,usb的bulkonly的 实现和ptp的原来的协议有些让人疑惑的地方,就是ptp的container里的Header部分被取代了,而不是原封不动的复制到usb-bulk- container,比如我找不到session了,那么Opensession的意义在哪里?看来我看到的协议是所谓single-session的版 本??

四月二十四日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

reset-device不是很管用,看libmtp的代码是在get response部分反复多次过滤掉之前的transaction,当出现错误复原是比较困难的,昨晚居然被一个低级错误误导,看到 storageinfo的结构定义为两个char*的部分居然以为device会分配内存,这个想法十分幼稚,已经不会有人干这种事情了,连想都不要想, 大体上大家都是用buffer,第一个是长度。我对于结构里的指针变量不敏感,没有意识到那个非法地址的问题,要小心。

四月二十五日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

初步证实了这个做法,在和device通讯出现意外错误后要怎样从错误的transaction流程中恢复过来呢?我尝试使用reset-device但 是似乎不起作用,本来协议也没保证设备一定要支持,所以这个是可以理解的。所以从libmtp的做法学来的做法就是在get-response过程反复过 滤之前的残留的response知道正确的response。也许这个是samsung的做法,我对于transactionid的设置还是有疑惑的。

四月二十六日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

昨天在远程debug paypal的service遇到一些小问题,首先,paypal的所谓的asf service是一种xmlrpc之类的server,其中相对于多个service每个http的文件流可以有多个子进程来select,那么我要 debug就困难了因为那么多进程你不知道那个attach,所以只好把service定义文件改掉只运行我要的那个service。其次, gdbserver的attach是需要权限的,paypal开放了sudo -u的无password的权限,否则完全没有办法。再有paypal的部署中现在把gdbserver之类的都从testing mahcine中拿掉了,不过gdbserver/gdb之类的就是一个可执行程序,拷贝就行了。然而一运行building machine端的gdb的target remote building-machine:debug-port就出现了内存访问错误,稍微的想了一下就只原委,因为我编译的版本包括了Paypal的所谓的 Infrastructure的debug版本原本希望看看基础代码的运行,但是paypal的代码都是32位机器码内存不够了,只好把跟问题无关的代码 都不编译debug版。在跟踪gdb的时候常常要看一个paypal原生的字符串类的内容,这个类有一个私有变量是char*,你可以直接看他的内容,从 一开始就是面向对象编程的程序员会有一种根深蒂固的错误观念认为你不可以访问一个对象的私有变量,至少我以前很久的时候一直以为天经地义,只不过那是编译 器的trick而已,语法只有在编译期才有意义,作为数据结构没有什么私有共有之分,不过我不知道是不是什么设置导致每次打印字串只有一百多个字节的长 度,而paypal的那些变态查询通常都有上千的sql字串,害的我只能一百一百的移动指针偏移来拷贝。

四月二十七日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

昨天证实了一个简单的不能再简单的事实,甚至是会被人当作愚蠢和妄想狂的想法:是否Namespace是函数名的一部分,或者说在编译后的文件名的 mangle里是否有他的部分,几乎每个程序员都会回答是,唯独我有些半信半疑,这很愚蠢。Namespace不仅是编译期的概念也有运行期的身影--函 数名的一部分。
今天稀里糊涂的把内核编译了一通,的确现在google一下白痴都 可以做到从前天才艰苦努力才能做到的。重新启动我甚至也无法确定是否我真的运行我自己编译的内核,这就是对于内核的不理解才会把它神话,所有的人 对于陌生就会产生神秘,对于无知最基本的反应就是崇拜。

四月二十八日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

重新编译内核发现了一个新问题:/usr/bin/ld: cannot find crt1.o: No such file or directory
解 决的办法很简单sudo ln
-s /usr/lib/x86_64-linux-gnu /usr/lib64
经过我长期的检验,stackoverflow.com绝对是最有权威的linux网站,希望各位多多支持。
一个流氓的逻辑就是没有逻辑。原则的本意就是逻辑,或者叫做一致性,你的思想行为必须遵循一定的逻辑,这一点在共产党国家是看不到的。
我从来听到的反美的理由就是美国干涉别国内政在整个地球为所欲为,强行推行美国式的民主自由价值观。为什么美国要这样做?在共产党的历史教科书里是有答案 的,在第二次世界大战爆发前美国不是这样子的,美国是一个置身事外的埋头本国事务的,对于欧洲的战争并没有去干预严守中立。结果美国没有招惹法西斯,日本 法西斯偷袭了美国,从此美国意识到维持世界和平是美国的份内责任和义务,美国人民慷慨的付出生命和金钱维持世界和平,无偿提供了整个欧洲复兴的马歇尔计 划,扶持战后的日本韩国对抗共产主义法西斯的侵略,在朝鲜和越南付出了巨大的牺牲来维护世界秩序,结果被共产党的教科书称作是霸权主义,而在二次大战前保 守中立又被共产党的教科书称作“绥靖主义”纵容法西斯,做美国人真难,因为共产党永远也不会承认美国的动机。
思想成为语言,语言成为行动,行动成为习惯,习惯成为性格,性格成为信念,信念成为命运。
这是一个值得汲取的教训,我在读objectinfo的时候把根据定义的结构指针强转指向返回的数据,可是在读结构中文件名的时候总是不对,usb里的定 义是这样子的,第一charset用的是“UCS-2LE”,我们要转为"UTF-8",使用iconv来做,我这部分代码不太明白就照搬了原来的 libmtp部分,但是总是不对,debug过程中注意到字串的长度不对,usb的string是这样子定义的第一个字节是字串的长度,其后包含结尾的 null都是由ucs2组成的两个字节一个字符的。于是我开始怀疑我之前的偏移不对,一个个的数pima75140的定义发现偏移是52,而我的 sizeof得到的是56,难道我的结构多了什么东西?略一沉吟编制原委是因为我的64位机器肯定默认4字节对齐,于是加上#pragma pack(2)强制word对齐,于是sizeof是52了,转的字符都对了。unicode的部分挺罗嗦的,我现在对于怎样获得langid还是不很清 楚。
这么一个小小的工程几乎就是照源代码抄袭也是那么的不容易,学习从来没有简单的。认为编程容易的人要么是天才,要么是白痴。大多数人都不应该这么认为。
will smith是我一个非常欣赏的演员,在我后来看了不少的电视剧才知道他原本就是一个小童星了,结论就是成功绝非偶然,长期的磨练与积累,和不懈的追求与奋 斗。
用电驴下载郭美美的视频,当然找到的都是日本av冒牌的,不过我觉得她的专辑也还不错,和所谓的流行的那些女歌手都差不多,港台的歌手大多都是录音棚里处 理的,高音上不去就走沙哑路线,或者就是以舞代歌,真正靠嗓音表演的很少很少,许多唱不了得干脆就说自己是创作型的歌手来开脱。就算是我最喜欢的歌手斯琴 高丽说老实话高音部分也很吃力,她自己在微博里也承认,不过我还是喜欢她的路线全力支持,争取将来有机会买她的正版。

四月三十日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

usb的endpoint的maxpacketsize还是512,但是当数据大于这个的情况下会继续发“纯粹”的raw data的packet,这个是我现在实验得到的观察结果,需要改代码来证实,看来libmtp的代码的确写的比较难看,因为我不喜欢他的风格。
中日是否一战真的很难说,但是我对于世界大战的爆发却觉得可能性前所未有的增加,原因是深层次的结构性矛盾。两次世界大战在欧洲爆发的原因和亚洲是独立 的,都是因为欧陆大国德国的崛起和利益格局的不对称,那么今天假如中国真的崛起而利益格局不接受有什么结决的办法呢?只有战争。
美国人在这一点上我是比较反感的,就是阿富汗伊朗的穆斯林是恐怖分子,车臣新疆的穆斯林就不算恐怖分子,直到今天如果不是波士顿爆炸案,美国人还要救助这 些难民,反而对于给这个社会做出巨大贡献的印度中国程序员用H1B抽签的形式来歧视。人种的确是有差别的,因为他们的家庭文化是后天的重要的影响,环境决 定人性。

五月四日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

这很可能是一个笑话或者谈资。首先,我不知道为什么会被误导认为event也是双向的,这个在其他usb设备也许是对的,但是在pima15740是device 对host的通知单向的。值得欣慰的是我并不是唯一可以被嘲笑的对象,libmtp的作者可能也不是很明白,首先他压根儿就没有实现event监听,也许 他做过但是放弃了吧,总之原本应该建立一个线程监听的代码我找不到,其次,他居然使用bulk而不是Interrupt的接口让我很吃惊,反复看获取 Usb endpoint的代码我确定他要么是搞错了,要么是完全不理解,这也许是他放弃的原因,因为你肯定会获得找不到设备的错误。一开始我还认为可以使用 event方式发消息给设备,跟踪代码看到检查packet的方向才意识到interrupt event很可能是仅仅用来通知Host的方式而已。重读协议看起来的确是这样子,因为Pima协议并不是专门为Usb设备的是一个抽象协议所以看不到这 部分相关的部分,在之前对于Pima不熟悉的情况下看usb相关的部 分很混乱因为这个文本assume你已经明白pima的部分,现在是该研读usb细节的时候了。
总之,我对于进展还是可以满意的,至少一点点的前进都是实实在在的,虽然是比较简单的工作,但是对于入门的水平我还是可以满足的。
不过下午测试了以下发现event似乎没有什么用,因为协议上说的很多消息都是从device推送的一样,我删除文件之类的操作并不会收到消息,这很有可 能就是真的。保存一个实验的版本。

五月五日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

我初步的结论是gvfs使用的gphoto2采用的是mass storage协议??如果是对的,问题其实就很麻烦了,因为不是简单替换gphoto_port的usb库那么简单,首先,普通Usb闪存使用mass storage你还是要兼容的,其次,原本使用的libusb0.1.x的库要替换为libusb1.0就不是完全一一对应的兼容,否则也不会出现这么多 的兼容的问题,这个库压根就有很大的区别,再有就是要把ptp或者mtp的文件相关部分都实现一遍,我的那个实验性的就是mtp的一个简单的实验,这个不 是非常多的问题,问题是怎么同时兼容两个协议两个usb的库?这个。。。也许我应该回到libmtp去改造而不是另起炉灶,把别人的代码优化重组很多时候 未必不是一个好主意,主要要有坚定的信心和理由。应该承认原有的框架并不算坏,只是一些实现细节有些不妥,也许是个人风格爱好的问题吧。自己写不出好的代 码就不能嫌弃别人的代码糟糕。
尝试安装虚拟机实验这 个蓝莓的玩意。我怀疑我安装64位机有些设置不同,准备试验32位ubuntu来安装。
终于又一次把ubuntu重新安装了一次,之前我还是神定气闲的准备用我的备份来恢复,可是不知道为什么总是出错,是文件系统出错变成只读,后来用 LiveCD回复文件,还是不行,再恢复早些的备份还是不行,其中很奇怪的问题是hung over "check batter state...",后来解决这个问题,gdm又不正常,而且我的系统经过升级内核3.x后库完全破碎,我自己后来编译内核似乎只是让事情更糟糕。我想还 是要作磁盘镜像,单单系统文件备份不可靠啊。
重新安装升级gcc4.7遇到编译链接bison的问题,需要再安装bisonc++,很奇怪的。又遇到java的编译错误,忘了怎么回事了,尝试-- enable-languages=c,c++,objc,obj-c++ ,fortran
至于firefox不能和其他声音设备混音的问题是依靠安装gnome-alsamixer解决的,这个应该不仅仅是一个gui的设置工具,他应该有软件 mixer的功能的吧?

五月六日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

升级了内核,可是忘记下载内核代码,因为编译alsa需要: apt-cache search linux-image; apt-get source linux-image-3.0.0-32-generic 这个就是我内核的版本。但是我的问题是/usr/src/linux下没有正确的内核代码,或许我需要软连接?还是我需要软连接内核头文件?
手动安装太麻烦了下载头文件包: sudo apt-get install linux-headers-$(uname -r)
正确的安装是: sudo apt-get install --reinstall linux-headers-3.0.0-32
linux-headers-3.0.0-32-generic 因为两者缺一不可。

五月十日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

又加深了一些了解,get status这个是通过control渠道获得的,而event的interrupt的渠道是针对一些异步事件的,两者完全不同,而我得到pipe error都是因为传输方向搞错了,看协议不仔细的毛病啊。协议没有错都是人的错,做人真该死。

五月十一日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

发现了一个可以预料的问题,我的代码写的很粗,因为不想多花时间在一个实验程序上,获取storageinfo超出一个packet 512bytes的情况是可以预料的到的。
去看ironman3,也是可以预料的糟糕,我原本就不喜欢这个系列,早就不抱任何希望的,唯一可取的是主人公的从来金钱不是问题的生活方式,这是我看电 影的一个目的,正如《salmon fishing in the Yemen》一样的,五千万英镑不算钱的主才是真的有钱人啊,我也想过一下那种生活啊。主人公说英国的神秘,the rich fight for the poor, the poor fight for the rich.很有意思的观察。从一个角度看是所谓的和谐社会的理想,富人为了穷人,穷人为了富人。这个是中文的玩笑,有人歪解说是穷人为了成为富人而战斗, 后面一句富人为了装穷来减少穷人的嫉恨,所以,fight是为了看上去显得比较穷,而不是真的和谐社会。但至少表面上要和谐,不像中国穷人因为绝望无法梦 想成为富人以至于只能仇富,富人因为没有地位不得不穷奢极欲以便摆脱无地位的穷人身份,因为再英国富人是受到人们崇拜的,再中国人们只是崇拜权力,富裕并 不真正被崇拜。
真的就是仅仅为了钓鱼吗?那个富翁说,他希望人们现在能明白这个并不是仅仅为了钓鱼。的确,花五千万英镑仅仅是一个人的业余爱好吗?那么究竟为了什么相信 每一个认真看过电影的观众都应该明白。三文鱼的基因决定了它们即便是在家养的环境下也能依靠本能逆流而上,人类之所以能进化到今天就是因为人类的基因决定 了他一定会接受更多的挑战,每当他的生活归于平凡,他的本能就决定他要寻找新的挑战。所以,这个就是我的决定的原因和理由,至少是我现在发现的。

五月十二日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

下载无意中看到《麻豆宿舍》完全不能明白是什么,专门的一个搜索类别,看开头以为是韩剧,看演员名字以为是大陆的电视剧,看了一半才知道是讲嫩模的,才实 在明白什么是嫩模。
总算有了一点眉目,不管什么样的reset都不管用,control也好,bulk的request也好,最后肯定还是reset interface有效,我把galaxy重启都没有用。
debug是困难的,我知道我的实验代码里哪里有内存的错误,但是很难发现,因为程序出错总要在读了上万个文件信息之后,因此只好先把读文件名的部分注释 掉来看看是否还有内存错误,这是美版反的办法。
有时候我偶然想到这个世界上还有几个如中国共产党这样的独裁专治的政权?好像已经没有几个了,连越南共产党都不得不作出更加激进的改革,因为但凡是一个清 醒的政治家都会明白从宏观上来看要维护一个如此专治独裁的政权的可能性是非常小的,因为生产力的提高取决于两个因素,生产工具和劳动者的进步,两者的进步 不一定是同步的,但是一定会达到一个阶段不得不更加依赖劳动者素质的提升,从宏观经济的表现上说就是产业升级换代,那么劳动者素质的提高要求劳动者更加聪 明,更加善于学习,更加又知识,这一定会和共产党的愚民统治相抵触,为了维稳需要劳动者无知愚昧,可是为了经济发展需要劳动者聪明智慧,这两者的矛盾终将 达到不可调和的阶段,也就是共产党统治崩溃的时候,这是不以统治者意志为转移的,共产主义政治的核心就是生产关系一定要适应生产力的要求,如果上层建筑阻 碍了经济基础的诉求就会被摧毁,这个定律如果共产党自己不相信还有谁会相信他的主义?但是历史大势虽然如此,为什么十三亿人口甘心被几百万权贵统治而不愿 反抗?其实很简单,民族的劣根性,中华民族历来是一个忍辱偷生得过且过的民族,正因为此,蒙古匈奴女真等等历史上无数的征服者总是以极少的代价统治多于他 们很多倍的人口,二三十年前天安门广场上的几声枪响几百个人流了血之后十几亿人就都被吓破了胆子,正如一次次的历史上的外族入侵一样,苟且偷生,白天被奴 役之后夜晚努力繁殖人口。从这一点来说,统治中国要付出的代价极小,获得收益极大,作为权贵资本家来说这是投资收益最大的投资,那是绝无可能主动交权的。

五月十五日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

遇到了前所未有的困难,就是galaxy对于我的请求不回应,比如opensession经常失败,关机重启,改变Usb连接协议,发请求reset, selftest,通通无用,昨天看到libusb-1.0有一个compatible的接口可以完全兼容usb0.1版,就把他用到libptp2上, 结果却没有什么用。不过从另一个方面明白了一个简单的道理,linux的usb驱动接口也是一样的文件,这个难道是新鲜事情吗?当初我去面试也是大言不惭 的说linux的驱动比windows的来的容易,因为全部对外作成文件接口,面试者两人相视而笑,不只是表示赞同还是对于我的嘲笑,总之,现在我完全找 不到解决的办法,也许是当初下载文件超过上万导致transactionid溢出?或者samsung的内部的bug让我的给碰到?怎么办呢? airandroid是一个很好的东西,这个和现在打印机采用发送email来打印一样的颠覆了传统的驱动开发的乾坤,也就是 web/email/wifi这些通用支持的平台上不再碰设备接口这些传统的路径,将来也许驱动研发者的饭碗都要越来越少了。
当今的人类社会也许正处在大崩溃的前夕,新经济的变革彻底改变了旧有的国际经济政治秩序,曾经的贫困愚昧在觉醒,曾经的富裕繁荣在衰退,发展与和平是不可 持续的,多重矛盾的累计必然需要一个总爆发与大解决,在人类被纳入机器人的理性统治前,人类社会的自杀式的战争是唯一的解决方式。
当所有的灯都熄灭的时候,你才会看到光明。现在唯一能够检验的就是在windows下看看galaxy是否正常工作。办公室里现在是我唯一的 windows的系统。
生物进化用算法来形容就是一个正反馈机制,核心是怎样定义什么是正什么是反,怎么样加强反而不用担心,因为那个就是进化算法需要找到的,所以从这个角度看 这个算法足够简单了。我们需要操心的仅仅是设计这个正反馈机制,要让它足够抽象足够灵活能被应用到任何领域,甚至包括算法自身的迭代,这个似乎是否定了这 个算法本身是一种算法,因为它自己也是自身的输入数据以便迭代出新的算法。所以我说道可道即非常道,名可名即非常名。
The chances are that the changes are changed by the chances that change the chances.
捡到一个漂流瓶。打开看到两行字,曰:择一城終老,遇一人白首。一时兴起出上联曰:择城終老心诚才成。然下联如何对呢?

五月十八日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

开始放大假。工欲善其事,必先利其器,要好好安装virtualbox,但是一直遇到Cannot unload module vboxnetadp,我是从web安装的virtualbox,所以后来再打算从apt安装,要把自己加入到group vboxusers,而仅仅logof是不够的,必须要重启。据说vbox的网卡驱动模块hookup了我的网卡。

五月十九日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

在虚拟机上把我的过程先做一遍是安全的。在内核2.6安装了virtualbox的additionalguest package,然后我就升级内核到3.0这个时候想要执行一个startup命令自动Mount shared folder,第一步是写一个不需要passwd的sudo脚本在startup运行,这个是 通用的做法。 就是在sudoers里面定义那个命令不需要passwd,这个是最好的办法。结果这个时候发现mount失败,说是找不到设备,这个让人迷惑了一下,原 因是这样子的。 首先要明白原因是内核模块未加载,可以这样子看到lsmod | grep  vbox。其次,为什么之前有了现在没有了?因为内核升级了需要重新编译安装啊!那么编译安装需要两个前提,本身编译内核模块需要内核代码头文件,所以要 去安装linux-headers-$(uname -r),别忘了generic也要。而virtualbox的guestaddition有个前提是dkms,这个必须先安装才能正确加载安装。
这个是mount为当前用户的命令,我曾经为自己的想当然付出不小的代价,注意是vboxsf不是文件系统的fs!!!  
mount -t vboxsf -o uid=1000,gid=1000 Downloads /mnt/Downloads
而剪切板共享是要在guestaddition安装成功才有的,我发现要重启系统内核才正确加载,应该是可以手动,不过总之,寻找copy/paste不 灵的原因前重启动试试看。

五月二十日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

开始放大假,而第一天就充满了挑战,我觉得我的一天是这么的充实,因为阅读kernel不是那么的简单,何况我要开始的部分是跳跃的一步到位去看 driver,而看的大部分是注释与readme和document/docbook,必须先从概念入手,不过也明白了不少的浅显易懂的东西,比如现在才 明白什么是bus,这是一个纯粹的抽象,任何设备的工作的核心目的是和处理器通讯,那么就需要一个管道,这就是bus,哪怕这个设备本身就是主板上的 bus,也需要。那么usb的bus是什么呢?我一开始以为是scsi,现在觉得应该是pci,这个实在是让人惭愧,我真的不知道。编译内核是另一个入门 的步骤,很惭愧我才刚刚知道make menuconfig和oldconfig,其中make -jN我应该可以选的更多一些因为我又24个核。现在轮到编译一个helloworld的东西,是在sample/hidraw下面一个样本hidraw 驱动的应用,怎么编译呢?makefile看的一头雾水,后来才明白是是这样子:make V=1 KERNEL_CONFIGS=DEBUG -C "/mnt/BigDisk/nick/Downloads/linux/samples/hidraw/" M=$PWD ./hid-example注意,你给出代码路径和目标,那么kbuild自己会明白的,我的当前路径就是那个samples/hidraw,问题是我修 改当前的makefile加入-g不起作用??问题是怎样编译debug版本呢?我的那个开关不起作用,估计是哪里strip掉了。这里看到了elinux的高级 debug技巧,留待以后。这里是kbuild 的文档, 要看的真多啊。总之,我现在一天学习的东西是上班的五到十倍,这一点从睡眠就知道了,前几天老是睡不好,今天终于睡到六点了。另外,我一直不是很清除怎样 debug一个没有symbol的程序而用file命令打开另一个带symbol的程序,这个是kernel debug必须的,原来在lenovo的时候实际就是这么做的,只不过都是别人帮我把环境设置好,自己始终没明白,而且也不清楚他们用jtag的步骤,一 定要尝试qemu的。这个pi的交叉编译我还 没有时间尝试。
这个是必 要的pakage:  sudo apt-get install fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge git-core libncurses5 libncurses5-dev libelf-dev asciidoc binutils-dev
我从来没有看过boot目录下的东西,你要sudo su才能去,好像sudo不允许cd吧?哪里有6种文件:其中config就是我们编译内核需要的,System.map是所谓的symbol table一类的东西,大概和你用nm看到的一样吧,就是每个地址的函数名字。ABI是一个编译的时候产生的关于每个src模块输出的函数名字的 linking的名字,中间的那个4byte的数字应该不是地址,至多是偏移,因为system.map那个才是真的地址,应该是绝对的加载地址。而这个 abi里面应该才是类似的symbol table里的内容吧。真实混乱,system.map是告诉loader这个地址就是加载这个东东,而abi是编译产生的偏移地址,是可以在编译好的 binary里找到的地址偏移,相对地址。不过两个东西里的函数我还没有找到一致的,为什么?看来我猜想的不对。修正,找到了一些对应的,看来找不到的应 该是其他的什么吧?(这里是kernel还能有什么其他的?真实无逻辑的狡辩!)总之,地址的猜想应该是对的,也许输出的symbol...还有一个文件 是所谓的vmcoreinfo似乎是关于类型定义的,要么就是virtualmemory的定义?猜的。剩下的两个是initrd和vmlinuz,这 里是关于他 们之间的差别。我的理解就是“initrd files are CPIO images, filesystem images”,这个大虾的定义很精辟,我现在才想起来在paypal的所谓的rpm包的制作与揭开,这些都是linux/unix的标准的做法。隐约记 得那里说过这么作的原因是一开始系统在loading的时候需要在文件系统还没有运行前的时候需要这个东西。例子就是显示文件系统: root@nick-server64:/boot# zcat initrd.img-3.0.0-32-generic | cpio -t看到的真不少啊?有lib,etc,grub,conf等等很全。
出门走一走吧,虽然一早上没有什么实质上的工作,但是还是挺累的。走在路上我就一直没有想明白怎么可能编译samples下的代码那么容易,回来发现真是 白痴,那个完全是User space的代码,用的全部是user space的头文件。
进入了一个虚幻的世界,突然之间我的主机无法启动,不是虚拟机,因为虚拟机的确被我搞砸了,我用livecd启动来查看硬盘发现boot下面grub没有 了,而且initrd和vmlinuz指向的都是2.6的版本?难道发生了什么灾难?修复之后重新启动看到rcu的什么东西又死在那里,最后无奈关电源回 复bios,然后启动,结果发现虚拟机没有了。难道见鬼了?
virtualbox是不错的虚拟机,但是他是太深人的纠缠在我的机器里,和qemu的途径是不同的,后者是真的虚拟一些设备,而前者是直接利用你自己的 硬件啊,各有各个的好处,比如我一直想用virtualbox来作探路者,做什么之前先用他来实验,可是最近的莫名其妙的事情让我不敢再用他了,而且我安 装现在老出问题,就是他的加载的内核模块让我的机器不能重启,而xen的做法我觉得对我来说意义不大,我不需要什么Hypervisor因为我现在仅仅想 在guest上作实验,容易恢复。所以,现在想尝试qemu,我知道内核的问题如果不把虚拟机这个工具建立起来根本就不要去想了。所以,多花时间值得。
sudo apt-get install xz-utils 这个是必须的否则xz形式的文件无法解压缩。
qemu也很麻烦一个备份就让我头疼没有搞明白,毕竟是非盈利的,工具很不全,所以决定还是用vmware player。可是vmware有一个非常奇怪的问题就是硬盘只有10G不管我怎么分配大小都是10G,晕倒!
折腾了一晚上觉得还是只有virtualbox可用,因为vmware压根就是要让你买的,所以,vmplayer很多问题是半故意造成的,你根本不敢用 它作什么严肃的工作。qemu其实也很好,就是不太专业,比如端口映射也要使用者自己操心,也许对于更加熟悉的用户为好。xen的hypervisor我 一听就头疼,我还是只需要guest系统,效率不是第一位的,何况我的cpu的bios好像我还没有实验打开支持hypervisor的。总之,还是用 vbox吧。而且我发现直接用ssh比shared folder要快很多。
安 装eclipse的java环境我总是忘记:sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" 然后sudo apt-get install sun-java6-jdk
下载内核代码是正确的第一步:git clone git://kernel.ubuntu.com/ubuntu/ubuntu-lucid.git 而这个是源头,我需要的是这个tag: Ubuntu-lts-3.0.0-32.51随后我从虚拟机上再clone一遍就得到了head是这个tag的local的branch,然后我决定在 虚拟机上编译这个内核及其部署,否则我的主机太危险了,这个是虚拟机的最大的好处。至于debug我现在还没有谱,不过按照在paypal学到的经验最好 整个内核都不动,只是专心于某个module这样子就容易掌握多了,否则就太困难了。第一步先看看默认选项的make oldconfig编译的内核是否能够正确运行,然后要正确的部署/usr/src下的User space的开发头文件,之前我在主机上这个方面搞得乱七八糟,现在都不太敢重启了,因为很多问题不重启都不会暴露,主机最好不再作大的更新。原本就是想 用vbox作为更新的实验品,因此想要clone尽可能多的配置和软件,不过现在看来主机还是持重为好,我已经分配了8个cpu给虚拟机未来甚至可以再 多,虚拟磁盘clone一下就行了,是否可以将来只在虚拟机上工作呢?这个不是更加的可靠吗?想想看我主机上的备份仅仅是系统文件的备份,实际上并不可 靠,磁盘镜像实在是太大了,很不现实。
工欲善其事,必先利其器,我的观点一向都是开发是三分之一时间在环境上,三分之一在测试debug中,能有三分之一写代码就不错了,我还没有计算阅读资料 的时间呢。
总之,我认为我有这个能力去做的话不做就是对不起自己。
编译内核重启总是发生Kernel Panic - not syncing: VFS: Unable to mount root fs on unknown-block (0,0) 当然我现在已经明白grub.cfg里面的recovery是怎么回事了,无非就是把上一次的内核重启而已,以前我也和很多人一样看到启动失败就惊慌失措 茫然不知所措,现在好多了,终于可以睁开眼睛了。I am waking up from the Matrix.
当然找到了原因,首先是压根就没有Initrd加载,这个在grub.cfg上看到了,其次,压根我编译的内核没有产生initrd,这个却是要花时间研 究,我猜想我可能没有使用正确的make install命令,因为makefile里面非常的细致,不仅仅是简单的拷贝vmlinuz,还有头文件的安装,而使用update- initramfs 手动产生需要事先安装内核模块及其要加载在init ramdisk里面的模块,这个步骤是怎样产生的呢?所以,一环扣一环,我累了,要休息一下。
一个晚上的辛苦还是值得的,首先,建立了虚拟机的工具和作业方式,这个是制度层面的工作非常重要。其次,终于找到了那个简单的启动失败的原因,是 kernel panic,不过我现在不再panic了!yay!
关于产生Initrd的故事可能很长,我还不是非常清楚因为ubuntu版本升级带来了新的机制,但是归根结底是这样子的:工具:sudo update-initramfs -c -k kernel-version. 而这个工具的前提是他在/lib/modules/releasenumber下去寻找生成的module,也就是说你必须先install module才来作这个,在kernel的makefile里是有module_install的命令的,不过我觉得我编译出来的Initrd-img太 大了超过之前版本的十倍!应该不需要那么多的Module吧?但是结果还是启动了,这个也许是没有作对,因为你把ramfs做的更大都不算错只要你又足够 内存足够快,当然应该越小越好,可是不一定行啊。目前我对于部署头文件还不清楚为什么不成功。但总算又了一个初步的头绪,update-grub2很聪明 的,他看你的/boot下又什么就产生什么样的菜单,不用你手动修改的。
关于header_install我执行了似乎是可以吧?这个是为了user space的lib的,在/usr/include/linux下面。可是这位大 虾说的很有道理然我又疑惑了。不过我觉得我一开始就搞错了我的问题,我是再想怎么作kernel的driver开发需要/usr/src而不是 user space的头文件,也许那个src没有什么玄机的,自己加一个symlink就是了。这个是 官方的解释,如果不信还能信谁的?
国内的那个所谓的“军迷”或者“铁血”,简直就是无脑网看客估计都是义和团挡子弹的主,当然网站建立者脑子不傻里面的木马广告一大堆,赚钱才是正事。
关于日本首相穿迷彩服就算复活军国主义真是岂有此理,那么江泽民穿军装检阅部队视察部队算什么?在游乐场一样的地方政治家穿一件行头争取民意又什么错了? 日本是一个民主国家,首相是人民投票选出来的,如果人民全体都同意复活军国主义你能说是政治家的错误吗?只有独裁流氓国家里独裁者代替国民思考代替国民发 声代替国民消费才有可能出现军事强人的军国主义。缅甸为什么一直和中国靠在一起,巴基斯坦,朝鲜,古巴,伊朗,这些哪一个不是流氓政权,和流氓混在一起的 不是流氓就是强盗。

五月二十二日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

我用git也有一段时间了,不过paypal的环境让人会变得有些白痴,因为很多东西别人都给你takecare了。现在我遇到一个简单的不能再简单的问 题:从ubuntu 的kernel我clone下来git clone git://kernel.ubuntu.com/ubuntu/ubuntu-lucid.git然后我查找到这 个tag是我要的,然后我就checkout这个tag:
git checkout Ubuntu-lts-3.0.0-32.51我从我的虚拟机上再通过ssh 来clone这个,于是虚拟机上的head就是这个了,现在回过头来我在主机上想回到master来pull/fetch,就总是说我现在没有在 branch上之类的错误,我隐隐约约明白我要把我的本地和remote对应起来,可是在paypal里这个过程都被别人做了,我自己偶然创建独立的 branch和自己的remote对应起来走的是一个完全不必要的过程,google一下才知道我又忘记了这个命令:git branch --set-upstream master origin/master这样子我本地的master就和远程的master对应起来,以后pull/fetch就用默认的不需要再多的了,然后我 checkout什么tag后可以再checkout master再回来更新remote。这本来是一个基本的东西,可是我因为一直没有理解。
针对initrd没有正常产生的问题,我准备实 验这个编译过程: 下载工具make-kpkg,(是kernel-package,花了我好久才想明白,因为我在虚拟机上找这个package)设置配置和之前是一样的, 或者自己把/boot下的config拷贝来,或者完全自己手动设置,oldconfig/menuconfig。然后编译make-kpkg --initrd kernel_image kernel_headers modules_image不过那个concurrency=3我还没有搞明白是不是就是make -j3一样的意思?证实了,在命令前加上CONCURRENCY_LEVEL=20就相当于使用20个核。make-kpkg编译出错了,为了验证我决定 再用make编译一遍看是不是有什么配置的问题?结果发现磁盘不够作snapshot,结果又忙着删除旧的snapshot,这个时候报错说是不能在线 作,只好作snapshot关机再删除,这里看得出来snapshot是和gemu一样用的是differential文件,(这一点又什么可怀疑的吗? 真实莫名其妙!)
有很多的人天真的以为“习李”政权仿佛是新政,如同基督教新生婴儿诞生所经受的“洗礼”一样代表全新,可是真正目光“犀利”的人会认识到中共的政权的本质 为少数权贵服务是不会变的,所谓“维稳”也好,“宪政”也好,在不触及权贵统治利益核心的时候都可以是彬彬有礼人模狗样的,可是一旦触及了统治的根基所谓 “四项基本原则”就要面露峥嵘了。
120G的SSD不够了只好拼命删除snapshot,另一个200G的ssd是否要创建另一个虚拟磁盘作为数据仅仅mount上去,这样子就不用作那么 大的snapshot了,全世界所有的系统不都是这样子的吗?可是virtualbox制作磁盘的菜单在哪里?
我copy了一个新磁盘在另一块硬盘上,准备将来作为数据磁盘Mount制作snapshot前再umount这样子就节省空间了。不过目前我觉得问题并 不是什么编译方法的问题,而是我下载的代码也许有更新,和我之前的virtual的kernel配置不同(在make oldconfig的时候出来了大量的选项,我没有尝试拷贝当前的config这个可能就是错误的地方,我现在理解make oldconfig是把你在/boot下的上一个内核的配置拿过来吧?而不是你当前内核的配置?),现在make结束就可以见分晓了。同时虚拟机的灵活改 变硬件配置可以让我很容易添加cpu和内存。而且有趣的是我虽然使用make -j7可是我的八个cpu几乎都在满负荷工作,这个数字看来我没有理解对。
现在再一次深刻认识到如果是要从事硬件内核相关的开发虚拟机是绝对的必须,在这方面的投资是绝对值得的。等会回来要学习Initrd到底是怎么回事,能不 能变小一些?
这个是我自己的编译内核流程:
1. git kernel source: git clone git://kernel.ubuntu.com/ubuntu/ubuntu-lucid.git
2. git checkout the right tag: git tag -l可以看到需要的。
3. cp /boot/config-`uname -r` .config,然后作make oldconfig或者menuconfig
4. make -jN    编译内核
5. sudo make headers_install 
6. sudo make modules_install   这个必须在7之前因为update-initramfs需要用/lib/modules/releasenumber下来制作initrd
7. sudo update-initramfs -c -k `make kernelrelease`
8. sudo update-grub2
9. sudo ln -s ./include /usr/src/linux-headers-`make kernelrelease` (我现在还不确定编译内核是否要用到内核源码,照理说头文件和module就够了,那么这个没有什么必要,仅仅是为了一致性吧?)(这个属于白痴的错误,根本就不是创建正确的软连接,还不如直接sudo cp -r ./include /usr/src/linux-header-`make kernelrelease`)
And this is a moment of truth to see if my way actually work on my VM. Voila, it works!
不过让我感到迷惑的是,10.04的版本实际上已经被换成了10.10吧?因为我看见内核代码的代号用的不是lucid而是10.10的那个,启动后界面 是不同的。升级完内核突然发现鼠标不能用了,panic了一下以为是virtualbox的bug,稍稍一想就明白这个是guestaddition要重 新安装编译啊,内核换了他的那个capture是完全仰仗guestaddition的呀。哈哈。
要学习的东西真多呀,我现在才明白什么是busybox,似乎以前在cisco看到过这个名字,现在才知道它是瑞士军刀一样的好东西。这里是关于 initrd制作的一个好的例子,包含了很多很有用的东西,学习中。
首先,Initrd-img其实都是压缩过了,可是gunzip非要认文件扩展名,所以只好先改名加上.gz再解压缩:gunzip -d,然后使用cpio可以看到他的内容:
cpio -i --make-directories < initrd-2.6.14.2.img 需要明白的cpio是一个工具也是一种文件格式了,看到这里实际上就明白了很多关于Initrd了,但是且慢,什么是ramdisk呢? 这里说的很好。 我准备什么时候试验一下,因为我的内存太大了都浪费了。
听到一个消息说日本股市狂泻一千点,这 个似乎是很多人预料中的,只不过人们关心的是他的连锁反应是什么?
越了解linux你就越佩服它的伟大,这真是人类智慧文明的一个巅峰,而这么说的原因是它还在不断的发展与更新。
任何人恐怕都会问这么一个问题,就是kernel的main在哪里?这个是答案, 可是现在要真正理解还差的太远了。
那么另一个人人都要问的问题就是bootstrap怎么回事?这个短篇讲的浅显易懂很适合我的程度, 最重要的不乏幽默让我不至于睡着,不过我才读了一半,回来再读吧。
我越来越讨厌阮次山的原因就是这个人越来越像凤凰卫视党支部书记。马英九不愿意和大陆谈政治协定是天经地义的,中共自己都不知道政权能维持多久,台湾何必 要着急回归?说不定将来统一还可能来自于台湾也不一定,前苏联的垮台是地球人在六十年代七十年代能够预见到的吗?当年肯尼迪执政期间美国人的民意调查都说 未来是属于前苏联的,因为当时苏联的发展速度远远超过美国,很多方面还超越了美国,全世界人民都相信可以打败美国的只有前苏联,结果如何?那个老大帝国从 骨子里都烂了,腐朽是必然的,垮台是时间问题而已。终其原因是制度,核心就是违背了美国独立战争的《常识》,你可以问一下普通中国人苏联人什么是“常 识”,他们回答的都不是发自内心自然而然的认知,而是某个政党为了一己之私或者脱离现实的空想所强制灌输的思想,这和“常识”是根本背道而驰的,因为美利 坚的“常识”产生的环境是一个真正的普通人自然而然的发自内心的:一群殖民者摆脱了欧洲大陆君主专治来到近乎自然的美洲大陆,没有政府没有强力统治,人人 为各自的生存和自然搏斗,在自然而然的环境需要彼此互助,并希望有一个能够维持最低水平的权力机构,比如邮政(这个是一个人人都要的服务却不能拥有暴利又 需要巨大网络的生意,但是早期邮政服务的网店也是人民有偿提供的,所以说在殖民时代人民压根就不需要政府,只有当作为国家有外族入侵才需要抵抗侵略,可是 美国人民足够强大,人人都有自卫手段,独立战争的胜利实际是美国民兵战胜了英国国防军,从此可以看出美国人民远远强过美国政府),巡回法庭(陪审制就是一 个人民自决的模式,法官仅仅维护法庭的秩序,裁决由普通人根据“常识”判断,律师根据证据检查漏洞,依据相似案例平衡强力机构的权力)。“常识”的力量就 在于发自于自然植根于人心不可能永远被压抑迟早要爆发。他的另一个名字叫做“普世价值”,现在又很多政府压根就不承认有什么“普世价值”,借口所谓国情特 殊,中国人有什么特殊的地方吗?
《looper》这部电影肯定是非常愚蠢的编剧创造的,用一句话来形容就是to kill the future to make money。不过future在金融界是有特殊含义的,可能就是“远期”吧,当今实际上大多数政府大多数人都是这么干的,普通人用信用卡按揭,政府靠印钞 票。另一种解释是to kill the loophole cause it is money.你能理解未来的犯罪组织在罪犯身上绑满了金条银块送到今天让人把他杀掉就能获得那些金银,这是什么样的逻辑?当然时间旅行本来就是逻辑的反 叛,这点儿不合逻辑算不了什么,重要的是编剧希望美国国会能够kill the loophole获得金银,这个looper居然不学中文要学法语想去法国,这个是否是作者的另一个质疑:法国不是资本主义,中国是资本主义为什么作为 loophole killer的looper现政府为什么要学法语不学中文?
我一向就讨厌Bruce Willis的装腔作势假装硬汉的样子,他比另一个Will Smith的朴实差多了,总之,这部电影确实很无聊,因为是电影频道免费放映我才用DVR录下来,电影院免费我都不去看,(这里免费的意思是买一张票看一 部以上的电影的意思,因为电影院的大部分放映厅都是在一起无人看守的,除少数票房冠军之外。)
我现在搜索一定都是在登录google的情况下希望它能够从我的搜索中学习人工智能,这也算是我唯一能为人工智能研究所作的努力了吧,这实在是一个无奈的 想法。心跳的厉害,无法自持。去年唯一值得遗憾的是错过了《cloud atlas》在我知道它之后它已经下线了,一定要找机会去看一下。好东西不多在要珍惜每一天。
李克强在巴基斯坦说中国和巴基斯坦的所谓友谊是道义之交任何金钱都无法赎买,难道中国普通人会忘记共产党曾经和多少国家说过类似的话吗?什么同志加兄弟, 越南朝鲜阿尔巴尼亚古巴等等数不胜数,流氓国家之间的道义之交就是这样子的。
颇花了一点时间才明白李克强的所谓的“中印缅孟”经济走廊的真正含义,你不得不佩服现在中国的统治者的一个宏图决心,究竟为什么要把这四个鸟不拉屎的国家 绑在一起干什么?是石油!难道这些国家有石油吗?没有!那么石油从哪里来?伊朗!只要你去google一下或者平时留意新闻就知道中国早已把伊朗的石油通 过巴基斯坦通过输油管到达了海边了,那么如果要修一条输油管线必须要通过印度孟加拉国和缅甸达到云南,这是天方夜谭吗?未必,与其和俄罗斯沙皇讨价还价十 年没有结果不如自己从南亚修一条输油管线,但是这个第一个要解决的就是印度和巴基斯坦的敌对态度,两个邻国连飞机航线都没有怎么可能?当然媒体说不一定要 建输油管,因为可以在巴基斯坦直接炼油,通过这些沿路国家输送,这个似乎是更加容易的做法,因为这些国家自己也需要石油,本身运输就不是问题,各种方式的 运输最终形成一个所谓的“经济走廊”。否则中国独自花钱建设输油管线吃力不讨好还承受沿线政权的威胁,所以是要让这些国家主动来和中国合作。这个宏大的计 划不亚于美国从加拿大阿尔拨他修建纵贯美国的输送管线。那么这个买路钱要花多少?天知道,而且印巴之间能够用钱来解决冲突吗?或许两国政府并不愿意冲突, 而是民意与宗教。印度从自身经济发展的需要石油的必须也许愿意妥协,巴基斯坦现在看来是愿意的,因为这个国家经济陷入困境中国的援助是他们急需的,关键是 印度的态度,缅甸孟加拉国基本上给钱给油就愿意因为也是互利的。
找到了这个网站,看来就在家门口吧?以后可以多看看,不过仔细一看应该早死掉 了。这 个网站似乎给出了更多的信息,因为我现在感兴趣的是LILO部分。
我不小心在主机上安装了firmware,然后重启虚拟机就出错了,当然我在虚拟机上也作了同样的事情,现在只能祈祷重启主机解决这个问题!
我真的是迟钝,居然没有明白grub是怎么产生的:/etc/grub.d/下面是模板,但是真正的参数是在/etc/default/grub里面定义 的啊,所以,要让grub显示菜单你要设置里面的GRUB_HIDDEN_TIMEOUT=15否则默认是0自然不会显示了,(错了,应该是这个参数 GRUB_HIDDEN_TIMEOUT_QUIET=false,我觉得我的英文理解力有问题。) 当然在第一次启动失败之后再次启动会自动设定为timeout=-1让你选择内核的项目)。同时我的虚拟机在内核编译后自然是要重新编译了,真是头疼,看 看能不能回到旧的内核重启一下?不过首先我要回复之前安装的firmware。不过转念一想这么做风险太大,如果万一我选择了错误的firmware和内 核的组合无法启动该怎么办呢?还是折腾虚拟机来的安全。主机最好不要再玩这种危险的游戏。
卸载virtualbox使用apt-get就醒了,重新安装我使用的是官网下载的.deb安装包,前提是我安装了dkms,谢天谢地,重新安装 virtualbox就可以启动了,之前的那个找不到pgm不能启动的错误就没有了,这个也许是vbox的bug,也许是我自己改变主机内核未启动造成 的,总之不要再改变主机的内核了,一切都要在虚拟机上。虚拟机我爱你!
我还是不对,启动依然会黑屏,试图用其他的tty一直在等待,(也不是很清楚是否正确,就是要启动display的server设置)总之唯一的办法是重 新编译内核看看有没有效果。在虚拟机下虽然分配20个cpu依然非常的慢,已经两个多小时了估计还要一两个小时。
试用了airdroid虽然不错但是只能访问sdcard不能访问手机,另外就是传输还是慢,这也不奇怪啊。所以,usb连接还是必要的。

五月二十四日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

也许找到了原因,我最后一个正常启动的版本居然是使用旧kernel的initrd,这个让人非常吃惊,我要验证1.是否是因为我没有执行update- initramfs造成的2.如果是,是什么造成了黑屏?
初步比较以前的initrd和现在膨胀的initrd,最大的差别在drivers部分,同样的驱动新的每个驱动的大小都又差不多大了很多倍,这个可以仔 细检查编译选项和代码。
重新启动发现这个版本是我很老的在虚拟机上更新kernel现在VBoxGuestAddition又要重新编译,没有鼠标的情况下使用Ctrl+Alt +T启动terminal,或者Alt+F2启动任何程序。怎样Mount iso文件呢?
实际上我的grub还是没有正常工作我怎么一直假装他在工作呢?我发现这个东西很麻烦,所以,参考这个做法强行家了一句这样子在 /etc/default/00_header
(当然我要在/etc/default/grub里设置GRUB_HIDDEN_TIMEOUT_QUIET=false
if [ "x${GRUB_HIDDEN_TIMEOUT_QUIET}" = "xfalse" ] ; then
cat << EOF
  set timeout=${GRUB_HIDDEN_TIMEOUT}
EOF
fi
同时我的简单的实验证实了的确是initrd里面的module/driver部分,至少我更新了Initrd就不能重启而是黑屏,也许是显卡部分?
重新实验让人更加迷惑首先不同版本的initrd根本不可能和不同版本的kernel配合启动,这压根儿就不可思议,难道是我眼花了还是虚拟机的问题?再 次好像我的新的Initrd没有问题,让人更加怀疑之前的启动黑屏是vbox的问题,因为当时我正在修改主机的kernel导致虚拟机驱动无法正常,而这 个时候我又作snapshot的删除,vbox报告合并snapshot出现问题,那个很有可能是我把两个硬盘和两个虚拟机混用,组合来组合去,然后这一 切导致了混乱。所以。。。
另一点也很明确了就是initrd增加的部分都是新的驱动,似乎无可厚非,按照某篇文章关于linux kernel的评论也是在抱怨从2.6x升级到3.x版本代码增加的最多的部分就是驱动,维护的困难度肯定是增加了。所以,我应该理解这个是正常的。
查看Initrd可以这样子gzip -dc /boot/initrd | cpio -id 因为gunzip好像不好用。这个是制作initrd的方法:find ./ | cpio -H newc -o > /tmp/myinitrd
gzip /tmp/myinitrd 然后改名就可以了。
eclipse实在是太智能化了,我没有定义宏__KERNEL__,结果就在当前的一个类型的搜索就是报找不到,我亲眼看见才明白这个软件太好了。以前 还遇到说local variable重名我要mark occurrance居然无效,仔细一看才明白是两个不同的local var,自然是太聪明了。
对于device的 major/minor有些不知所云,要再读些内容。
这个是关 于汇编的定义,很有用,因为内核经常有着类似的代码。
怎样编译单独一个module然后部署到kernel?我现在看来没有什么捷径还是要完全编译一遍?除非这个不是在kernel你可以动态加载,那压根就 不是问题。无意义的问题。grub的代码在哪里?为什么autoconf.h的位置被改变到了generated目录下,依赖性是怎么实现的?

五月二十六日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

如果使用make localmodconfig可以显著的减少initrd-img的大小因为它会根据你本机的硬件配置去除很多不必要的驱动,这个很不错的。
启动时按住shift键才能显示grub菜单,我现在还是不清楚怎样强制显示grub菜单?
我要在虚拟机mount -o loop my.iso /mnt/cdrom却报出来unknown files system iso9660,检查modprobe iso9660发现没有,检查/boot/config发现没有设置,所以只好再重新编译内核。
我现在还不是很清除config里的M作为module和*的builtin的区别,是我自己手动加载吗?
虚拟机要改变硬件配置不能在运行状态,也不能是运行状态存盘也不行,一定要关机,这个不是很明显吗?saved状态肯定是只读的,我居然不理解?
内核驱动里面支持我的realtek的无线网卡,我在虚拟机上编译的内核无法设置,也许我必须在主机上先让这个工作才行吧?因为主机升级内核到3.x无线 网卡驱动已经无法工作了,重新编译觉得连配置文件的路径都不对,也许要新版的驱动才行吧?现在只好冒险在主机编译内核把这个驱动先加载在内核?危险的行 动。
在重启英勇就义之前记录下这个不错的关于 Initrd的网页。这个ibm 的解说关于ramdisk很好

五月二十七日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

第一步仅仅是学习怎样编译驱动,这个其实都是最基本的,需要的就是一个kernel source的正确设置,/usr/src/linux-headers-`uname -r`指向的是你的kernel的source,不是仅仅的Include。使用localmodconfig我得到一个比较小的Initrd-img然 而我的无线网卡无法正确安装,重新下载了asus的最新的驱动编译也不行却说module format invalid,反复从kernel里编译加入rtl8192se的module在kernel里似乎都不奏效,最后万般无奈我把我2.6的config 拷贝来重新oldconfig,这一次编译的内核可能是所谓的标准方式吧,initrd-img大了很多倍也许加入了所有通常需要的驱动吧?然后编译 asus的驱动重启就ok了,不知道是怎么回事,需要学习。然后又要重新编译alsa驱动,那个是我下载的万能脚本一条龙服务。编译安装完之后要先运行 alsaconf然后在使用alsa-gnome-mixer调混音。
重新安装alsa驱动,发现/dev/dsp, /dev/snd, /dev/mixer, /dev/midi, /dev/sequencer统统没有了,而检查我的kernel编译oss emulation之类的是有设置,而这里说在10.10 版本的ubuntu把这些屏蔽了。 搜索我的代码下debian.master/config/amd64/config.common.amd64的确没有设置 CONFIG_SND_MIXER_OSS难道这个就是原因吗?我对于内核编译的设置还是不大明白,oss之类的需要内核来模拟是吗?我能不能手动加载模 块呢?如果是,怎么做?
我突然有些明白了,可能这个debian.master的设置是传统的编译为debian的package的设置方法,现在新的做法是用Kconfig来 做的??所以那个是完全无关的东西。
我使用2.6.38的config编译内核然后安装无线网卡驱动可以工作,但是alsa却无法编译安装正确因为/dev/下很多设备没有,当我使用 3.0.x的config编译内核可以正确使用声卡,但是网卡编译出来在modprobe时候报出来Invalid format?两个config的比较也看不出什么门道因为很多区别我也不明白。看来这个还是超出了我的理解力,慢慢来吧。
当你发现菜单不正常了用这个命令重置: gconftool --recursive-unset /apps/panel && killall gnome-panel太好用了。
再一次证明我的无知,一个grub设置折腾了很多天才真正明白,不过这也不能全怪我,因为grub2的wiki说的也不详细啊,比如默认是只有一个操作系 统时候是不显示菜单的,那 么怎样强制呢?让人难以理解的是要把GRUB_HIDDEN_TIMEOUT=后面留空!当然 GRUB_HIDDEN_TIMEOUT_QUIET=false是要的了。
grub启动的背景是和菜单显示联系在一起的,不是我所期望的单独的特性。那么grub是否是kernel代码的一部分呢?

五月二十九日 现在需要的是集聚能量,也许我需要学习encryption而不是encoding

这个网站值得一读,尤其对于如我一样的入门 者。下 载了入门教材,但是Helloworld的例子我都不知道要怎么编译,也许2.2-2.4版的内核和现在3.x差别太大了。
这个是linux device driver的一书的作者个人网站,有不 少的东西下载。
编 译Module的例子,需要再思考一下!关键在于-C这个开关要求你执行命令前到那个kernel src的build的目录下,而编译的核心在于modules这个target,而你仅仅需要定义obj-m,这个脚本是所有的玄机所在: scripts/Makefile.modpost
而ifeq ("$(origin C)", "command line")是一个很重要的东西,就是你要在定义M=$PWD才能保证它来自于命令行,以下就是一个最简单的makefile:
obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd) 
all:
    $(MAKE) -C $(KDIR) M=$(PWD) modules 
clean:
    $(MAKE) -C $(KDIR) M=$(PWD) clean
对于eclipse来说,编译内核的工程不同于普通工程,最简单的是使用makefile来做。
内核工具的一个是在scripts/mod/modpost.c,这个代码就是脚本利用到的modpost小工具。module的编译的神秘面纱露出了一 个小脚。
很好的文章

五月三十日 现在需要的是熟悉内核开发

一个最基本的概念就是Insmod实际上在作类似Linker的角色,就是resolve所有的用到的kernel的symbol,而这个global public symbol table在哪里呢?/proc/kallsyms  在proc下又很多的信息,bus就列出了所有的bus,而那个self下的Mountinfo有所有的mount的信息。/proc/modules有 引用计数。
在编译内核的最后使用ld -r并不是链接,根据ldd2的说法这个是制作relocable的过程。
我突然心血来潮把我的古老的Amazon Kindle拿出来想在太阳光下看看书,结果报出来unknown file system vfat,略一沉吟(就是google了)就明起所以:因为我编译内核的时候没有把fat/ntfs/msdos之类的作为内核编译在文件系统,现在我有 两个简单的办法,(重新编译到built-in内核不予考虑),我要编成lkm(loadable kernel module),一个是模仿Helloworld编译做一个简单的makefile定义obj-m为那几个.o,然后命令参数-C 'kerneldir' M=$PWD modules,这个要改makefile,我决定简单的重新config,使用menuconfig,然后make modules,准备在insmod。不过这个不行,因为kernel的版本比当前的提高了。按照我的理解moduleversion如果enable的 话是会把版本号写在一个什么.modver之类的section里,因此用拷贝文件到/lib/module/currentrelease下肯定是不行 的,看来只有重新部署内核了。又一次冒险。这里有一些好的 信息,还没有来的及细读。
安装完fat32/ntfs之类的内核链接kindle依然有错报出来codepage437找不到之类的错误,略一沉吟发现是我没有安装fs下面的 nativelangeuagesupport(NLS的一些codepage)。只好再次重新编译内核,(等我比较熟练了再考虑单独编译内核加载,现在 还是完全编译全新内核)
检查dmesg发现我的无线网卡报错说firmware没有load之类的,是否我要firmware_install? rtl8192ce:rtl92c_init_sw_vars():<0-0> Failed to request firmware!
比较asus提供的wifi驱动,我看到他的firmware的版本有些选择:
    if (IS_VENDOR_UMC_A_CUT(rtlhal->version) && !IS_92C_SERIAL(rtlhal->version))
        fw_name = "rtlwifi/rtl8192cfwU.bin";
    else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version))
        fw_name = "rtlwifi/rtl8192cfwU_B.bin";
    else
        fw_name = rtlpriv->cfg->fw_name;
不过我搜索内核的代码设置发现它也是设置firmware名字为fw_name = "rtlwifi/rtl8192cfw.bin",那么找不到firmware的理由似乎是需要那两个特别版的firmware,这个纯粹是硬件厂商使 用不同芯片的批次不同的问题,实在是可恶。不过,让我重启一遍看看再作定夺。不过asus的驱动似乎也还是和内核代码差别挺大的吧?不如就用他们的吧?不 过我已经把他编译到内核的built-in了,是否需要我剔除重新编译呢?试验一遍吧?
现在准备把realtek的wifi的驱动从内核剔除,然后再编译asus的驱动看看。果然是这样子的,wifi的驱动还是需要厂家的,至少我觉得 linux3.0的内核压根就没有带firmware,难道realtek的firmware可以使用别家的代替?那些都是bin的,不理解。总之,我现 在总算把alsa和wifi的驱动正确安装上了,也算是有点成就了。(入门级的水平就是Make/install)
想要尝试把我的显卡驱动也更新一下,不过为了以防万一先安装一个类似于光盘启动的选项:/etc/grub.d/40_custom的内容我这样子就不用 光驱了。
menuentry "Ubuntu 10.04 ISO" {
set isofile="/media/ubuntu-10.04-amd64.iso"
loopback loop (hd0,1)$isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
initrd (loop)/casper/initrd.lz
}
然而这个菜单一直出错报出来找不到文件要先Load kernel之类的,花了我两个多小时才找到原因,我一直以为是iso文件找不到,或者是我的iso文件corrupt了,或者是磁盘的位置不对,或者路 径不对,最后联想到我用ubuntu12的iso就可以,而ubuntu10.04和ubuntu11都不行才意识到一定别有原因,因为菜单都一样,肯定 不是Iso文件的问题,于是把iso mount到tmp下一看发现ubuntu10.04的iso的/casper下是vmlinuz而不是像ubuntu12的vmlinuz.efi,真 的是让人哭笑不得。我之前google的很多现象其实大部分是grub和grub2的问题,就是grub2把磁盘分区改成了从1开始而不是之前的从0开 始。
显卡的错误信息是[drm:evergreen_startup] *ERROR* Failed to load firmware!看代码应该是在找CAICOS的firmware,因此我需要CAICOS_pfp.bin,这个要到哪里去找呢?evergreen 是个什么东西?
google之后evergreen好像是显卡的代号吧?这 里有一个驱动的安装,试验一下。下 载amd的catalyst。安装后在/usr/share/ati下的log发现他按装了一个fglrx.ko的内核模块。安装之后现在基本模 式下运行,需要运行aticonfig来设置高级模式,先启动看看。
重启之后,我觉得已经可以满足了因为我的显卡已经至少在基本模式下运行了。modprobe --list看到了/lib/modules/3.0.69+/updates/dkms/fglrx.ko而aticonfig非常的复杂,我还是放一 放吧。至此我已经解决了我的声卡网卡显卡的基本问题,下一步安装一些虚拟机吧。
决定下载raspberry的arch linux的image来 安装虚拟机。raspberryPI的img是两个partition的dd后的image,这个大 虾说明了怎么Mount,很好。核心就是mount不懂得怎样对付两个partition。所以先用file命令得到细节,比如每个 Partition的起始位置,(sector乘以512得到偏移)
mkdir /mnt/img1
mount -t vfat -o loop,offset=4194304 /tmp/rpi/2012-12-16-wheezy-raspbian.img /mnt/img1/
mkdir /mnt/img2
mount -t ext4 -o loop,offset=62914560 /tmp/rpi/2012-12-16-wheezy-raspbian.img /mnt/img2/

这个地方说了怎样编译raspberry, 很好,准备尝试。
如果你想知道所有的Mount的信息,可以查看/proc/self/mountinfo
第 一次听说uefi启动系统,学习中。
linux device driver3的代码网站是这里,这里给 出了很多有用的链接。这里是在线版。讲老实话, ldd3对于我来说有些困难,因为大部分代码是基于kernel2.2/2.4/2.6版本的,在现在的3.x版本下基本很难编译,而无法实验在我看来就 是屠龙术,只能参考,所以我不如先看一些其他的书,这个kernel module development其 实很实用,首先,modprobe/lsmod的信息怎么来的呢?是/proc/modules,而通过查看/etc/modprobe.d/下面的配置 文件让人猜到这个是每一个module的所谓的loading的配置文件,比如我碰巧看到把所有的oss的module禁用的配置文件。这里讲到 insmod和modprobe的区别就一目了然,因为之前我使用Insmod加载模块始终报出来错误说找不到,而modprobe/lsmod都清清楚 楚列明了,这里就说的很清除,因为insmod很dumb基本连/lib/modules/`uname -r`的路径也不知道一切都需要列明,而Modprobe则不单知道还知道查询modules.dep去加载depended的modules。说的真好 啊。这里是在线版本
有一个小的不能再小的细节,在makefile里面obj-m命名的module名字是任意的,你应该给你的Module起个好名字,而你会用这个名字来 说明有哪些.o文件要编译,比如 obj-m := mymodule.o   mymodule-objs += 1.o 2.o 3.o
我在猜想/etc/ld.so.conf.d/下面是动态库加载的运行期搜索目录?还没有google到。
strace可以查看所有的syscall
遇到一个简单的东西,就是在编译内核的Module时候#include <linux/kernel.h>之前不要Include任何头文件,因为好像会被undef掉,具体什么原因我不清楚,比如我 include <linux/version.h>就没有了,必须放在kernel.h的后面。另一个问题现在还没有答案,就是User side的/usr/include/linux这个到底是谁安装的?和实际内核差别很大是否需要及时更新?还是说这个是User lib无须和内核一致?因为哪里的linux/version.h和实际的不同。

六月三日 现在需要的是熟悉内核开发

内核编译的一个选项是isoimage这个可以作为应急光盘的启动,不过我还不知道能不能也作成grub的启动选项。在eclipse里使用 makefile project来编译kernel/module但是indexer没有设置搜索路径可以在c/c++ general的path/symbol里,以前我一直以为这个general是所有工程的公选项目怕影响到其他工程的设置。eclipse里最酷而我以 前不知道的一个就是ctrl+shift+R查找文件,我以前在project explorer里脱鼠标实在是太笨了。
__attribute((used))__强制编译链接哪怕Unreferenced。
PIC stands for Programmable Interrupt Controller and PIT stands for Programmable Interval Timer. 我无意去探索汇编的细节,但是概念要有。
正在学习怎样用ramdisk启动,需要 squashfs,现在感觉编译内核模块是家常便饭了。现在虚拟机上实验再说。
奇妙的chroot!制作一个全新的 initrd-img的要诀,把现在的Host的dev和proc以及/etc/resolv.conf之类的网络信息加入,当然系统升级是好的选项。
linux真的是奇妙无比的珍宝啊!许多闻所未闻想所未想的事情都被前人做好了,我辈单单领悟都来不及,只能说自己太无知太浅薄,我对于我的选择感到十分 幸运,否则我还是在烂泥滩上沾沾自喜,一个人的不满足和满足就是矛盾体,在生活上也许容易满足让人容易快乐,但在求知/求职上容易满足使人容易堕落。
在摸索中迷茫,得到的越多却感觉越迷惑,看到的越多就越不知所措,需要有一个前进的目标和方向。

六月四日 现在需要的是熟悉内核开发

阅读赵 炯博士写的关于Linux的 发展简史,很有意思,真实让人热血沸腾的年代,十月五日,我现在知道它有特别的含义了。一个人衰老的一个特征就是开始回忆过去,开始佩服自己的过去,因为 你已经成为了另外的一个人,一个老人。女人天性喜欢繁殖后代除了基因自然选择造成以外应该还和她们对于自身缺憾的认识,总希望在来世得到改进,无形中成就 了人类的进化。在gnome-terminal里可以设置不同的charset,比如中文,因此你可以用cat查看中文文档,但是怎样使用 less/vim之类的打开中文文件呢?
安装Ubuntu 10.04 server在virtualbox做实验,结果发现text scroll非常的慢,找到这个办法禁止framebuffer在 vga16模式下,就是在模块加载时候禁止掉,太棒了!
有时候觉得不知道为什么,因为安装了server版却同样需要安装图形界面,比 如没有Indicator就别扭
这个网站我觉得很有意思赵博士在这里有大量的资料
在中国民意是不足虑的,于是所谓的精英领袖们整天在揣测日本美国的民意以作为自己施政的佐证。

六月五日 现在需要的是熟悉内核开发

at&t汇编在内核代码用的太多了,gnu的嵌入式汇编是无法回避的,必须的花一点时间学一个大概。
关于汇编这个写的内容肯定是非常的有用,但 是格式可能是拷贝的原因太不好看了,想再找一个看看,找到了这个pdf版本。 不过可能现阶段我看 这个就够了,我毫无意愿精通汇编,只是作为读代码的帮助而已。

六月六日 现在需要的是熟悉内核开发

阅读赵博士的注解获益匪浅,关于Makefile没有人解说实际上是很困难的,大多数程序员都不是makefile的专家,一知半解很多时候够用了,但是 真的让你写一个好用的就都不行了。我想起来以前他们写cd xxx;make没有正常执行的问题,难道是需要加挂号?还有就是".c.s:"居然代表了源是.c,目标是.s,这个我真的是第一次知道这么强大的东 西,当然cc -c -o $*.o $<是知道的,不过让我自己写还是挺困难的。
据说熬吧吗晚上来圣何塞筹钱,这个小子夸夸其谈的厉害。
这个短 篇还是很有帮助的,有了一个大致的概念,不过对于内存映射我不是很清楚,串口看来很重要,要多加注意。
昨天看了<after earth>觉得还是不错的,至少从科幻片的角度来看是今年看到的最好的片子,比<Oblivion>来的好的地方是有些新技术的成 分。今年好莱坞撞片很厉害,年初的攻占白宫绑架奥巴马的片子过两个月又要来一遍,看来普通美国人都非常恨这个总统希望它被恐怖分子消灭,而且不止一次。 (希望FBI不要因为这个言论就把我抓起来,现在美国的反恐已经草木皆兵了)而这个Will Smith的主导的片子(不是他儿子吗?我说错了吗?你看看最后剧本不是他写的,可是story是从Will Smith来的,这个是他当父亲的给他儿子搭桥进入好莱坞的大投资,全美国没有几个人能做到的)和汤姆克鲁斯的独角戏类似,这个也是一个独角戏,也是在地 球遭受浩劫之后的环境,两部电影是不是有惊人的相似?好莱坞的大片越来越依赖于电脑动画,连演员都不怎么要了,只要一两个主角,其他都是可有可无的。不过 这部电影最大的看点是给美国陆军指明了今后特种作战的模式,那就是指挥官在控制室里的遥控战争,而能够做到这一点就是依靠各种各样的传感器drone,通 讯设备,而作战的主体实际上最理想的不是军人而是机器人,因为从负重维护的角度来看人都是过于昂贵的。目前美军正在全力想这个方向发展,各种各样的智能设 备的前景是无限的,所以要认认真真的学习嵌入式系统。加油!
复习80x86实模和保护模式,不过都是浮光掠影,主要目的是熟悉Intel的寄存器方便读汇编,而内存管理应该变化不多,分页机制需要结合寄存器来理 解。现在读的时候会经常想起大学操作系统课程教授的话,才有了比较深刻的理解,当时很大的一个缺陷就是以为很多是软件的机制,实际上操作系统是一个和硬件 cpu紧密结合的产物,很多时候是互动,这就是为什么wintel联盟的道理,没有cpu的硬件机制很多os的特性是很难实现,或者根本不可能。
奥巴马可能就在离我一英里的酒店下榻,结果一晚上都是战斗机在飞,吵死了。

六月七日 现在需要的是熟悉内核开发

看Linux0.11版的代码还是挺有意思的,因为要比现在的简单的多,就是文件少很多,否则我完全不敢想象一个人怎么可能写一个操作系统,比如 printk其实就没有考虑buffer溢出的问题,那个时代不可能让一个搭建框架的人去分神追求完美。看看3.x的vprintf的实现就知道了,非常 的复杂,完全超过了我的理解力。
也许是我错了,不过我觉得linus当初在0.11版的文件处理上有一个小小的瑕疵,当然在还没有正式发行的时候这个是完全不重要的一个东西,作为任何人 都不会去费力实现的,就是close_on_exec,说老实话我自己还从来不知道他的存在和用途,直到看代码遇到才google明白有这个用途,比如这 位大 虾用popen遇到的问题, 这个是我从来没有想过的,子进程里你不希望继续打开的文件句柄就有这个用途了。在0.11版处理比较简单,就是open的时候current-> close_on_exec &= ~(1<<fd); 可是为什么在exec的时候检查是if ((current->close_on_exec>>i)&1)这两个等同吗?linus自己的注解其实也说了好像是只要低 位有就行,我的感觉是当时先凑活用,不过也很可能我看不懂这个位操作,总之比较费解。我就看看3.x的实现,马上我就被吓坏了,不仅在kernel3.x 的同步操作非常的吓人,一大堆的spinlock还有什么rcXXXX之类的看不懂的东西,单单文件的descriptor的位就改了很多,现在是一个大 的结构大概是1024/sizeof(ulong)=32的数组,总的来说3.x的代码肯定是一个句柄一个bit的概念吧?但是我有个疑问就是一个文件最 多能够被同时打开的数目,0.11版hardcoded为20,3.x版本是初始化的时候检查这个1024/sizeof(struct file)的大小,但是分配文件flag的数组却还是1024/sizeof(ulong)的一个常数,总的来说肯定不会错,因为不可能说未来的版本 struct file会反而变小,只可能变大,所以肯定没有什么错,只不过浪费就是了。鸡蛋里面挑骨头,不写代码的人总能找出别人实现的代码的所谓的“瑕疵”。偶然发 现eclipse有保存之前搜索的结果,真的让人太佩服了,eclipse简直让我叹服的五体投地,没有做不到只有想不到。
终于找到了系统的祖先init,其实原本早就知道这个,只是没有概念,看第一行代码看到dup(0);dup(0);了两次摸不着头脑,还是看赵博士的注 解才恍然是stdout/stderr,当然现在也就明白所有的进程的祖先第一个打开的就是一个tty设备并且是fd=0的著名的stdin,一切原来都 是这样子的,当年教授讲授console/tty之类的时候我要么是在睡觉要么是迟到了,总之从来都没有什么概念,现如今才明白在电传打字机时代的外设在 今天os里的体现是怎样的,当然看tty/ptty之类的实现也就明白了这种低速设备原本只是对应于人类的首输入的慢速,也就明白了为什么在paypal 的redhat5老是有远程console溢出的问题,就是一旦屏幕输出log太快就出错的原因大概就是在tty之类的内部buffer溢出了,它内部是 一个固定大小的list的一系列的所谓的结构吧。总之,我安心了。

六月八日 现在需要的是熟悉内核开发

以前只是听说过test&set的指令,昨天查询文件操作才发现现在3.x的代码同步部分写的很多,最后的操作部分用的指令是这 些个bts
看了wiki才想起了这些指令, cli/sti,以前好像也用过一次。
path 的设置。 下载了bochs-2.6编译安装,因为不知道为什么我从官方的ubuntu的2.4版运行有问题,也许是我不懂得怎么配置,然后使用赵博士安装包里的 Linux0.11的启动image从软驱a指向一个grubdos.img成功启动了进入了shell界面,可以想想当初是多么令人机动的时刻,一个伟 大的梦想就实现了,我想linus本人当初肯定也没有想到他有着这么的伟大,开创了一代人。配置bochs时候颇令人疑惑了许久,我编译了Usb/pci 等等可是配置文件始终报错,编译使用svga结果配置里的vga选项都报错,最后只好全部注释掉。不过,按照赵博士的说法bochs很独特因为他是一个真 正的软件模拟x86,这个和vmware之类的不同因为后者是为了效率的考虑使用了主机的硬件,这一点virtualbox/virtualpc是介于两 者之间,部分模拟了硬件。因此从性能上说肯定是vmware之类的最好,但是从我的希望来看从软件模拟的虚拟机可能对于开发调试更有用,因此,今天花时间 学习尝试使用bochs是绝对值得的工具。开发=环境+调试+代码。我至少在这十几天里有了一些环境工具的积累,接下去就是一大堆的电子书的阅读实践。总 之,linux内核代码是绝对值得阅读的,只不过痴心妄想通读一遍不但傻而且狂妄的可笑,我虽然傻但还不至于狂妄,不过阅读0.11版却绝对不是绝对不可 能的,而且每个人读代码的目的都是不一样的,有些人是为了验证想法,有的人是为了寻找方法途径,有的人是为了学习技巧,还有的人就是纯粹好奇,现在我至少 对于fork/exec/clone之类的有了一些认识。正想某位大虾说的,学校里的教授大多花了大部分时间讲scheduler的调度算法,因为从学院 派角度来看只有这部分才有研究的价值,可是从工程技术的角度来看大部分的工作都是i/o,所谓驱动部分就是现在内核代码膨胀的最主要来源,驱动的核心就是 内核和设备的通讯或者说某种类型的i/o,这个学校里是不屑于教授的,因为太实际了。
看到新闻里说厦门的BRT的惨剧,真让人怅惘,人生除了杯具就剩下餐具了,一个厦门土生土长的市民因为低保的争执而不惜出此下策是全社会的悲剧缩影。我非 常喜欢作BRT,因为快捷廉价舒适,当然上下班高峰期除外,可是乘坐BRT的大都是社会最底层的孜孜以求的普通人,一个对社会不满的人却不去炸市政府却来 伤害和他一样甚至比他还不幸的同类人这才是更加让人感到悲伤的人物,鲁迅当年笔下的中国人大抵如此,我虽然没有资格去责备这些可悲的人物,因为包括我们每 一个人都是这个社会的或多或少的受害者,可是最让人痛心的是他们却并不了解他们自身悲惨命运的真正原因,却把报复心用错在比他还要可怜的人们身上。也许他 只是觉得市政府保安严密,而大众捷运的BRT容易得手又能伤害更多引起更大的关注罢了,这两天santa monica学院也死了几个人,san jose/milpita也都有杀人案,每个社会都有它难以解决的矛盾与危机。
关于bochs一定要去看手册,2.6.2 的配置改了很多,关于制作磁盘就是使用dd,磁盘的大小的计算是cylinder*heads*SPT=sectors,这个是dd的sector参数。 heads不能超过16,另外memory设置以前版本又bug,host=32不会自己更新,最大4096,guest=2048是最大了。

六月九日 现在需要的是熟悉内核开发

这 里解释的制作iso的过程很费解, 而且年代久远也不知道有那些已经过时或者有更好的工具方法,不过他说的很详细需要花时间来理解验证。这个东西很重要在于我对于linux的boot的真正 的过程依然不是很清楚,原来的两阶段boot我理解概念,可是现在冒出了一个isolinux,究竟和grub/lilo的关系是怎样的呢?我的理解是 grub/lilo先把ioslinux load起来,这个是完全为了启动iso这类的文件的,如果不是的话,压根就不需要,可以直接用ramdisk把Initrd load到内存,但是关于cdrom如果要建立设备可能很不容易,所以。。。看了半天还是不太理解。系统的启动绝对不是一个简单的过程。
kernel的target有一个isoimage我怎么都没有理解,产生的image.iso经过mount发现就只有一个isolinux.bin以 及一个从bzimage之类的软驱镜像来的改名为linux的文件,(应该是所有类型的镜像最后都改名为linux,所以isolinux.cfg都默认 运行linux命令)但是Initrd之类的为什么没有包含呢?启动总是报说找不到root文件。盯着傻看了一两个小时才明白,你要自己把Initrd作 为参数传进去,否则怎么会白痴到自己手动去制作iso?这个方法我都看了半天了只是不相信要我自己手动去做,比如先用mkisofs创建(大概dd也可 以,不过我怎么知道大小呢?所以还是mkisofs),然后还要growisofs之类的一个个添加文件到iso里。所以,这个是不可能的。)
于是现在就又回到了制作initrd的流程,我并不想要安装,所以不用update-initramfs的脚本,只需要调用low-level的 mkinitramfs的脚本,这个需要一个参数版本号,否则默认用当前系统的,看了挤眼代码明白不过是在/lib/modules下的镜像(这个问题我 前两个星期就明白了,不是吗?)因为要让一个脚本试图搞明白你的kernel启动时候到底要那些module和文件系统初始化的部分肯定是太过复杂了,所 以,这个脚本是很简单的。
alsa安装的先决条件:
sudo apt-get -y install bzip2 build-essential module-assistant libsysfs-dev libncurses5-dev libncursesw5-dev gettext python-dev xmlto libpulse0 libpulse-dev libspeex-dev libavcodec-dev \
libavformat-dev libavutil-dev libmpeg4ip-dev liba52-0.7.4-dev libsamplerate0-dev libfltk1.1-dev

我觉得这就是一个教训我付出了差不多一整天的时间,宝贵的时间都浪费了。我大概是改动了什么内核的配置,然后编译却仅仅为了测试而安装了modules却 懒得安装内核,结果我重新反复编译alsa就是莫名其妙的错误,连基本的amixer都报错,gdb了半天才看出一点端倪,就是代码有些不合逻辑,觉得有 可能是整个编译链接的东西不一致,在重新部署内核声卡自动就工作了。这个对我来说简直就是自己折磨自己。我早晨要找的东西跟alsa完全无关,我原本是要 实践我编译的iso镜像的启动,可是遇到Usb驱动在虚拟机上启动失败,我就尝试安装virtualbox的expansion package结果安装不一致的版本导致整个系统崩溃,然后不知道怎么就流落了三千里地跑去折腾alsa,真是一塌糊涂。现在好了又要重新编译网卡驱动, 看样子内核模块是非常的严格,只要又任何的配置的改动就需要重新编译内核驱动,这个dkms是怎么工作的?没有用吗?啊,想起来了我的无线网卡在内核的原 有模块的代码和asus提供的又不少的差别,它是完全覆盖内核原有的模块的,我肯定要去重新编译安装无线网卡的驱动的,这个完全没有什么奇怪的!
asus提供的makefile有一个小小的瑕疵,就是安装内核模块目录/lib/modules/3.0.69+ /kernel/drivers/net/wireless里的wireless其实并没有创建就导致失败,每次我都要手动创建,所以只好稍稍修改 Makefile加上一个强制创建的命令。呵呵,这也号称是bugfix?
好了网卡驱动也搞好了。现在看看虚拟机是否动态模块也需要重新编译,可是为什么我的内核版本就始终是3.0.69+不变?难道我需要自己定义什么才能增 长?
可怜哪,我刚刚想投机尝试虚拟机不卸载,结果启动就全死了,我想应该不是内核崩溃,Linux现在是很稳定,但很可能是我错误安装expansion package把usb驱动高丝了,而我的键盘鼠标都是usb的,这个也是悲哀,但凡我用的是老式的键盘鼠标,但凡有一个是ps2的我就能够另开一个 tty来操作,可是两个都是usb只有reset power一条路了。卸载virtualbox一定要遵循的步骤是从apt-get purge virtualbox-4.2,然后安装从官网下载的.deb,因为ubuntu的官网的标准安装包有问题。dkms之类的模块总是不能卸载干净。升级内 核切切要记住重新安装虚拟机。
可怜又一次低估了虚拟机的问题,看来不是重新编译就能解决的,是我制作的镜像启动时候搞死了usb,实验其他配置看看。所以,virtualbox这类虚 拟机就是很讨厌,因为性能的需求使用的是主机的硬件,不是软件模拟,所以也可以搞死主机,作为用户软件开发是很好的平台,但是作为驱动内核之类的就未必 了,看来还是要用bochs来,虽然很慢不成熟,但总比这种死机要强啊。看来是配置里的usb的filter设置了就导致死机。当机重启现在好像alsa 的配置又丢失了。真是好烦啊。
看来我的alsa的问题不是驱动而是配置,因为有三个声卡设备,我的oxygen声卡并不总是被当作default设备,主板上的没有用的hdmi声卡有 时候被加载到card 0的位置,这 里介绍的方法可 以尝试一下。在/etc/modprobe.d/下面的任何.conf都会被作为内核模块加载的配置,所以我在/etc/modprobe.d/alsa -base.conf加了一个options  snd_oxygen index=0来强制这个加载为默认声卡。
果不其然,声卡配置正确!yay!现在我觉得对于linux系统的了解每天都在加深,长此以往必有小成。
我心里一直耿耿于怀的是关于gcc的安装,当时我为了编译cpu的高级指令使用了当时的最新版4.7却不知道gnu的规矩是单数为开发版,双数才是稳定发 行版,现在4.8版出现了是否需要更新呢?这个真是让人头疼的事情。先放一放吧,或者现在虚拟机上试验一下。
接着早上的实验,首先编译当前内核的Initrd: mkinitramfs -o initrd.img -v `make kernelrelease`
然后制作iso镜像:make FDINITRD=./initrd.img isoimage
生成的镜像是: arch/x86/boot/image.iso
现在看看这个在虚拟机上启动是否成功?
我发现我的内核配置是usbhid是编译成模块,改成built-in实验一下。
又要重新编译alsa,为什么usb是它的依赖呢?真不明白内核模块难道没有依赖性的检查?也许只适用于动态模块?built-in必须重新编译?真是烦 人呢。现在我三天两头的编译内核,不停地重启,这才感觉是在真正的开始linux的开发实践。哈哈心里总算有些自我安慰。不过好在alsa安装并不会改变 /etc/modprobe.d/alsa_base.conf的内容,这个是由alsaconf产生的,我不要再重新配置了。
TNND,alsa真的好烦,发现简单重新编译好像不行,还是在dmesg里看到什么奇怪的什么snd: no symbol version for sound_class, 没有办法只好运行alsa脚本-x删除所有重新下载编译安装,真的好烦人啊,晚上还能吃上晚饭吗?
我觉得很没有道理因为alsa脚本的编译之前是有工作make clean,难道删除代码才有效?奥,看到cleanup 脚本是有删除package代码,也许安装前要先卸载?这个内核驱动吗?如果是User mode库干吗要重新编译?我现在的问题是内核根本就无法加载声卡驱动。再重启看看是不是有什么偶然因素。
我怀疑原因是module的versionmagic有问题,但是我使用modprobe --force-vermagic也不起作用。然后想解决我的这个长久的问题,就是kernelrelease 和kernelversion的不同。 准确的说应该是版本号有个+,看看我设定localversion能否起作用。又要重编内核,真是变态啊。我就注释了那断代码,并且 localversion不设定,手动在Makefile的extraversion加上我自己的版本号,这样子kernelrelease和 kernelversion一致了。但是我的/usr/include/linux/version.h还是最早安装的2.6.32版本这个会有影响吗? 我要怎样升级,难道要改变软连接指向当前版本?就是整个linux作成软链接指向内核代码头文件?看 来是应该的,只不过为什么kernel安装脚本不会帮我们作,而要手动,而且/usr/src下面也没有作。
改动内核版本号对于alsa有效,现在要重新编译显卡驱动了。

六月十日 现在需要的是熟悉内核开发

我现在猜想我是有一个愚蠢的想法,说愚蠢是因为每天都看到的东西你就想当然也就不会去想它是怎么来的如果没有会怎么样,这就是常人的司空见惯,很多的错误 都来自于这种视而不见,而更加愚蠢的就是一叶障目或者掩耳盗铃的主动不承认现实。总之,我的基本概念不清楚,也想当然的以为linux的正常启动和第一次 安装的本质的不同。这是一个三岁小孩子都知道的常识,你每次启动电脑难道是要创建你的整个的文件系统吗?但是第一次启动是要安装整个文件系统的,这个 root文件系统怎么来的?自己制作cpio但是要怎么Mount呢?这一系列的问题都不清除,怎么安装系统?这 里讲了一个大概,只是一些原理,真正实践还很远。 而在这之前我遇到的错误并非无意义,那个是在正常系统启动都会失败的问题,就是我的某些module没有加载,从iso光盘启动和从硬盘启动的差别还是挺 大的。也许应该先尝试制作仅仅是能够从已安装系统的光盘启动模式,大概就是rescue光盘之类,这个有很多现成的工具,这个会更容易一些。
这个是一些有趣的数据,可以作为以后购买ssd的参考:(sda: 120G OCZ agility3)(sdb: 30G Kingston SSDNow) (sdc: 240G OCZ agility3)(sdd: 2T   ST2000DL004)(sde: 120G MKNSSDCR120)
从这你可以看到我花了那么多钱买的所谓的SSD还不如最普通的硬盘呢!!难道是linux的驱动的问题?
nick@nick-server64:~/Downloads/linux$ sudo hdparm -tT /dev/{sd*,sg*}
[sudo] password for nick:

/dev/sda:
 Timing cached reads:   7166 MB in  2.00 seconds = 3586.31 MB/sec
 Timing buffered disk reads:  506 MB in  3.00 seconds = 168.64 MB/sec

/dev/sda1:
 Timing cached reads:   7094 MB in  2.00 seconds = 3549.67 MB/sec
 Timing buffered disk reads:  508 MB in  3.01 seconds = 168.90 MB/sec

/dev/sdb:
 Timing cached reads:   7162 MB in  2.00 seconds = 3584.57 MB/sec
 Timing buffered disk reads:  398 MB in  3.00 seconds = 132.53 MB/sec

/dev/sdb1:
 Timing cached reads:   7102 MB in  2.00 seconds = 3553.87 MB/sec
 Timing buffered disk reads:  342 MB in  3.01 seconds = 113.67 MB/sec    Kingston is the worst and this was bought several years ago in China! It is a sham!

/dev/sdc:
 Timing cached reads:   7184 MB in  2.00 seconds = 3594.97 MB/sec
 Timing buffered disk reads:  700 MB in  3.00 seconds = 233.25 MB/sec

/dev/sdc1:
 Timing cached reads:   7026 MB in  2.00 seconds = 3515.39 MB/sec
 Timing buffered disk reads:  688 MB in  3.00 seconds = 228.99 MB/sec    OCZ is the champion! (I think this is actually Agility4 instead of 3)

/dev/sdd:
 Timing cached reads:   7070 MB in  2.00 seconds = 3537.71 MB/sec
 Timing buffered disk reads:  398 MB in  3.01 seconds = 132.12 MB/sec   

/dev/sde:
 Timing cached reads:   7076 MB in  2.00 seconds = 3540.78 MB/sec
 Timing buffered disk reads:  458 MB in  3.01 seconds = 151.96 MB/sec

/dev/sde1:
 Timing cached reads:   7022 MB in  2.00 seconds = 3513.65 MB/sec
 Timing buffered disk reads:  534 MB in  3.01 seconds = 177.46 MB/sec

这 篇文章给了一些帮助,也许可以先从nfs尝试,这个比iso来的简单。关于initramfs的制作,这里列举了四 种方法。不过我实际操作才意识到究竟哪些目录是需要的是一个问题,比如proc,sys之类的都不是你创建的,这个和你作系统备份时候差不多,你 不需要备份这些目录。mkinitcpio这 个工具也许有些用途,不过kernel自带的脚本工具其实已经够用了?
这里讲 述了Livecd的制作,希望能够了解一个端倪。

六月十一日 现在需要的是熟悉内核开发

我自己编译的内核版本号没有加-并且别出心裁用日期作expansion号,结果glic说内核号的小号不得超过255,或者自己加上前缀“-”才行,看 来又要重编内核了,真实头疼了。重新配置内核,胡乱挑了很多自己也不明白的驱动都编译到内核,反正现在不再panic,大不了重启到低版本重新编译内核。 总之,没什么号好害怕的了。我的内核版本号现在改成了小号100加“-”前缀。chroot很奇妙的,怎样把当前设备“映射到”chroot的地方呢?在 debootstrap的文档里有这么一个简单的例子,就是你现在chroot里面的/etc/fstab里面设定你要mount的东西:mount proc /sid-root/proc -t proc    和 mount sysfs /sid-root/sys -t sysfs 为了能够使用网络和apt,你要加上cp /etc/hosts /sid-root/etc/hosts 然后你就可以进入你自己的营造的小世界了,难怪这个命令这么危险,试验一下。
当你试图chroot的时候如果报错说找不到/bin/bash的时候,你很可能并不是没有拷贝或者link你的bash到你的chroot的目录里,而 是bash依赖的lib没有到位,用ldd /bin/bash就知道他需要lib和lib64下的一些库,为了避免拷贝你可以使用mount --bind来link所有的系统目录到你的chroot目录,比如mount --bind /sys /my/chroot/dir/sys,这个对于所有的目录都适用。其实我一直想知道的就是我是否应该把proc和sys下的文件也复制到我要安装的文件 系统?我觉得应该不需要吧,让我成功运行debootstrap看看结果。不过首先要重新编译内核和所有的驱动,真实好烦人呢。我大概是误打误撞把 alsa驱动编译到内核的built-in了所有省却了重新编译的烦恼吧?我是否应当把asus的无线网卡驱动整合到内核呢?这个看来是比较的大胆,说不 定还可以提交到下一个版本的内核,窃取荣耀呢,不要痴心妄想了。grub无法了解哪一个内核是当前的默认选项,只有这个 办法试验一下。这个帖子不灵,正如注释里说的,save的那个选项没有用,只好强制设定index在default。
重新编译安装alsa不行,因为加载alsa的snd_oxygen模块总是报错误,类似与以前的什么minor number不知道。我没有什么主意,只好瞎猜是不是oss驱动被我编译进去就又冲突了,重新编译内核去掉 oss。摸索啊。
重新编译内核就ok了,所以,我的猜想原因可能有两个:1.我没有mrproper删除编译环境,我注意到firmware从不会安装,很有可能是很多模 块编译不正确。2.这个可能性更大,就是oss驱动和alsa的冲突,我甚至记得lucid的编译选项里面曾经又禁用所有oss的开关,总之我在内核里不 编译built-in的oss的驱动之后,lsmod就看到snd-oxygen之类的都又加载,于是经过alsaconf之后重启就可以了。
实际上我刚才花了一个早上仅仅为了实践这个:sudo debootstrap --arch=amd64 lucid ./chroot
其实这个工具并不复杂,仅仅是一个downloader之类的东西,看看代码就明白它是从网站下载你需要的环境,官网可以在配置里面找到: /usr/share/debootstrap/scripts看看你的target是什么?比如lucid的配置是http: //archive.ubuntu.com/ubuntu(这个是官方的镜像网站:http://ftp.us.debian.org/debian) 关于arch和所谓的suite,你不要想当然,看看网站就明白arch没有什么x86-64之类的常用的名字,只有i386和amd64,看这里: http://archive.ubuntu.com/ubuntu/dists/lucid/main/你看看又什么binary的后缀。大概是用那个 官方的package定义下载官方包配置需要的环境。
怎 样设置系统的locale,这个是命令:
export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
locale-gen en_US.UTF-8
dpkg-reconfigure locales
按照这 个教程一步一步做完了,确实能够boot,但是为什么能够我却云里雾里不知所以然。
重新制作chroot遇到错误,删除发现忘记umount,于是到/proc/self/mountinfo去看看有什么地方我mount的。
对于chroot环境的建立我看到两种完全不同的做法,一个是在建立chroot环境时候用mount --bind把真实的proc/sys/pts之类和chroot里的联系起来,另一个做法是在进入到chroot之后把/proc/sys之类的 mount none,这个看起来是两个完全不同的做法,我找不到None这种设备只能猜测就是类似于zero之乐的空设备或者sink之类的,反正你在chroot 的时候并不是真的需要这些proc/sys之类的,只要不包错就醒了,对吗?但是当你用mount --bind的时候却应该是把真实的设备文件复制了一份一样,你在chroot里面瞎搞会影响到Host,对吗?我 对于这问题完全不清楚只能瞎猜,这个回答我也看不懂。

六月十二日 现在需要的是熟悉内核开发

我以前好像也尝试过一次把ubuntu10.04server假装gui但是当时好像不成功,当时cisco的同事在开发新项目逐步从redhat5转向 ubuntu,有人抱怨server版没有gui不方便,我当时也尝试过一把,因为网上说server/desktop的源代码是一样的,仅仅需要加包。 现在看来是对的: sudo aptitude install --no-install-recommends ubuntu-desktop,也许我以前没有把那些recommends禁止所以有些七七八八的东西有问题吧。总之,以后真的可以尝试把开发平台从 desktop转向加装了desktop的server版,因为比较稳定吧,或许有些配置比较安全可靠?
昨天的尝试有很多让我不能理解的,究竟livecd是怎样在ramdisk上运行的,如果是ramdisk的话(我想不出不是ramdisk的可能了,因 为你不碰触原来的系统啊)在flash里运行的系统和在ramdisk里的系统有区别吗?或者说在系统看来flash是内存还是磁盘?这些基本概念我始终 没有,对于内核里的驱动很多选项都是和flash/rom之类的有关的,看过那个TI的什么系统的配置猜想很多嵌入式系统在标准内核下的改动大都是驱动方 面吧。(完全无意义的话)
最大的疑惑是为什么chroot之后我uname -r得到的内核版本号是host而不是我安装的chroot的?这让我很震惊非常害怕,于是在安装grub的时候显示的都是我自己的硬盘分区把我吓坏了不 敢continue,也许这就是后来不能启动的原因?但是为什么第一次安装可以?唯一的差别是我加装了xinit/desktop-base。其他都是一 样的,所以在虚拟机上来实验吧。
/etc/hosts下记载的是我的hostname还是domainname?
另一个可能性是我安装了gtk/kde的两个版本的ubiquity,不知道这个东西是干什么的。
我目前需要知道怎么样在一个特定的磁盘安装grub/lilo之类的,ubuntu好像不让我这么干,也许需要直接调用grub的命令吧,现在需要买菜活 动一下。
我瞎搞我的虚拟机磁盘结果无法用gparted来格式化,因为始终报说disk identifier非法,google了一下其实这个是一个很白痴的问题,因为磁盘identifier是一个无所谓的东西,大家主要靠uuid,而 gparted/parted工具却都对此无能为力,最后发现fdisk很简单就解决了这个问题,无 非就是随机分配了一个号码, 埃,真是好笑。比如sudo fdisk /dev/sdb 有一点要明白,只有磁盘才有identifier的概念,至于partition的磁盘identifier似乎总是0,我用fdisk去修改, fdisk煞有介事的说设备正被使用你最好启动易下,实际上根本不幸的。然后关于安装grub,实际上也是一个很简单的东西,但是我就是一直没有作对。首 先你要有所谓的device.map这个是在你当前建立的启动盘的/boot/grub目录下,内容很简单就是一个
(hd0) /dev/sda 
(hd1) /dev/sdb
我一开始以为要把每个分区都要建立比如(hd0,1)  /dev/sda1实际上根本不需要,grub自己就知道sda第一个分区肯定是sda1,反而跑出来的错误让人很疑惑。总之我的目的是安装grub,然 后手动去修改我自己作的chroot文件系统下/boot/grub/grub.cfg来设定正确的磁盘,(其实grub2都是用uuid来寻找,这个 device.map真的意义不大)
要阅读grub-install的脚本才行,就是说grub把磁盘的基本信息写在了其他地方,因为/boot/grub/grub.cfg并不是全部的信 息。
遇到grub-rescue,其实也很简单,这 个是一个号的例子
set root=(hd0,1)/boot
insmod linux
linux (hd0,1)/boot/vmlinuz                         (你自己设定了softlink,否则太长了)
initrd (hd0,1)/boot/initrd.img
boot
这里有一个有趣的问题,在grub-rescue下怎么编辑文件?我没有看到任何的编辑器,但是我看到了cat,于是为了禁止 framebuffer的加载, 需要在/etc/modprobe.d/blacklist-framebuffer.conf的最后一行加上“blacklist vga16fb”于是echo "blacklist vga16fb" >> /etc/modprobe.d/blacklist-framebuffer.conf
这个应该是我要找的, 很兴奋的,看看再说。ok,我觉得我部分成功了,因为我用livecd,实际上是10.04server版的,只有rescue模式,设定网络的时候飞了 一些皱着,因为正常都是用NAT模式,可是在rescue模式下似乎不行的,(不奇怪吧),而要dhcp的话,只有用bridged adapter模式,所以要手动设定ip,比如192.168.1.20,而网关是192.168.1.254,这个是at&t的奇怪的 router的设定,美人告诉你,你不一定猜得到。然后选择rescure broken system。那么你选择resintall grub的时候,我选择目标/dev/sda1这个是错误的,要sda,而root filesystem才是/dev/sda1,然后重新启动就进入了登录界面,这个时候才发现我作chroot的时候没有设定用户和密码。哈哈,乌龙啊。 不过辛苦一天总算有些收获了。
最大的收获是破除了恐惧,以前碰到启动完蛋就像小孩子一样不知所措,好像天塌下来了,现在,仿佛Neo复活后看到matrix不过都是一些01而已。(开 始吹牛了,罚去健身房)
我的chroot里面locale不对,这里的设 置我全都试了都不行,后来才发现是我本身Host就又问题,怎么改chroot的环境都无效。
为了反复修改chroot的内容这个小的脚本初始化:
#!/bin/bash
mkdir -p /mnt/temp
mount /dev/sdb1 /mnt/temp
for i in /dev /dev/pts /proc /sys; do mount -B $i /mnt/temp$i;  done
cp /etc/resolv.conf /mnt/temp/etc/resolv.conf 
cp /etc/hosts /mnt/temp/etc/hosts
chroot /mnt/temp
相应的结束是
#!/bin/bash
for i in /dev/pts /dev /proc /sys; do sudo umount /mnt/temp$i ; done
umount /mnt/temp
都需要sudo运行,但是我现在发现一个令人非常不安的问题,就是我修改的文件好像经常丢失!一方面也许是因为我频繁的更换磁盘改变他的sata顺序?

六月十三日 现在需要的是熟悉内核开发

我昨天做的chroot里我的用户的默认shell是/bin/sh而这个默认是什么dash,就改成了bash。usermod -s /bin/bash  顺便把昨天的所谓的结束的script加到开始脚本后面这样在退出chroot的时候就可以Umount所有,我怀疑我文件丢失的原因可能是在虚拟机上没 有umount和磁盘切换共同造成的。
看来安装ubuntu-desktop的确起到了作用,我现在制作的磁盘系统使用默认的内核的确可以login图形系统,只是panel之类的丢失,现在 知道了原来这些个东西叫做gnome-panel,可以重启或者killall gnome-panel,以前就是照抄命令,至于其他的Indicator正在寻找中。原来network -manager-gnome是我要安装的,这个什么nm-applet是那个丢失的小图标。从命令行logout的话是gnome- session-save --logout
折腾了半天找不到恢复Indicator的办法,干 脆自己重新作一个, 就是add-to-panel,这个应该是一回事,没有什么系统专门定做只说。至此我自己重新制作的文件系统看样子是可以工作的。当然在虚拟机上成功和实 际可能还是又大的区别的。下次要试做一个。(这个没有意义吗?拷贝文件是无脑流吗?错!操作系统实际上是两个大的部分,一个是内核,一个是配置,内核代码 可能完全是独立,所以很多Linux流派都是使用同样的内核,但是在配置,也就是文件系统和User side的程序进行花样,这个难道还不说明文件配置系统有多重要吗?可能现在绝大多数的各种各样的linux dist都在作的工作就是这一部分,内核修改肯定有,但是不会太大吧?毕竟内核的工作都是类似的。)明白了这个道理,现在可以吃午饭了。从ubuntu 官方下载的安装文件大约两百六十多兆。
使用virtualbox也是很烦人的,因为关于磁盘文件snapshots的任何微小的改动,都又可能导致virtualbox的驱动内核加载失败,我 看到dmesg里又mmu的失败,然后就不能使用了,上一次出现这个问题是我在删除多余的snapshot的时候virtualbox很聪明的Merge 相邻的没有删除的snapshots,结果这中间因为我改变了硬件配置,比如把磁盘增加删除等等,他就糊涂了,当时我想不出什么办法只好推到重来因为后来 结果不是一个虚拟机不能用而是整个都报错,也无法回复。这一次又遇到了奇怪的事情我的snapshots太大了,我就把它移到另一个硬盘去,结果就报错, 可能virtualbox的配置界面和内部信息有什么地方不一致吧,后来我用symlink来恢复旧的路径也不行,这就让我开始怀疑不是配置的bug,而 是别的原因,重新安装重启拷贝回原来的位置当然是可以了,但是我还是要试验一下拷贝到别的磁盘,这完全没有道理,肯定是什么小的错误导致某个驱动加载失败 需要重启。我在猜想也许不知出于什么原因virtualbox也许内部的内核使用的是文件的inode之类的底层的地址,因而当我改变snapshots 的位置即便使用symbollink也会失败,而失败导致内核模块加载失败需要重启。这是我的猜想,很快就得到验证了。啊,验证了一点,symlink肯 定没有问题,但是如果你硬生生的改变位置而用配置界面重新指向也许才是出错的原因,总之,能用了就是了。
突然才想起来实际上我仅仅试验了硬盘启动,光驱的问题还没有解决,那么Usb就缓缓吧,但至少有一点要记住,所谓的usb在bios看来是usb- harddrive而不是你想象中的usb-key。这个是我长久以来的误区。

六月十四日 现在需要的是熟悉内核开发

这 位大虾解释的非常好! 这个不仅对于vmlinuz和initrd的作用作出了很好的说明,而且提到了udev和一些其他有趣的东西比如Hibernation/kexec之类 我没有接触到的东西。udev看来不仅仅是一个选择,他应该是内核和外界user一种通讯的机制,我原来还以为是一种开发驱动的另类的框架比如 window的wdm之类,看来这个是非常重要的。init是一个脚本,那么让我们看看livecd的init和我普通的有什么不同。
首先我看到的是livecd的isolinux的cfg文件,从这里我明白了当初制作livecd教程里的那个菜单的来历,就是说如果运行livecd和 安装ubuntu差别在于传递参数only-ubiquity,对于Isolinux需要知道的就是两样:kernel是那个文件,initrd是哪一个 文件,其他都是kernel和initrd的参数配置的问题了。所以,我们再来比较一下livecd的init和普通的init的不同:
这 里给出了一个非常棒的关于vmlinuz和vmlinux的解压缩的信息,太棒了:1。寻找压缩开始字串:od -A d -t x1 vmlinuz | grep '1f 8b 08 00'  比如我的是0014432 48 8d 83 d0 83 3d 00 ff e0 1f 8b 08 00 e7 36 04 所以是14432+9的偏移
2。取出来在解压缩dd if=vmlinuz bs=1 skip=14441 | zcat > /tmp/vmlinuz
当然,他们说的很对这个东西没有什么帮助了,已经strip过了。
打开livecd的initrd.lz需要不同的工具: lzma -dc -S .lz ../iso/casper/initrd.lz |cpio -id
这个时候init给我展现出了真相,这个绝对是需要你认真理解的,它是操作系统诞生的夜晚发生的一切,所以,就叫做圣诞夜了。累了,休息再看。
我越是学习越觉得自己浅薄的可怜,普天之下,高才硕士比比皆是,你从google到的结果就知道有多少人在孜孜以求,有多少人學富斗量,这个世界是竞争的 丛林,全世界最顶尖的人拼命搏杀也未必能有绝对的优势,因为达到至高至强是人人的心愿与目标,全力冲击尚且困难,更何况某些政府条条框框束缚掣肘,所以, 未来世界的高下是早有定论的。从GDP $200到$5000也许是很快,但是那个真的是某政府的功劳吗?天晓得那个是正常发展早就应该达到而人为阻碍生产力的压抑束缚松绑后的高速弹簧反弹。可 是从$5000开始就是凭借真本事的硬碰硬的较量了,体制的掣肘对生产力的束缚是让一个原本就先天不足的人更加困难的。
顺便说一个kompare的bug,就是默认的font下unders_score都看不见,google一下要修改一下font,这明显是一个bug。
实际上livecd的Init和我自己编译的是一样的,所以,差别是在别的地方。我想所有的trick都在ubiquity里,这个脚本决定了怎样安装。 ubiquity是一个python的脚本,全部都是在这里面运行的。
作为isolinux或者extlinux之类的实名应该很简单就是把kernel和initrd全部都load到内存里然后执行Initrd里面的一个 叫做init的程序,最早的Init是linus写的一个c程序作一系列的初始化的工作,现代都是用脚本最后在执行exec init,这个真正的init 就是所有的程序的老祖宗,这个init很可能就是fork一个exec原始的sh。
而Init里面又所谓的inittop,initbottom之类的脚本再去呼叫这个ubiquity,所以在ubuntu里面livecd都是呼叫他 的,大概是casper的脚本呼叫的吧。
总算挽回一些面子把一个简单的任务完成了,制作usb启动盘。说起来惭愧我从来就没有成功过。而我采用的是最简单的办法就是用grub来loopback ubuntu livecd,所以这个工作量是相当的少的。1.你要明白这里的usb不是keypen之类的而是usb-drive之类的,我以前在bios设置总是不 对。2.网络上的很多教程是针对grub而不是grub2的,因为grub2把cfg的默认位置改道了/boot/grub/grub.cfg,因 此这个地方是不对的。其次,他的cfg文件也是不对的,因为ubuntu10.04的启动文件都是放在/casper下面,下面是我从标准的硬盘 启动的grub.cfg修改的部分,只有菜单是重要的:
menuentry 'Ubuntu from USB livecd image' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod ext2
    set root='(hd0,1)'
    set isofile="/ubuntu.iso"
    search --no-floppy --fs-uuid --set 9494ce0f-00fb-42ad-94ce-23661ef64f6b
    loopback loop (hd0,1)$isofile
    linux    (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
# ro   crashkernel=384M-2G:64M,2G-:128M quiet splash
    initrd    (loop)/casper/initrd.lz
}
我准备拷贝图片文件看能不能有背景图出来。确实是可以的,只要你把debian的那个默认的png图片拷贝到usb这样改变路径就行了,现在的问题是什么 样的png都可以吗?让我实验一下范冰冰的肖像如何?证实了grub2确实很强大,只不过我在参数里面设置gfxmode=640x480所以图片都被缩 放到640x480了。太棒了!现在我把显示模式改动成图片的尺寸,但是看来grub2是按照全屏的尺寸的,和图片的尺寸无关,所以还是要该图片。
之前我之所以失败的一个原因就是因为没有意识到ubuntu livecd是使用一个复杂的ubiquity的安装系统来实现test drive的运行的,那么在没有硬盘事先安装好文件系统的情况下即使内核和Initrd都成功load到内存开始运行的时候自然找不到root文件系统。 这个是任何linux或者操作系统普遍的问题,你要么是一个第一次安装系统,要么事先已经安装了,没有什么其他可能性。当然这是不严格的,另一种可能性就 是livecd式的光盘运行,或者使用nfs的网络模式,但是这些都不是白给的需要你去配置ramdisk/nfs,所以这是一个基本的道理,我没有意识 到实在是一个教训。
menuentry 'Ubuntu 10.04 from laptop' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod ext2
    linux    (hd0,1)/casper/vmlinuz root=UUID=e1850c8b-2965-4fcf-9383-0c955a2b9009
    initrd    (hd0,1)/casper/initrd.lz
}
唯一的诀窍就是这个root的设定,这个uuid是我的laptop的启动分区的实际的Uuid,所以从我的usb启动的vmlinuz与 initrd.lz,当然我现在面临的这个内核没有正确加载笔记本的鼠标网卡与声卡。看来我需要改造这个内核。其实完全不是那么回事,我自己搞错了把 amd64的livecd去启动我的laptop,那个应该是i386的光盘才行啊!重新写菜单ok,但是因为我的无线网卡需要特定的firmware, 而那个很老的2.6.32的内核没有所以网卡不行。
menuentry 'Ubuntu 10.04 amd64(2.6.38) from livecd image' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod ext2
        set root='(hd0,1)'
        set isofile="/iso/ubuntu-10.04-amd64.iso"      
        loopback loop (hd0,1)$isofile
        linux   (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
        initrd  (loop)/casper/initrd.lz
}

menuentry 'Ubuntu 10.04 i386(2.6.21) from livecd image' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod ext2
        set root='(hd0,1)'
        set isofile="/iso/ubuntu-10.04-i386.iso"  
        loopback loop (hd0,1)$isofile
        linux   (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
        initrd  (loop)/casper/initrd.lz
}
menuentry 'Ubuntu 10.04 i386(2.6.21) for laptop' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod ext2
        linux   (hd0,1)/laptop/vmlinuz root=UUID=e1850c8b-2965-4fcf-9383-0c955a2b9009
        initrd  (hd0,1)/laptop/initrd.img
}

menuentry 'Ubuntu 10.04 amd64(3.0.69-100) for desktop' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod ext2
        linux   (hd0,1)/desktop/vmlinuz root=UUID=361e6133-7a91-40c1-986a-0667f9273c52
        initrd  (hd0,1)/desktop/initrd.img
}

六月十五日 现在需要的是熟悉内核开发

关于device major/minor number的 有用的解说。我把我的tmp设定成使用tmpfs希望提高效率,但是我发现我的24个cpu从此就不得闲,疯狂的运行。这也许不是一个好兆头。而且 virtualbox的ssh不能工作了。奇怪。我猜想这个也许是virtualbox的问题,因为其他程序都很正常,似乎还比较的快。现在看来也许是不 正常的问题,因为当时我在虚拟机上编译内核把make开到了-j12,结果是可想而知的,因为-j12并不是说你有20个cpu就可以的,实际上是12个 任务的并发,其实有可能有问题的。现在至少ssh没有问题了。当然我把虚拟机的tmp也改成了tmpfs。
我现在大体有些明白了在早一点的ubuntu的casper 里有这个toram的选项,但是现在好像已经broken了。这就是我找了很久找不到的原因吧。这 里用的更早,其中grub的兼容问题也有,总之,现在是ubiquity的内部做到的不需要casper来作了。

六月二十日 现在需要的是熟悉内核开发

完全无法进行正常节奏,昨天唯一发现的一个问题居然是gcc4.7编译kernel2.6.32的问题,使用git的版本居然找不到patch,看来 kernel的开发是patch放在另外的?下载2.6.32.61编译尝试。我的笔记本需要broadcom的firmware,看到了那个以前下载的 小工具,居然是一个从原本broadcom的firmware里“挖”出来的firmware,这个东西在原本的Ubuntu的livecd里没有,我就 把它copy到/lib/firmware/b43下,然后重新制作squashfs,再加入到iso里,就可以用我的新的iso启动并且光盘运行使用无 线网卡了。
在/etc/grub.d下的custom里增加一个menu的时候我要使用iso来启动,我的硬盘是sda5,那么就一定要用硬盘(hd0,5)单单使 用uuid不行。
alsa每次都被snd_hda***的模块挤占,于是决定在/etc/modprobe.d/alsa_base.conf下面加上options snd_hda_xxx index=-2看看能不能阻止加载。google了一下觉得正确的语法应该是blacklist snd_hda_xxx
要想获得所在lan的其他的hostname可以使用arp -a这个真的挺好用的。如果要 强制刷新远端的arp cache可以使用arping的命令。不过我不确定是否要加上device还是直接用gateway的地址:sudo arping -s 192.168.1.4  -I wlan0 192.168.1.7
或者sudo arping -s 192.168.1.4 -I wlan0 192.168.1.254
ubuntu原本就有 非常方便的文件share的机制

六月二十一日 现在需要的是熟悉内核开发

尝试把asus的无线网卡驱动和内核合并,发现usb.c始终编译不过,asus压根就不用这个,但是我注释了makefile依然报错,后来才想到所有 的文件都要编译?只好彻底把文件删除掉。

六月二十二日 现在需要的是熟悉内核开发

对很多人来说是一小步,对我来说是一大步,我把asus的rtl8192ce的无线网卡驱动整合到内核中去了,说是整合不如是硬性插入,我完全没有作 merge直接拷贝而已,当然因为怕麻烦一行一行merge不花上一天半天才怪。所以总的工作量其实也不大,只要你认真去看makefile理解到原来的 官方的kernel与asus的驱动的异同,官方显然结构好很多整合了Usb和8192se/de等等,但是我目前只关心我的pci网卡,所以最后为了能 够不休改代码编译就按照asus的makefile把8192-common的部分联通usb部分通通注释掉,就是从makefile里面拿掉。编译安装 内核发现request_firmware总是失败,还一度怀疑是/lib/firmware下的路径的设置的问题,后来恍然大悟这个是module的做 法,如果我编译到了内核岂不是要把firmware放到内核里吗?这个很难想到吗?其实看到内核的firmware的makefile就很明了了,无非把 你的config的firmware加入到makefile里而已,编译的时候观察到这些binary就是写到类似于.ro的什么section作为内核 的一部分。于是安装一次成功!yay!现在我的无线网卡再也不需要在内核改变后额外编译了。同时之前的alsa在编译到内核之后把无用的hdmi模块列入 blacklist也再也不用额外编译安装了。总算比较彻底解决了驱动的问题。感觉目前对于内核模块有了一些粗浅的了解了。
如果要修改上一次的git commit需要git --amend --author "nick huang<nickhuang99@hotmail.com>"

六月二十三日 现在需要的是熟悉内核开发

关于gumstix的源代码是 这里吧? git clone git://www2.sakoman.com/git/linux-omap-2.6 linux-omap-2.6

六月二十五日 现在需要的是熟悉内核开发

升级gcc到4.8是一个好事情,但是把它编译成toolchain就遇到很多的障碍,首先一定要在独立的build目录下,否则问题很多。(我的笔记本 内核变异了amd的cpu反而效率更低了?还是因为sshfs的缘故?)我使用了target=arm-elf的选项,总是失败,就转而用gcc- 4.6,但是只能enable-languages =c,不能有c++。要禁止ssp:--disable-libssp
这个讲的比较的详 细

六月二十六日 现在需要的是熟悉内核开发

还是这个讲的比较好
1.一定不要在代码原始目录下编译,一定要创建新的编译目录!
2.先变异binutils : ../configure --target=arm-linux-elf --prefix=/usr/local/arm-linux-elf --enable-interwork --enable-multilib
3.关于target的组合这个是我这两天看到的唯 一比较清晰的解读:架构-操作系统-二进制格式。interwork可以让thumb和什么什么arm code混合。关于multilib我还是不清除。
4.看来把toolchain的安装目录的bin输出到path很重要,因为随后的变异始终需要寻找binutils的可执行程序。export PATH="$PATH:$MYTOOLS/bin"
5. 编译gcc需要用到newlib的头文件,至于为什么我还是不清楚:

六月二十七日 现在需要的是熟悉内核开发

编译的详细过程似乎在这里更加清楚, 我也更加模糊,是否新版的gcc不再让人费力的做两阶段编译?我曾经试图按部就班的重做一遍别的教程结果失败,哪怕我用的是一样的版本,所以很多东西也许 在我当前的host上是不行的,但是让我设置我的gcc为作者的低版本似乎太复杂了。。。而且最最关键的是我必须要有真正的目标机器来检验。那么只有先搞 明白gumstix的配置才行。这里是gumstix 的一些资料omap3503datasheet./binutils/configure.tgt
目标是在binutils的这个里面定义的:./ld/configure.tgt  ./binutils/configure.tgt
这里谈到的两 阶段变异gcc很可能是我需要理解的,先记录下来。

七月三日 现在需要的是熟悉内核开发

linux from scratch这个网站是非常有教育意义的, 作者是一位非常非常资深的大侠,其功力深不可测,是我等无可望其项背的人物。我一步一步操作学习,gcc4.7.2应该是有编译的问题吧,反正我改成了作 者现在的gcc4.8.1版本来做。他 原本有一个下载清单,可能还是太旧了。所以还 是遵循这个清单。FAQ的内容非常的好。

七月六日 现在需要的是熟悉内核开发

编译稳定版和开发版都不成功,我决定把我的gcc降级到4.6,看来4.7/4.8都还没有很成熟吧?
编译gcc4.6.1版实际上是有问题的,编译没有错 误不等于能够通过check,因此决定使用gcc-4.6.4这个最成熟的版本。
这个是omap的驱动这个列表代表什么不是很理解,我想尝试 gcc-4.6.3。有一点开始明白就是变异gcc是制作linux的重要一环,这里的编译选项是一个很好的突破口。

七月七日 现在需要的是熟悉内核开发

我 在这里stuck了好多个小时,错误是glibc的configure总是报说autoconf不支持,我始终以为是版本的检查,直到读代码才模 糊明白是configure尝试直接运行autoconf configure.ac得到了错误,所以报说不支持,这个应该是无害的吧?
《Two Weeks Notice》是另一部我喜欢的浪漫喜剧,我发现我喜欢的类型:都是一些不把钱当钱的超级大亨,如果money is not an issue的话该多浪漫,而女主人公实在是不怎么样的类型,一个典型的纽约自由派,视金钱为粪土一心一意为人民服务,但是又能够轻易的得到一份25万年薪 的工作,可是我现在正吃力的探索怎么制作toolchain却还。。。

七月八日 现在需要的是熟悉内核开发

autoconf安装2.68,automake安装1.11.2版本。有一个所谓的dynamic loader的东西很重要,它应该是定义在这里: dirname $(gcc --print-libgcc-file-name)/specs  或者是这样子的: gcc -dumpspecs

七月九日 现在需要的是熟悉内核开发

编译bzip反而除了不少的问题,看来写这个端子的人有些漫不经心,结果我就步步惊心了。首先是链接都不对,不知道作者的运行的位置在哪里,其次 这个包的shared的makefile有问题(Makefile-libbz2_so),明眼人一看就知道cflags没有全加上
$(CC) $(CFLAGS) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.6 $(OBJS)
我把命令也改动如下,因为我希望我的软连接不依赖我的安装目录(这个想法很奇怪,总之我寄希望于我的文件系统不公布源码目录,这是唯一的解释)
cp -v bzip2-shared /bin/bzip2
cp -av libbz2.so* /lib
ln -sv /lib/libbz2.so.1.0 /usr/lib/libbz2.so
rm -v /usr/bin/{bunzip2,bzcat,bzip2}
ln -sv /bin/bzip2 /bin/bunzip2
ln -sv /bin/bzip2 /bin/bzcat
在ncurse的部分似乎作者的目录也不对,最后的安装传统-lcurse兼容部分应该拷贝当前的lib的下面的。比如cd lib;然后
ln -sfv libncurses.so /usr/lib/libcurses.so; ln -sfv libncursesw.a /usr/lib/libcursesw.a; ln -sfv libncurses.a /usr/lib/libcurses.a;
编译readline 的时候无法编译shared的原因是你不能在代码目录直接编译,必须在另外创建一个子目录才行,看Makefile就会发现这个现象是 hardcoded。

七月十日 现在需要的是熟悉内核开发

这 里给你一个启发就是最最基本的arm-qemu的结 合,非常有帮助。花了好几天一步一步编译完成了第一个lfs,但是怎么知道我编译的是什么呢?怎么运行是一个头疼的事情。当然我没有设定目标是arm所以 现在应该可以使用virtualbox,等我下一步再使用qemu,但是现在已经知道virtualbox在这方面是无能为力的。所以,使用qemu是一 个必须。
制作sparse文件也许是qemu的最快途径
:
1. truncate -s 10G ./lfs-sparse-file-image
2. du -hs --apparent-size ./lfs-sparse-file-image
3. losetup /dev/loop0 ./lfs-sparse-file-image
4. mke2fs /dev/loop0
5. mkdir /tmp/image; sudo mount -o loop  ./lfs-sparse-file-image  /tmp/image
6. sudo rsync -a /mnt/lfs/* /tmp/image
但是为了在virtualbox上试验还是专门用一个分区,使用rsync拷贝。暂时不考虑grub安装,编写一个customs菜单实验看看。
当你Umount提示设备正忙的话,很可能是他的子设备或者子目录还被mount的,需要按照相反的顺序umount,比如mount /dev然后mount /dev/pts,那么umount /dev/pts,umount /dev
我对于我在chroot下作grub-install /dev/sda不是很确定,因为我当前的分区也许不是的,因为我的Host才是sda,我的chroot的分区也许是sdb那么怎么办?
《Presumed Innocense》是又一部经典的片子,和麦克。道格拉斯的《电话谋杀案》一样的经典,而更加经典的是这部电影和《洛城秘闻》一样的深刻,更有意思的是 女主人公和当前的某位风流女人有鬼斧神工的相似,故事曲折复杂,牵扯了美国司法界的方方面面,我翻来覆去的看了好多遍才大体清楚:
1.一个像邓温迪一样用身体和算计来计算自己的前程的每一步的女人,一个坐火箭一路飙升到副总检察官的强悍的女人,一个和无数她认为值得利用的男人睡过来 的女人,为上法学院和教授睡觉并结婚,在基层警局和法官睡,等她看准了前程无量的副检察长哈利僧。福特睡,等到她发现哈利森没有官场的野心,于是就直接了 当和总检察长睡就顺利当上了副检察长,当另一个副检察长开始调查她多年前受贿的案子的时候,她利用自己的身体让总检察长赶走调查的副检察长并且直接接手案 子拿走警局的资料。
2.在办案中主人公是一个貌似正直的检察官,被女主人公勾引与吸引发生了肉体关系,当发现没有利用价值被抛弃后却不甘心。洛城警局和检察院长期内斗,总检 察长要和警察局长竞选作对,他的同事一心想置他于死地,他的好朋友讲义气隐藏对他不利的证据,他的律师为了他的钱利用受贿的把柄要挟法官撤销控告。最后出 人意料的他发现自己的妻子才是真凶,但是他却选择沉默因为他不能让儿子没有妈,他的同事把隐藏的证据作为圣诞礼物给他,他也选择扔到河里。因为他虽然被那 个女人诱惑确实自己出轨逼疯妻子才杀人,所以他最后说自己犯了罪,有人受了害,有人就受了罚,这就是《罪与罚》。
电影里的几个人物非常的生动令人印象深刻,女主人公仿佛莎朗斯通在《本能》里一样的性感,说话优雅如同绅士的律师,忠诚正直的同事等等。一部经典。

七月十一日 现在需要的是熟悉内核开发

折腾了快一天才发现了一些端倪,这个也许是virtualbox的问题,就是之前我没有注意到的问题,每当你改变磁盘的sata接口位置,磁盘就被当作一 个全新的磁盘,至少uuid改变了,这个导致我的grub使用Uuid启动失败,而且还发现好像磁盘文件似乎无法保存,感觉是和snapshot的某些功 能有关的bug,所以不要再瞎折腾了,这里的原则可能是grub开发者的理念:grub安装不应当像mbr一样在每个磁盘分别安装,从前的多重启动很大程 度考的是改变bios的启动磁盘顺序,原因就是在每个磁盘甚至分区都分别安装mbr,而grub是一个整合的统一管理,也就是你只需要一个固定的mbr安 装的启动磁盘/分区,所有的可见的操作系统菜单都集中到了这里,你可以自由选择而不需要改变bios,这个当然是理想的状态,我没有必要把为每一个操作系 统的内核版本分别编译/安装自己的grub因为grub/mbr之类的是超然于任何操作系统的!这个理念很重要!找到了只读的原因,是我自己的grub菜 单加了ro,而另一点很有意思就是我之前在sdb1上安装的grub也会被检测到而且其中的grub菜单不是被sda1上的简单拷贝而是被检验合格才抓过 来,非常的智能,很了不起,也许这个grub的超强能力导致我的问题,当然virtualbox改变磁盘uuid无可厚非是正确的设计,一切都是我的错。
按照linuxfromscratch的做法的确可以启动而且不需要initrd,这个是令我相当震惊的,看来这里面的确是很有玄机的,作者号称可以做到 安装系统在5M之下,这个更加让我震撼!
运行这个脚本进入chroot:
#!/bin/bash

LFS=/mnt/lfs
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts  $LFS/dev/pts
mount -vt tmpfs shm $LFS/dev/shm
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys

chroot /mnt/lfs /usr/bin/env -i HOME=/root TERM="$TERM" PS1='\u:\w\$' PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/bash --login +h

umount -v $LFS/dev/shm
umount -v $LFS/dev/pts
umount -v $LFS/dev
umount -v $LFS/proc
umount -v $LFS/sys
所谓的交叉编译核心就是怎么编译gcc,而他的核心又包括了binutil的那些直接面对目标二进制文件的工具比如as/ar等,在普通平台上用的是 glibc在交叉编译的时候使用eglibc。当你做好了编译器之后其他的工具的编译都是比较常规的了。交叉编译的时候最好不要使用并行编译,经常是会出 错的。

七月十二日 现在需要的是熟悉内核开发

一个简单的不能再简单的道理我却花了好久才明白,你在制作toolchain之前需要一个真正可靠的编译环境,这个环境不能简单的依赖你当前的工作平台, 这里的噪音太多了,环境太复杂了,这就是为什么作者一定要从头来过,这个所谓的coross-tool就是linux from scratch的理念:从头来过,这个是为了制作第一步toolchain的工具的工具,就是一个可靠的Host,而当你建立号这个工作平台之后你才开始 编译第一个工具,也就是大多数人的toolchain的第一步,这个是因为作者鉴定的理念,一切从源码开始编译的结果,因为通常这一步是linux distribution们做的工作。所有的诀窍都在于几个prefix和ar/as/ranlib这些环境变量的设定上。
1.首先编译binutils他需要的是gcc的几个先决条件,无非是目标kernel的头文件和三大库gmp/mpfr/mpc,这些工具通常人们直接 就使用当前系统的而不是自己编译file/m4/ncurse,还有cloog/ppl。定义binutils的时候关键是要告诉它 host/target是什么。最后include/libiberty.h需要单独拷贝,不是编译工具而是toolchain需要。
2.编译gcc需要分两步走,第一步是一个静态的gcc工具,我的理解是toolchain差别在于binutil里跟目标代码产生的部分,做一个c/c ++语言的parser部分没有什么区别,所以,这个部分实际上不需要交叉编译??这里的意思是在制作目标编译器的过程中是不需要也不可能作交叉编译的, 只有等到gcc目标做好了连gcc本身也重新编译联通所有其他软件包括内核在编译。所以,这个静态工具就主要是静态库部分?要点是 build/host/target的定义,sysroot是将来工具寻找系统头文件的地方?"local_prefix"
AR=ar LDFLAGS="-Wl,-rpath,/cross-tools/lib" \
../gcc-4.6.3/configure --prefix=/cross-tools \
--build=${CLFS_HOST} --host=${CLFS_HOST} --target=${CLFS_TARGET} \
--with-sysroot=${CLFS} --with-local-prefix=/tools --disable-nls \
--disable-shared --with-mpfr=/cross-tools --with-gmp=/cross-tools \
--with-ppl=/cross-tools --with-cloog=/cross-tools --without-headers \
--with-newlib --disable-decimal-float --disable-libgomp \
--disable-libmudflap --disable-libssp --disable-threads \
--enable-languages=c --disable-multilib --enable-cloog-backend=isl
又一个编译技巧是直接制作config.cache这样就能做到不休改configure等等来hack一些设定。
3.编译eglib的部分就直接用到了以上的target设定:
BUILD_CC="gcc" CC="${CLFS_TARGET}-gcc ${BUILD64}" \
AR="${CLFS_TARGET}-ar" RANLIB="${CLFS_TARGET}-ranlib" \
../eglibc-2.15/configure --prefix=/tools \
--host=${CLFS_TARGET} --build=${CLFS_HOST} \
--disable-profile --with-tls --enable-kernel=2.6.32 --with-__thread \
--with-binutils=/cross-tools/bin --with-headers=/tools/include \
--cache-file=config.cache
4.比较一下gcc的第二步吧:打开了shared的开关,增加了c++,和c99的开关,去掉了new-lib,打开了第一步的很多关闭的设置
AR=ar LDFLAGS="-Wl,-rpath,/cross-tools/lib" \
../gcc-4.6.3/configure --prefix=/cross-tools \
--build=${CLFS_HOST} --target=${CLFS_TARGET} --host=${CLFS_HOST} \
--with-sysroot=${CLFS} --with-local-prefix=/tools --disable-nls \
--enable-shared --disable-static --enable-languages=c,c++ \
--enable-__cxa_atexit --with-mpfr=/cross-tools --with-gmp=/cross-tools \
--enable-c99 --with-ppl=/cross-tools --with-cloog=/cross-tools \
--enable-cloog-backend=isl --enable-long-long --enable-threads=posix \
--disable-multilib
这里就明白了,如果我要编译target=arm的是可以重用cross-tool下的东西的,只需要编译tool下的东西,因为基本环境应该是一样的。 (且慢不可,因为工具里已经嵌入了target,所以不行。)
这个世界就是这样子的,对于贫穷的定义是不同的,大亨们说他不得不和另一个家庭共享直升机服务。
ABI始终都是我不清楚的部分:仿照clfs设置的arm-unknown-linux-gnu不能通过glibc和eglibc的编译,后来看到这里 glibc/ports/sysdeps/arm/preconfigure里面的错误Old ABI no longer supported
可能新版的glibc在2.16版后不再支持老的ABI,所以当我设定target为arm-unknown-linux-gnu就不行,后来我改成了 arm-unknown-linux-gnueabi。
gettext和glibc有冲突:
/mnt/clfs/sources/gettext-0.18.1.1/gettext-tools$ sed -i -e '/gets is a/d' ../gettext-tools/libgettextpo/stdio.in.h
/mnt/clfs/sources/gettext-0.18.1.1/gettext-tools$ sed -i -e '/gets is a/d' ../gettext-tools/gnulib-lib/stdio.in.h
/mnt/clfs/sources/gettext-0.18.1.1/gettext-tools$ sed -i -e '/gets is a/d' ../gettext-runtime/gnulib-lib/stdio.in.h

七月十三日 现在需要的是熟悉内核开发

glibc 和udev有冲突
清浙,你觉得中国未来20年会发生什么大的变化?战争是必 然吗?“下一个市场是亚洲”靠谱吗?
电子商务在中国会良性发展吗?阿里现在一手遮天,有点畸形啊。


你问的题目太大了,堪比刘备问诸葛亮天下大势,可是你不是刘备, 我也不是诸葛亮,我们之多只不过是天底下的行人。
现在有很多流行的“经济学家“发表很多“吹捧“中国“经济奇迹“的观点,飘飘然之间仿佛中国经济可以超脱于自然法则,似乎中国的野蛮落后制度能够战胜资本 主义体制。自然规律不是经济学人茶余饭后空谈的话题,我以为所谓自然法则不惩罚人类,人类是不会认为那是“自然“法则的,比如“皇帝“或者“国王“的口谕 和意志。

说了这么些废话就是想说,中国并非什么经济“特例“,一定符合所有其他国家的规律,因为生活在中国的人和世界上其他人没有什么大的区别,那么难道中国经济 就不受自然经济法则约束吗?所以,如果说很多人认为中国经济根据法则已经破产而表面上没有破产那一定是有原因的,要么提供的数据有偏差导致结论错误,要么 是因为人为的干预延缓了破产的过程。

社会制度是人类社会经济生产生活的种种关系的反映,说的更白的就是人和人之间付出与索取的度的位置,也就是干多少活拿多少享受。
在奴隶社会,奴隶与奴隶主之间是这种关系的一个极限,奴隶能够获得的仅仅是因为奴隶主需要奴隶活着为奴隶主干活,这里根本不存在获取。
在封建社会,地主需要农民有更高的劳动技能不得不让农民获得更多。
资本主义社会里,工人要的更多因为他们的劳动技能是资本家不可或缺的。
信息社会的劳动者拥有更加无可比拟的地位要求资本持有者做出更大的让步。
总而言之,社会发展越高要求劳动者获得更多因为社会要求他们越高。

你有没有问过自己中国共产党过去三十年“创造“的经济奇迹靠的是什么?说白了就是“割共产党自己的肉“,”放共产党奴隶统治的权“,给“中国奴隶们一个稍 稍体面的劳动回报“。除此之外,什么也没有作。那么没有共产党岂不是早就应该有今天的经济“繁荣“?这并不经济奇迹,只不过是迟来了三十年的早该来的事实 而已。

邓小平当初说的所谓“四项基本原则“就是共产党改革的底线,现在在这个底线之上已经越来越难了,李克强的所谓改革很大程度都会失败的,那么你认为中国经济 还有什么可能再发展?因为过去三十年并不是中国创造了奇迹而只不过把几十年前认为羁绊经济发展的枷锁去除“还原“了经济的现实而已。
那么将来还有这种去枷锁的“反弹“式跃进吗?看了“四项基本原则“就知道已经没有可能了。那么中国经济发展也就只能回归世界大家族的共同“规律”,那就是 今天主流经济体的增长律。

会不会有战争?首先,你要问一问战争符合谁的利益?谁需要战争?
共产党想在所有的核心利益就是维持统治,如同清朝末年的苦苦支撑一样,变法维新是为了维持清廷的奢侈享受,凡是有利于此的就做,那么在国内大量劳动人口无 法满足生存需要的时候怎么解决呢?胡温认为必须保持GDP在8以上才能维持就业压力,经济增长能消解人民的不满的增长。习李已经认识到GDP增长无法人为 的继续,那么解决这个办法要另辟蹊径,战争因此也可以成为一个选项,一切都看是否有利于转移矛盾和维护统治。古人说“国无外患常亡“说的就是这个,只不过 古代是警示统治者,今天被用来转移老百姓对于衣食住行不满的工具。所以,战争取决于共产党的统治是否到了走投无路的地步。

电子商务?到底对于普通人的利益大还是对于维护既得利益者来的大?大公司起起落落在欧美是家常便饭,阿里的核心竞争力究竟在哪里?
电商的核心有三个:信息,钱和货。
信息就是让卖家和买家充分传递信息的手段和平台,这个基本上是阿里过去做的,现在有移动互联,信息手段更多了,阿里未必总站上风。
钱和货,阿里除了支付手段还能够垄断物流吗?
支付和中国的金融改革息息相关,能够走到哪里呢?

总而言之,我从来都不认为中国会有明天,二十年太久了,你用的尺度是上个世纪清廷的计时尺度,现在社会的发展是加速度的,不可能那么久。我很坚信我有生之 年能够看到共产党的灭亡。

看凤凰卫视辩论会说的很有意思,就是秦始皇的故事,当年秦始皇希望维持万世却连两世都没有办法维持,为什么?首先,修国防工程--万里长城。(今天中国拼 命的军事扩张),其次,修驰道(就是各种铁公机基础交通设施),再次,修阿房宫(各地大力修建楼堂馆所)。所以,秦始皇是今天中共的明天。
间接证明了我的arm-toolchain是可以working的,首先我仿照cross-lfs.org的做法作toolchain,不过官方并没 有arm的做法,只有mips/powerpc/sparc等等,我仅仅改动了几个参 数比如ARCH=arm, target改成了arm-unknown-linux-gnueabi,注意这里旧的arm-unknown-linux-gnu不再被glibc- 2.17所支持,必须使用eabi,而再编译eglibc的时候我遇到一些编译的问题,最后决定还是使用glibc,在bootloader上选择使用 uboot,我选择使用gumstix的一个版本的u-boot: git://github.com/gumstix/u-boot.git 然后编译就很简单,参照这里make ARCH=arm omap3_overo_config
制作mmsd的 启动盘参照这里:有机电需要注意
1. 测量mmsd的大小:
sudo fdisk -l /dev/sdf
注意这里是sdf整个分区而不是其中的一个比如sdf1,这一点很重要
2. 删除分区表: sudo dd if=/dev/zero of=/dev/sdf bs=1024 count=1024
3.建立分区表:sudo sfdisk --force -D -uS -H 255 -S 63 -C sectornumber /dev/sdf
注意这里的sectornumber是第一步得到的bytes/255/63/512取整得到的。第一个分区的参数是128,130944,0x0C,* 也就是偏移128,大小130944,类型dos,这个和内核启动分区的代码是相吻合的。第二个是linux分区参数只需要起始偏移131072其他放 空:131072,,,-
4. 建立dos可启动部分:sudo mkfs.vfat -F 32 /dev/sdf1 -n boot
5. 建立linux文件系统在第二个分区:sudo mke2fs -j -L rootfs /dev/sdf2
6. 拷贝启动文件的时候至关重 要的是一定要先考被MLO再拷贝u-boot.bin和uImage,这个很可能是dos文件系统的问题。切记切记。(这里我用我自己的 toolchain编译的uboot的u-boot.bin替换了原来官方的结果能够正常启动说明我的toolchain是正常的。
现在对于microSD的启动机制我大体已经很清楚了,知道为什么不需要特别的安装程序吗?比如grub需要它专门的install程序向分区去写,因为 你正常没有办法把你的文件写到磁盘的某个偏移,而bootloader正需要这样子,所以,关于windows/dos的启动,看过linux源代码就记 得是从128的偏移开始被系统的loader读到内存,这个部分的大小也是有规定的,因此为了把我们的uboot的开始运行程序写到分区128的位置,你 就用sfdisk直接规定分区的开始偏移。而uboot需要先运行MLO我猜想是类似与启动菜单splash图之类的东西,真正的bootloader是 u-boot.bin是随后才被呼叫的,那么你只有第一个拷贝MLO才能保证它是在分区起始位置128,这就是dos启动的秘密,我之前不知道这一点被愚 弄了好几个小时,还以为磁盘拷贝有什么讲究而改用rsync也无效,(保留文件属性并不影响内容啊)惊天还是很有收获的。

七月十四日 现在需要的是熟悉内核开发

这个是所谓的omap -default.cfg的内核配置。因此这样子编译omap的内核。 而arm似乎要编译成uImage,就是make的target,这个是运行qemu 的脚本,其实搞明白了制作bootable microSD的话就知道他在做什么,但是这样自动化的还是很好的。
make ARCH=arm CROSS_COMPILE=${CLFS_TARGET}- uImage 出现mkimage找不到的错误, 虽然我认为这个是u-boot我没有把mkimage拷贝到我的toolchain的path目录下,但是谨慎期间还是认真搜索,因为我要闻的问题是 grub/x86-64下为什么没有这个问题,现在看来是我愚笨了是因为uImage是u-boot的而不是什么特别的压缩格式,当然在我编译x86- 64的时候我压根就没有使用Uboot自然就没有。我的toolchain的编译环境的一个重要的地方就是特殊的env里path首先搜索我的 toolchain的目录。
Winona Ryder是那种惊艳的法国少女 形象,很多时候她就是人们心目中的聪颖好读书的假小子形象吧。
gumstix使用的fstab采用partition的名字,这个我以前还不知道,总是担心设备名字不确定。查看我的overo发现boot param(在/proc/cmdline)是   "console=ttyO2,115200n8 mpurate=500 vram=12M omapfb.mode=dvi:1024x768MR-16@60 omapdss.def_disp=dvi root=/dev/mmcblk0p2 rw rootfstype=ext3 rootwait"  问题是我怎么传递启动参数的?这个问题问的很好,于是我可以下定决心阅读u-boot的readme了。之前还认为也许浪费时间,现在看来非常必要。肚子 饿了就吃饭。
只能说是我部分地找到了答案。当你编译uboot的时候你给的所谓的XXX_XXX_config会作为cpu,board的定义,在 include/configs/cpu_board.h里面定义了一系列的类似于linux kernel的宏,读uboot的readme说这个是为了将来紧密结合自动化的考虑,总之,在 include/configs/omap3_overo.h我找到了给uboot定义的环境变量:
#define CONFIG_EXTRA_ENV_SETTINGS \
        "loadaddr=0x82000000\0" \
        "console=ttyO2,115200n8\0" \
        "mpurate=500\0" \
        "optargs=\0" \
        "vram=12M\0" \
        "dvimode=1024x768MR-16@60\0" \
        "defaultdisplay=dvi\0" \
        "mmcdev=0\0" \
        "mmcroot=/dev/mmcblk0p2 rw\0" \
        "mmcrootfstype=ext3 rootwait\0" \
        "nandroot=ubi0:rootfs ubi.mtd=4\0" \
        "nandrootfstype=ubifs\0" \
        "mmcargs=setenv bootargs console=${console} " \
                "${optargs} " \
                "mpurate=${mpurate} " \
                "vram=${vram} " \
                "omapfb.mode=dvi:${dvimode} " \
                "omapdss.def_disp=${defaultdisplay} " \
                "root=${mmcroot} " \
                "rootfstype=${mmcrootfstype}\0" \
        "nandargs=setenv bootargs console=${console} " \
                "${optargs} " \
                "mpurate=${mpurate} " \
                "vram=${vram} " \
                "omapfb.mode=dvi:${dvimode} " \
                "omapdss.def_disp=${defaultdisplay} " \
                "root=${nandroot} " \
                "rootfstype=${nandrootfstype}\0" \
        "loadbootscript=fatload mmc ${mmcdev} ${loadaddr} boot.scr\0" \
        "bootscript=echo Running bootscript from mmc ...; " \
                "source ${loadaddr}\0" \
        "loaduimage=fatload mmc ${mmcdev} ${loadaddr} uImage\0" \
        "mmcboot=echo Booting from mmc ...; " \
                "run mmcargs; " \
                "bootm ${loadaddr}\0" \
        "nandboot=echo Booting from nand ...; " \
                "run nandargs; " \
                "nand read ${loadaddr} 280000 400000; " \
                "bootm ${loadaddr}\0" \
总之对于每一种板卡都有其特定的启动参数,这个是编译到Uboot里的。

七月十五日 现在需要的是熟悉内核开发

gumstix有三个必须要的启动文件:MLO/u-boot.bin/uImage我使用我的toolchain编译的来替换,只有当我替换u- boot.bin可以正常启动,这个让我只能认为MLO里有某些设置是和内核启动相关的。这个只有再研究才行。
又忘记了编译u-boot的方法: make ARCH=arm omap3_overo_config 其中的omap3_overo是一个在include/configs目录下的头文件的名字。
关于overo的串口线链接debug kernel纳闷了好久才想起来有两个usb是可以作为usb-serial来链接母机的。在ubuntu上kermit改名叫做ckermit,但是那 是安装名字,运行还是kermit至于gkermit我不知道是干什么用的。而我的lsusb可以看到内核检测到了设备但是/dev/ttyUSB0就是 没有,果然不出所料是我没有编译驱动,又要重新编译内核?但是且慢,我难道不能只是编译动态模块然后加载吗?太晚了,不过。。。
果然自动找到/dev/ttyUSB0设备,如今利用usb-serial我就可以直接脸上gumstix,同时看到启动的时候我的编译的2.6.39的 内核加载成功,u-boot.bin也正常,唯一不正常的是我编译的MLO一开始就抱出来u-boot.img错误,现在还摸不着头脑,估计是有什么 uboot的配置的问题?当然现在我编译的omap3的内核既没有鼠标键盘支持也没有网卡的支持,看来要重新编译内核。
这个是我的gumstix的规格,老是忘记:overo tide
Overo In the Overo series
Architecture ARM Cortex-A8
Temperature Built with components rated 0C < T < 85C
Processor Texas Instruments OMAP3530 Applications Processor
Processor Speed 720 MHz
Digital signal processor (DSP) C64x+ digital signal processor (DSP) core
Graphics OpenGL POWER SGX™ for 2D and 3D graphics acceleration
NAND 0 MB
Performance Up to 1,400 Dhrystone MIPS
2 x 70-pin AVX connectors Included
Camera Connector 27-pin connector for camera signals
Layout For OEM design, use layout version R2606 or later, shown here.
COM Mounting Holes Four (4) x #0 mounting holes for securing to Overo-series, or custom, expansion board
Power Management Texas Instruments TPS65950
Weight GS3503T @ 4.3g
GS3503T @ 15.1g (incl. shipping case)
Length 58 mm
Width 17 mm
Height 4.2 mm
Power Powered via expansion board (Overo series or custom) connected to dual 70-pin connectors

扩展版是tobi:
Overo Within the Overo series of products
Temperature Built with components rated 0< T <70C
2 x 70-pin AVX connectors Included
DVI-D (HDMI) HDMI
USB Host Included
USB OTG Included
USB Console Included
Battery connector Battery holder for 6mm rechargeable coin
40-pin header Not populated
Stereo Audio Stereo Audio In /Out jacks
COM Mounting Holes Four (4) x #0 mounting holes for extra secure mounting of any Overo COM
Case Mounting Holes Four (4) x #2 mounting holes to secure this Tobi board inside a casing
Weight BRD30002 @ 29.0g
PKG30002 @ 67.3g (incl. shipping case)
Length 105 mm
Width 40 mm
Power 3.5V - 5V

网卡是一个非pci的东西,从来没有听说过: smsc lan9221-abzl。在ethnet driver下面选择smsc 922x的family的驱动。
DVI TFP410 DVI Controller这里是datasheet.
usb我觉得我压根就不需要关心,但是为什么Hid不工作?重新编 译尝试hidraw的驱动,目前smsc 922x的驱动加入了网卡工作了。
make ARCH=arm CROSS_COMPILE=${CLFS_TARGET}- uImage
通过usb mini A接口连出到我的主机上实际是一个特殊的usb-serial设备,他的芯片是FTDI 1025 B,就是在usb mini A的旁边它还自带一个lcd,这个需要我的主机编译内核加入usb convert serial之类的驱动。这个是在没有网络的时候最好的方式,我早上在想的一个问题就是这个东西是一个原理类似rs232之类的jtag一样的调试器,只 是结果上看,就是不知道能否输入?估计是不行吧,这个想法太离谱了没有常识。
早上发现了一个疏漏,原来的内核要使用branch omap3.2我一直编译2.6这个可能是大问题?
git clone git://www.sakoman.com/git/linux-omap-2.6 linux-omap
git checkout omap-3.2
make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi- omap3_defconfig
make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi- menuconfig
make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi- uImage
make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi- modules
重新编译omap-3.2的内核hid都工作了。
这个是关于omap bootloader非常号的解读

七月十六日 现在需要的是熟悉内核开发

很搞笑的片子是《The Man with Iron Fists》,Lucy Liu成为一个妓女杀手团的团长兼老鸨,Russel堕落到排这部搞笑片子的嫖客,香港的一个什么很面熟的白痴担任主角并导演,片子的格调很低近似于三级片,想不到大名鼎鼎的Russel因为中年发福竟
然出演这种片子,看来老家伙也是爱才呀,里面美女如云床戏莲台。
看了好久才明白ld.bfd是一个这样子的程序:据说带边binary format dll我颇费了一点点时间阅读,这片文章还是相当有教育意义的,可惜我现在还很难消化。
关于我的MLO不能启动的问题真的是颇费了我一些时间,有两个问题:
1.关于MLO的格式,我现在编译的包含了一个所谓的chsetting,根据这里的说法是可以包含一些mbr之类的设定?不是很确定,不过无所谓的,我直接把这个512byte的头斩掉也是可以的,(且慢不行的,除了一些错误,不过这个是和内核无关是我预装的angus
的兼容问题,让我实验用原生的带chsetting的实验一下)
第二个是什么问题我现在也不明白了?头脑十分混乱,折腾了整整一天啊。
我查看代码的配置./include/configs/omap3_overo.h里面的#define CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME "u-boot.img"让我很不理解,明明是要找u-boot.bin的吗?而且启动的错误也这么报的?
但是我改了就编译错误,完全有些不解。我尝试用u-boot.img代替u-boot.bin依旧有问题,不过我可以打断正常u-boot进入一个他的一个命令行界面手动配置u-boot,
make ARCH=arm CROSS_COMPILE=${CLFS_TARGET}- omap3_overo_config,我现在把SPL部分全部注释禁止了再试验一下。看来不行,因为spl才能编译MLO,这个在makefile里写的很清楚,我看到过这个。而TI的rom bootloader只会load这个
MLO,所以,后来我把我的omap3_overo.h的CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME改成了"u-boot.bin",这个当然可以正确启动,但是我的kernel和angus有兼容性的冲突,我估计是我用glibc的编译之类的,不过很奇怪的是如果我用官方的MLO配
合我自己的u-boot.bin和我自己编译的uImage却能够很顺利的运行,说明MLO里面有写玄机,这个真实很让人头疼。不过我现在在想如果我直接在arm上编译uboot会怎样呢?
直接编译出来的MLO/u-boot.bin依然和系统有冲突,看来不仅仅是toolchain的因素,很可能是官方的MLO有什么设置。 非常疲惫也很困惑,不过这个并没有什么十分重大的障碍,我的目的并不是成为u-boot的专家,而是怎么搭建平台,我想如果我从头编译
文件系统的话应该就没有这个问题了,我还猜想这个也许就是传说中的glibc与uclibc之类的冲突的问题把?这个有omap的官方手册
我明天想要从头作一个ubuntu。

七月十七日 现在需要的是熟悉内核开发

毫无头绪,决定使用Ubuntu现成的镜像来实验。这个是所谓的img,这个我现在不算是非常陌生了,就是一个dos启动区加上一个linux文件分区,问题是这个东西原本是SD卡的,我现在用microSD可以吗?还有我其实需要的是所谓的ubuntu的文件系统的镜像,
因为这里有启动文件的下载。拷贝的命令是解压缩再写入设备: gunzip -c ubuntu-12.04-preinstalled-server-armhf+<omap or omap4>.img.gz | sudo dd bs=1M of=/dev/<device name>
这个是我需要很久的如何在Uboot下命令行启动的方法:
# mmc rescan 0
# fatload mmc 0 ${loadaddr} u-boot.img
从原始的Img拷贝来的只有2G启动的时候报错说resize partition不行,决定用gpartd来试一下。我不打算用swap。我决定备份文件自己重新作分区看看。

七月十八日 现在需要的是熟悉内核开发

这里说u-boot有新分支,同时Linux kernel也出现了omap-3.6的新分支,决定实验一下。
这里是u-boot的文档,可是我目前的问题主要也许不是Uboot因为虽然表现上arm-ubuntu-server的镜像好像是错误的把文件系统mount促成只读,看起来是u-boot的问题,不过说到底仅仅是u-boot的配置的问题,我自己从源码编译的u-boot就可以正确
的resize root partition而没有问题,现在的核心问题是我还找不到arm-ubuntu的编译的方法与文件系统制作的流程,不过这个估计是不会有官方的资料的,这个东西说起来很玄奥,实际就是一个体力活也没有什么太大的玄机,不值得公布,但是有足够
折腾人属于典型的吃力不讨好的东西,没有什么人愿意作,因为有能力的人自己就去做了,用不着说了。u-boot新版的omap3_overo.h配置中还是把CONFIG_SPL_FAT_LOAD_PAYLOAD_NAME定义为u-boot.img这个是什么意思呢?
这个说的很好,因为重新编译MLO/u-boot.bin实在没有多少意义,有一个能用的版本就不要再折腾了,可以用改变参数而不是把参数hardcode在配置代码里
setenv bootargs 'root=/dev/mmcblk0p2 rw rootwait rootfstype=ext3 console=ttyO2,115200n8 vram=16M'
fatload mmc 0 82000000 uImage
bootm 82000000
编译指令:
mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Panda SD Boot" -d boot_mmc.txt boot.scr
内核驱动的编译现在对于我都不是问题,我现在最迫切的是rootfs的产生,这个emdebian给了我一个起步。我还是很喜欢以前用的debootstrap的方法的,看样子是类似的?
再次尝试我用我自己编译的MLO/u-boot.bin替代了官方的,然后启动ubuntu-arm成功了,但是还在反复配置。。。最后我只能用ctrl+alt+F6登录,也许这个本来就是server版的登录方式?我怀疑,因为我看shadow里压根没有任何用户设定了passwd
所以,我决定自己把自己加入这个文件,也许安装版是有一个设定初始用户的界面的吧??改了半天还想要在我的toolchain上运行修改用户密码,后来猜想这个不可能,而且最简单的就是把shadow里的root的*去掉不用passwd登录就好了。
现在我需要自己编译我的ubuntu,首先我需要知道uInitrd是怎么做的。这里的解释只有一点也许不太对,就是12.04是用xz压缩的,害的我google半天,不过我觉得我还是幸运的因为这位仁兄化的时间就比我多多了,这就是现在开发竞赛的一个特点,先行者
大豆很强或者很花时间,但是他们的优势在互联网的作用下显著的缩小了,因为你费尽心机找出的办法在后人眼里就是几秒钟的google的时间,当然那人的能力是不可同日而语,可是现如今我们大多数人呢,我们从知识上看看远远超过达芬奇之类的贤者,我们在
智力能力上与亚里士多德差的远了,不过这有如何?
让我写下我的计划因为我刚才就忘记了,现在的12.04是一个并非完美的环境我也许可以用这个作为工作平台,因为gumstix的原生的使用的是我不熟悉的系统,我担心问题太多,我现在需要的是重新编译内核的uImage/uInitrd然后在上面chroot编译我自己的
系统因为toolchain在我的本机上只能完成部分的工作。。。
这里说的太好了,原来如此,所谓的Uinitrd不过是u-boot的mkimage工具的一个小的包装而已:家了一个文件头。
mkimage -A arm -O linux -T ramdisk -C gzip -a 0x00000000 \
-e 0x00000000 -n initramfs-$v -d /boot/initrd.img-$v \
/boot/uInitrd-$v
我本来以为mkinitramfs是一个简单的脚本想要稍加改动用来产生我需要的initrd,结果看了半个下午越看越心惊,因为并不仅仅是路径设定寻找module的dependency然后cpio那么简单的事情,其中需要busybox的部分,其中选择合适的工具等等让我感到
很不确定,而且脚本大量的使用Hardcoded的路径压根就没有打算让你作为一个toolchain的工具的意思,我需要更多的时间,我隐隐约约觉得很多工具报出来的找不到initd的错误也许就是从这个工具的漏洞来的,
所以我看到这个cookbook还是很高兴的,但是我怀疑它对于initrd的做法的,可是仔细一看原来Ubuntu有这个port的所有image,难怪可以这样子。
找了这么久才找到了我需要的:使用arm/rootstock创建文件系统。太好了!
其实也不对,因为那个和debootstrap类似但是主要是针对qemu的,或者不能自己编译都是现成的,我可以用一部分,就是文件系统的创建部分,但是关于Mkinitramfs,最接近的还是这个clfs的东西。不过哦,我不喜欢busybox,因为这个东西如果我有真
的shell,我压根就不需要,除非我要的是纯粹的嵌入式的自己修建的版本。同时,看到它真么操弄Init我终于明白在cisco的时候看到的那个启动就进入的虚假的cli,它完全替代了shell目的是安全性,看来自己作Init是大家的最好的途径。

七月十九日 现在需要的是熟悉内核开发

编译busybox遇到了错误,据说是源自于glibc不在乎static的编译选项,更主要的原因是inet里的rpc功能似乎没有人感兴趣,总之,我没办法只好手动注释掉。
在我的系统上运行sudo 出现sudo must setuid root之类的错误,这个是解决版发: chown root:root /usr/bin/sudo ; chmod 4755 /usr/bin/sudo
extract uInitrd的步骤
1. file uInitrd 告诉你它确实是u-boot的uInitrd
2. 然后确定头的大小: /mnt/clfs/cross-tools/bin/mkimage -l ./uInitrd.gz
Image Name: Ubuntu Initrd
Created: Mon Apr 23 07:07:34 2012
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 6595947 Bytes = 6441.35 kB = 6.29 MB
Load Address: 00000000
Entry Point: 00000000
用实际文件的大小(uInitrd)减去6595947(data size)正常应该是64
3.  截掉头部: sudo dd if=uInitrd.gz of=initrd skip=64 bs=1
4.  cpio是用xz压缩的先要解压缩: mkdir tmp; cd tmp; cat ../initrd > unxz | cpio -id
5. 我认为我的内核仅仅和modules部分有关系,所以我只是把我的内核的安装到/lib/modules/"linux-kernel-version-number"目录下的部分拷贝到initrd里面再重新打包还原:(事实证明这样是徒劳的,没有那么简单。不能启动
find . | cpio -H newc -o | xz -z > ../initrdnew.xz
6. 加上u-boot的头:/mnt/clfs/cross-tools/bin/mkimage -A arm -O linux -T ramdisk -C gzip -a 0 -e 0 -n "omap3 with new modules" -d ./initrdnew.xz ./uInitrdnew

只好回过头来老老实实从头开始, 使用rootstock:  sudo rootstock -f nick-arm32 -l nick -p password -s ubuntu-desktop,build-essential,openssh-server,linux-image-omap --doswap --serial ttyS0
这里的问题就是我要解决的,但是似乎都不行???

七月二十日 现在需要的是熟悉内核开发

陷入困惑,也许需要寻求帮助,linaro也许是一个好的选择来建立文件系统,配合ubuntu-port的内核?需要尝试。
rootstock总是失败不得不寻找debootstrap的途径:这里我意识到在clfs的困境的解决办法,对于不同cpu架构是无法用chroot来作文件系统的创建的因为你没办法运行很多核心的syscall,所以才让我如此头疼的要建立一个基本的arm的工作平台,这个
奴隶是不那么容易的俄,现在有另一个选择就是使用模拟器qemu来在chroot环境下来安装,这个就是我需要的一个比较便捷的途径,否则单单建设稳定的编译环境就是一个头疼的,我现在才比较清除我为什么我死活都想把ubuntu安装到gumstix上,这个理由
就在于此,环境的搭建不是那么容易的俄,开发就是这个三三制,环境编码调试各占三分之一。

七月二十一日 现在需要的是熟悉内核开发

不自己建立分区完全依赖preinstalled image,你就直接dd就好了,何必要fdisk?不过为什么参数bs=4M呢?没有设定这个bs(blocksize)麻烦可达了,因为磁盘的写缓存是要非常优化才行,大部分的Linux文件操作都是写在操作系统的缓存里的,尤其
是存储卡这样的设备非常的慢,没有sync是万万不可的,当然也只有在umount的时候系统有时候才真正开始写。
链接gkermit的步骤:
nick@nick-server64:~$ ll /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 2013-07-15 19:32 /dev/ttyUSB0
nick@nick-server64:~$ kermit -l /dev/ttyUSB0
C-Kermit 8.0.211, 10 Apr 2004, for Linux
Copyright (C) 1985, 2004,
Trustees of Columbia University in the City of New York.
Type ? or HELP for help.
(/home/nick/) C-Kermit>set flow-control none
(/home/nick/) C-Kermit>set carrier-watch off
(/home/nick/) C-Kermit>set speed 115200
/dev/ttyUSB0, 115200 bps
(/home/nick/) C-Kermit>connect
Connecting to /dev/ttyUSB0, speed 115200
Escape character: Ctrl-\ (ASCII 28, FS): enabled
Type the escape character followed by C to get back,
or followed by ? to see other options.
我又忘记了,官方的Preinstall有问题是因为MLO/u-boot.bin有问题总是Mount文件系统只读。我折腾了太久了完全糊涂了。我自己的MLO/u-boot.bin
关于启动的serial问题,可能是这样
这里是我获得的kernel代码: git clone git://kernel.ubuntu.com/ubuntu/ubuntu-precise.git
这里是preinstall image 12.04.2要比较稳定,server比desktop好,因为resize partition在启动的部分有问题。参照Preinstall的boot的config来重新编译,不知道可以不可以,因为原本的smsc922x的网卡驱动有问题,我看到的错误是什么
一个udii_bus的什么东习有冲突。只把uInitrd的lib/modules下面替换看看。
编译运行和原本一样加载smsc的网卡有问题,但是至少是一个巨大的进步就是编译内核成功,制作initrd有鞋头疼因为一开始没有strip代码模块非常的大,找了很久才看到这个选项,在安装的时候:make INSTALL_MOD_STRIP=1 modules_install
今天总算有成果,接下来就是比较几个不同版本的内核看看为什么有的能够加载smsc成功,有的失败,应该也不是很难的事情,因为只有目标具体明确都不是太难了。好累啊。
尝试关闭一个udi_bus的设备,因为Log说的是它创建设备失败。管然成功了!太棒了,我现在有一点点佩服自己的了,对于现在这些简单的驱动的问题,配合google对我来说已经不是不能解决的了,毕竟我写不了驱动,难道还改不了驱动吗?最起码安装使用
总不成问题吧?哈哈!!!!
这个图很有用的。这里是overo的图很有用的。

七月二十二日 现在需要的是熟悉内核开发

这也许是一个很trivial的问题,就是在Mount一个ntfs的U盘的时候我用设备名而不是分区名居然不成功,比如:sudo mount -t ntfs /dev/sda /mnt/usb失败,需要sudo mount -t ntfs /dev/sda1 /mnt/usb才行。
我想赶快备份一下我的mmc上的Ubuntu12.04,这是一个不错的主意因为我有不少的u盘,普通的备份Linux文件我不是很放心。sudo dd if=/dev/mmcblk0 of=./backup.img bs=4M 这样子可能有问题,因为在没有gvfs-fuse支持的情况下exfat
好像都是被当作fat的,那么超过2/4G的文件都不行,所以,要先压缩一下:sudo dd if=/dev/mmcblk0 bs=4M | gzip -c >./backup.img.gz 不过我怀疑这样子bs参数是不起作用的,很可能这是非常慢的一个原因。 这就是hot-backup。
收到了"raspberry PI"(红梅派??),现在我有一个搭建的平台就可以作为开发平台搭建我属意的10.04了,因为12.04的图形界面太慢了,我其实也不完全需要图形界面,只不过多媒体的应用应该需要。下一步是寻找声卡。
1. 在我的新arm上作sudo debootstrap --arch=armel lucid lucid
2. 准备编译较新的内核,ubuntu10.04没有什么不好的,只要你的内核比较新就醒了,唯一对于开发者制约的是当你使用比较新的应用库的时候测试的人大多不再理会你这个平台你要自己找苦头吃,不过我应该不会去赶时髦。所以没有问题。

七月二十三日 现在需要的是熟悉内核开发

我在寻找一个理由说服自己为什么要去自己重新搞ubuntu而不是直接用raspberryPI现成的wheezy,一个很重要的原因就是在使用了两分钟后感到的:他的apt-get基本上都不全,我也不清除是否我可以转向别的mIrror来用,这个可能更加麻烦,除了
莫名气妙的问题后你能发现就是你的运气,你最好的解决就是自己重新编译所有的源码,这个看起来也不错,可是在arm这种很慢的平台上编译会让你疯掉,全部使用交叉编译的话也许也可以,但是。。。所以,还是ubuntu的port做的好一些,基本上常用的
软件都有,(如果lucid不再支持,那么apt-get的包是否也不再有了???)这是个问题吧?
raspberryPI在很大程度上和omap3-overo很像的,都是soc+pop memory的所以,我一开始看到hynix LPDDR还以为这个是cpu的制造商呢,实际上是内存模块。相比gumstix,raspberryPI缺少那个串口模块让人很头疼,非常的难折腾,你看不到
boot时候的情形。
好像要用到openssl,那么交叉编译需要这样子,还没有实验过。编译完了但是好像只有静态库,是否交叉编译只有静态库呢?
    export cross=arm-linux-gnueabi-
cd openssl-1.0.1c
./Configure dist --prefix=$HOME/opensslArm
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
make install
在/usr/lib/klibc/bin下面是大部分静态链接的/bin下面的命令,这个是制作initrd需要的。
非常号的总结了现有的desktop分类。可以尝试一下。
overo的one-page.

七月二十四日 现在需要的是熟悉内核开发

不知道这是不是ubuntu12.04的一个bug,就是eth0的设定似乎10.04的/etc/resolv.conf这个文件没有建立,同时/etc/network/interface也没有自动建立eth0的内容。我google了一下这样做的:
1./etc/network/interface  (难道是我编译内核没有选定dhcp?) 增加如下:
auto eth0
iface eth0 inet static
address 192.168.1.4
netmask 255.255.255.0
gateway 192.168.1.254
2. /etc/resolv.conf 内容
domain gateway.2wire.net
search gateway.2wire.net gateway.2wire.net
nameserver 192.168.1.254
nameserver 192.168.1.254
3. sudo ifup eth0
我欣赏王朔的话:在中国,旧的,天真的,自我神话的东西就是比别的什么都有生命力。
很多中国人一辈子的生活就是保守的圈子里打转转,谈不上什么更新。
把ubuntu12.04在omap3-overo的安装重新做了一遍,发现第一步安装更新也许有什么东西我没有编译到initrd里,所以:
1.使用官方的preinstall image: 不要用desktop,那么个有resize partition的问题。http://cdimage.ubuntu.com/releases/12.04.2/release/ubuntu- 12.04-preinstalled-server-armhf+omap.img.gz
2.使用我自己编译的u-boot的结果,官方的有错导致文件系统变成只读了。拷贝替 换启动区的。
3. 运行安装选择等等之后login你发现网卡在dmesg里面和uii_bus之类的有冲突。再替换我自己编译的内核版本。其中的lib/modules/3.2.48+要放在文 件系统下。(我可能没有strip,所以才这么大)
我想要安装lubuntu-desktop,但是好像单单安装这个还不得够,也许是因为我从server版来的,很多desktop自带的我都没有,尝试 先安装build-essential然后xorg。看样子我还需 要lxde-common,因为lubuntu-desktop就是在lxde至上的对吗?
终于找到原因了,我的Home里的.Xauthority是root创建的,所以我的startx进程无法锁定,要改成我自己。但是怎样自动login 呢,我想我看到过做法,大概是改init.rc之类的脚本吧?现在我还不需要。的确lunbuntu是一个非常快捷的桌面系统,我觉得不错。

七月二十五日 现在需要的是熟悉内核开发

这里解答了关于Initramfs的很多疑惑
以外发现原来有arm的版本,我之前没有看到!白痴。解释的也不清楚这个给出了明确的定义:

Texas Instruments

OMAP3xxx

armv7

VFPv3

NEON

Cortex-A8


有一件事情我想的不是很清楚,那就是我自己制作的toolchain是否可以编译任意的内核,我的想法是这个还是很危险的,因为从制作toolchain 的过程来看,你需要用到内核的头文件来制作gcc/libc,而且libc更是需要用到内核的代码,大体上头文件更改的机会不大,而且危害也不明显,最幸 运的就是直接crash因为某个结构改动了,或者更幸运的告诉原因。但是glibc肯定是内核相关的那么编译另一个内核呢?我觉得非常的crazy。似乎 没有问题?因为没有想过这个问题是因为从user mode的角度看我用不同的内核,不
通的gcc是一直没有问题的,所以从来就没有想过交叉编译会有问题。不过我懒得浪费精力去google这个问题了,总之,交叉编译是一个巨大的黑洞,能够 正确运行本身就是一个奇迹,不要在人为的制造麻烦的了,我现在编译的时候连并行选项都不加了,因为太危险了。我仅仅一个环境变量忘记清空就导致一个商务的 工作报废,编出的gcc压根就不能用。
编译uclibc的时候有错误,必须 要加这个patch. 错误太多了,难怪arm版本本的clfs没有公布,因为可能根本就不行。之前我之所以编译通过,第一是不用uclibc/eglibc,而是直接使用 glibc,第二是不用复杂的fpu选项,所以,我怀疑我编译的内核版本很慢的原因再次,照理说omap3是一个相当的高端的处理器。
现在我要尝试完全依靠自己的探索,如果太困难,那么我就再回到我自己的glibc的道路而仅仅增加hardware floating的选项。太艰难了。
在编译gcc-4.6.3的第二步的时候必须要用这个patch改掉一些Hardcode路径:
echo -en '#undef STANDARD_INCLUDE_DIR\n#define STANDARD_INCLUDE_DIR "/tools/include/"\n\n' >> gcc/config/linux.h
echo -en '\n#undef STANDARD_STARTFILE_PREFIX_1\n#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"\n' >> gcc/config/linux.h
echo -en '\n#undef STANDARD_STARTFILE_PREFIX_2\n#define STANDARD_STARTFILE_PREFIX_2 ""\n' >> gcc/config/linux.h

cp -v gcc/Makefile.in{,.orig}
sed -e "s@\(^CROSS_SYSTEM_HEADER_DIR =\).*@\1 /tools/include@g" \
gcc/Makefile.in.orig > gcc/Makefile.in
其中的/tools/路径需要你自己的前期的步骤建立的toolchain工具的目录,比如你建立kernel,uclibc等的路径,(我不明白的地方是这个在clfs里是一个临时路径,并不是最终需要的,所以有一个tools和一个cross-tools这个我始终没搞明白。在
clfs这两个分开来似乎是非常必要的,因为否则就可能会把两个完全不同的工具搞混了!怎么办?
eglibc问题太多了,使用uclibc,遇到一个include/limits.h的问题,决定把它先拷贝到/tools/include,反正迟早要的,这个也不是产生的,一直都要的。
自己重新制作toolchain的努力暂时失败了,决定转向简单的途径,使用yocto/bitbake.
我对于这种安装Python2.7的做法表示怀疑。如果说有什么是让我抓狂的就算是Python的了,对于其他的c/c++的package总归能够应付,可是python一方面很强大几乎很多包都在用,另一方面实在是太混乱了。
看到我的虚拟机上实验安装的bitbake制作toolchain的输出是vfp-neon,这个也许是armv7a的fpu的类型,之前我使用gcc-4.7.3不行也许是因为fpu的选择问题吧?
现在不敢在我的宝贝主机上随意安装,只好现在虚拟机上用ubuntu12.04server+lubuntu-desktop的环境来尝试一下,ubuntu12.04的好处是有不少的软件的版本默认已经比较高了,至少有不少人已经在测试过了那个环境。10.04现在用的人也许越来越少
了。可是谁能忍受12.xx的图形界面呢?
我原来猛一看还以为是用symlink的无聊的办法,这个办法让我吃够了苦头,也许virtualenv不同了吧?
安装linaro的工具。

七月二十七日 现在需要的是熟悉内核开发

昨天是一个混乱的一天,我尝试了很多,而越来越混乱,在yocto/linaro/angustorm/bodhi/openembedded等等的乱其把杂的组合让我迷茫。究竟要用什么工具,什么平台,什么目标,什么内核,什么clib,首先,uclinux和uclib我不想继续,因为
他的有点是显而易见的,但是对于我来说也越困惑,这个类似与偏门,和主流的内核开发分离,你之所以选择新版内核很重要的原因是众多的新设备的驱动,你使用uclinux只能是一个特别的专项,这肯定是最好的选择,但是很不适合初学者。其次,没有开房源吗
的肯定是不可以的,有些虽然是有源码,可是另起炉灶使用另一套语言建构来编译虽然初期轻松,终极必然痛苦,我安装yocto的环境就是一个头疼的事情,最终在虚拟机上也不成功,只能放弃。linaro和bodhi和ubuntu关系紧密是一个好的选择,提供的
toolchain的源码和binary是一个很好的参考实践应该作为主要突破方向,其实众多的流派差别很多就在细微的库的选择上,libc是一个核心:是glibc还是uclibc,或者新出现的eglibc?gcc选择什么版本?内核选择什么版本?这些都是看起来简单实际上
费时费力艰难的事情。值得吗?工欲善其事,必先利其器。值得!
我仿佛也如主人公一样Hit the karmic wall,于是再看一遍《music and lyrics》有看到很多以前没有看到的,理解的更加深刻,这种艺术的享受是难以用语言表达的。
不知道这个Linaro行不行
我的记忆力太差了,做过的事情一作再做,使用所谓的rootstock本质上是使用debootstrap,那么在lucid下是什么结果呢?首先,在/usr/share/debootstrap/scripts下面lucid的脚本指向了真正的脚本gutsy,这里定义的default mirror是
http://ports.ubuntu.com/ubuntu-ports,那么看看这里究竟有没有armhf呢?没有!那么omap是什么启动镜像呢?是光盘或者网络。我曾经花了快一天时间试图改造cdrom的启动脚本,但是我彻底放弃了,因为你要对于plymoth之类的很熟悉才行,
我还压根就不知道行不行,连qemu都没有实验过那是白费力气。这条路走不通。是吗?????
读了wiki才明白一个简单的道理:为什么要Initrd,一段时间以来我一直迷惑为什么kernel里面有一个设置initramdisk的选项允许我把文件或者列表或者cpio的镜像放在kernel里,那么这个kernel的ramdisk和initrd是什么关系?这里终于点名了,
其实用脚趾头都能够想到的,我却没有。一开始的设计当然是从早期的Linux发现可以不但load内核还可以load也许什么文件之类的到内存方便内核启动初始化。但是随着内核越来越大,同时你喜欢整天编译内核吗?所以弃而不用转而放在单独的Initrd这样
一个额外的ramdisk,而这个工作是不用内核来做的,是bootloader之类的做的,同时内核所占内存是始终不能释放的,把那些很少用到的代码放在内核不是很浪费?而这个额外的initrd是可以卸载掉的,实际上内核启动以后并不做什么,真正启动运行的是
在initrd里的init程序,这个通常写成脚本不用编译,它负责初始化user空间的一切,比如创建/dev,这一点和早期的linux或者unix不同就是/dev不再是事先静态写好的Node而是动态创建的,这个我一直都没有意识到,知道看了udev的wiki才有概念,
内核和udev这个user世界的通讯是创建/dev下面设备的关键,user询问,kernel回答这个模式应该是很容易想到的,他们通过某种socket来通讯的(ksock?)。在/etc/udev/下面有些所谓的rules就是一个很好的例子告诉你在udev创建设备的时候
有什么规则,而这个规则又是动态生成的,是在/lib/udev/下面那些真正的关于各种设备的事先写好的规则。

七月二十九日 现在需要的是熟悉内核开发

这个大虾使用nand把文件系统tftp下来写入nand,然后永久保持每次都这样子作为initrd,确实是一个让人感到振奋的做法,我没有nand只能有一个概念作为借鉴吧。
昨天还是迷茫的一天,我始终不知道怎么使用linaro的toolchain,这个说起来真实丢人,难道这么简单的问题我都搞不明白?问题就在于如果没有给我binary的eglibc我需要自己交叉编译它,但是编译它是否本身需要一个编号的libc呢?这个和制作
compiler的递归问题差不多,制作过一次toolchain实际还是一知半解。在这两天集中精力搞明白linaro的toolchain,这个目标够明确的啊。
设定chroot环境还可以增加locale,这个有用。
我有一个想法,就是按照linaro的git代码重新在lucid上把toolchain作一遍,之前我之所以失败是glibc/eglibc的patch没有,现在这个应该是被他们解决了,否则也不可能编译了,那么他们所谓基于特定ubuntu版本的toolchain肯定是基于官方
ubuntu的环境。那么。。。但是这个有意义吗?这样子编译的内核能否正常运行于特定版本的ubuntu呢?又回到了老问题:toolchain的基于的内核和gcc/glibc/eglibc等的版本是否要和User环境下的匹配呢?我觉得不一定吧,除非是个别程序直接
和内核代码直接链接都是通过glibc,那么。。。glibc是内核与下界人间的桥梁,这个版本肯定要一直才行吧?除非真的做到向下兼容?不对,内核与user的代码都是分开的,唯一的桥梁是kernel的头文件,这个只要不变其实是无所谓的吧?google吗?
有一点也许有些明白了。
1. sudo apt-get install python-software-properties安装这个工具才能加上launchpad的ppa,
2. 这里把linaro的ubuntu10.04的toolchain加上:
sudo add-apt-repository ppa:linaro-maintainers/toolchain
3. 现在只有armel/gcc4.6版本的:
sudo apt-get install gcc-arm-linux-gnueabi
重温一遍使用rootstock做 法,据说这个不是推荐的做法,推荐的是使用Ubuntucore,我好像看到过这个。但是ubuntu-core对应的官方的编译的Kernel 是针对beagle主板的,我的overo起不来。
这个小 孩子的步骤也可以参考。

七月三十日 现在需要的是熟悉内核开发

qemu简直太q了,仿佛可爱颂一样的可爱,我用rootstock下载的arm文件系统拷贝qemu-arm-static到usr/bin然后chroot就一切可以了!太棒了!qemu真实太好了。
终于又找到了丢失的方法来创建ubuntu filesystem from scratch。我以前看到结果没有记下来就找不到了。
stage one:
sudo debootstrap \
--arch=armel \
--keyring=/usr/share/keyrings/ubuntu-archive-keyring.gpg \
--verbose \
--foreign \
lucid \
rootfs
stage two:
sudo apt-get install qemu-kvm-extras-static
sudo cp /usr/bin/qemu-arm-static rootfs/usr/bin
sudo chroot rootfs /bin/bash  (这里我用我自己的小脚本可以保证我mount所有的device,而退出的时候再umount不至于忘记,只需要修改"rootfs"的路径就可以了。)
/debootstrap/debootstrap --second-stage


这里有一个非常重要的关于用chroot进行cross-compilation的问题,其中设置apt/source.list的arch很有用(不过我还没有实验过),作者用的是i386,那么我的amd64的64位系统究竟是用x86-64呢还是什么?我略一沉吟猜想应该是amd64,因为
这里无非就是一个分辨包的目录的问题,看这里其后缀名是一目了然的。
我在我的chroot的arm-lucid里试图安装我的toolchain,对于ppa的加入不甚了了,心里明白大概就是source.list加一 个,无非就是安全认证的问题,可是具体就不知道了,看 了这里就明白了。这里给出的toolchain的deb路径。
http://ppa.launchpad.net/linaro-maintainers/toolchain/ubuntu/dists/lucid/main/binary-armel/
那么在source.list要怎么定义呢?首先,是deb http://ppa.launchpad.net/linaro-maintainers/toolchain/ubuntu 这里给出了跟目录,然后你给出你的系统名代号比如lucid,然后是包的类型名字main,那么arch怎么版呢?这就是作者最重要的贡献,他告诉
你要在开头定义[arch=armel],所以,完整的就是
deb [arch=armel] http://ppa.launchpad.net/linaro-maintainers/toolchain/ubuntu lucid main
一下就是我的chroot jail-break的source.list设置:
deb [arch=armel] http://ports.ubuntu.com/ubuntu-ports lucid main universe
deb-src [arch=armel] http://ports.ubuntu.com/ubuntu-ports lucid main universe

deb [arch=armel] http://ppa.launchpad.net/linaro-maintainers/toolchain/ubuntu lucid main
deb-src [arch=armel] http://ppa.launchpad.net/linaro-maintainers/toolchain/ubuntu lucid main
这个省却了安装“python-software-properties安装这个工具才能加上launchpad的ppa失败的问题”。手动加上就行了。
然后你总是遇到ppa的key不能验证的错误,这 里的这个脚本不能完全解决因为它找的是"deb http://"的prefix,而我们家了[arch=XXX],所以,手动加吧:
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com F1FCBACA7BE1F97B
这个是我折腾了好久不能改造它的脚本后拉发现这 个方法太简单了,我之前为了gpg的文件格式伤脑筋,虽然找到了key的文件,但是还是不确定怎样添加apt-key add什么样的文件。
在chroot后qemu之后我再打算安装交叉编译器?我是否有脑子进水?明明已经是Native了,怎么还要交叉编译?知道现在我才明白为什么 linaro要发布runtime的toolchain,这些都是arm架构的,叫他们toolchain有些牵强啊,因为通过qemu-arm- static的翻译已经不需要交叉了,这个叫做模拟器更贴切。
一定要使用linaro的qemu,否则没有overo的机器。报的名字是qemu-system,同时qemu-arm-static也需要。
deb http://ppa.launchpad.net/linaro-maintainers/tools/ubuntu lucid main
这个例 子告诉你怎么运行qemu的 模拟,所以,最好是哦我制作一个Image然后在上面的ext3分区上开发(先mount出来,在chroot进去使用qemu-arm-static) 而win95/dos启动分区单独mount出来拷贝编译好的kernel/initrd,这个样子可以首先在qemu上泡一下,不用老是在overo上 等待,同时拷贝mmc-sd卡非常的慢,经常出错。这条路线看来是最好的,这个是我这几天最大的收获:1.使用chroot配合 /usr/bin/qemu-arm-static模拟运行开发。2.直接使用qemu-system-arm来模拟运行sd卡的image。
qemu-system-arm -M overo -m 512 -sd ./test.img -clock unix -serial stdio -device usb-mouse -device usb-kbd

七月三十一日 现在需要的是熟悉内核开发

一个看上去有趣的东西,以后有时间再看。
这里就是我这几天摸索出来的,如果我早一点看到不是可以少走不少弯路吗?问题是之前我很可能也不是很理解,看到也不明白,或者还不愿意使用模拟器。
make uinstall实际上就是制作了uboot的启动套壳。
我的内核总是卡在等待mmcblk0p2上,看代码似乎是等待Probe存储卡设备,但是这里说是因为power regulator的驱动没有编译的关系。把twl4030加入试试看。

八月一日 现在需要的是熟悉内核开发

omap3 3530 datasheet
看了一眼代码感觉等待“Waiting for root device rootfs...”就是一个异步操作,另一个线程之类的写那个全局标志量,问题是为什么/dev/mmcblk0p2没有被安装或者没有被识别呢?这一点我也不缺定,但是现象就是在哪里等待的,(要不要打一个
log来确定呢?我现在可是没有能力去debug kernel代码啊,仅仅是配置编译安装级别吧。
虽然还是不能启动,但是至少我看到mmc0驱动安装的信息,这个至少是一个进步,之前压根就没有安装,所以。。。
看新闻说美国改变了统计方法就让经济一夜之间增长3.6%,相比之下中国的统计局每个季度都修改一下数据让中国这些年来GDP突飞猛进,看来还是统计数字的力量大啊。
怎样debug qemu?不知道管不管用?
升级了内核只因为要使用nbd模块,这个我以前没有编译在内核里的,图省事只好重新编译内核,结果拼音输入有了问题,只好盲打。为了制作mmc sd卡的image,找了很多的东西,原因是我怀疑我之前的做法有问题,要排除不能启动的原因是ext3文件系统的
可能行。

八月二日 现在需要的是熟悉内核开发

关于制作qemu的mmc sd image,虽然有很多的资料,但是也许这个脚本会给你一些不同的地方,最核心的问题就是在sfdisk的偏移量的选择,我至今也不明白究竟应该是多少。根据这个脚本应该是这样子的:dos分区: ,9,0x0C,*   linux分区,,,-
原始的脚本是这样子的,我改动了一些参数和默认大小,总的来说步骤基本不变:
1. sudo dd if=/dev/zero of=./sd.img bs=1M count=2K      (创建2G的镜像,和qemu-img create应该是一样的)size=1M*2K = 2G,计算sector的个数=size/512/63/255
2. sudo sfdisk -D -H 255 -S 63 -C sector-number-calculated  ./sd.img
3. 在sfdisk 的选项分别为: ,9,0x0C,*   和 ,,,-
4.现在需要mount两个分区,首先计算偏移量,使用file或者fdisk -l -u都可以告诉你两个分区的其实偏移sector,乘以512就是偏移
sudo fdisk -l -u ./sd.img
This will show you the start "sector" of two partition.
offset1 = startsector1*512
offset2 = startsector2*512
sudo losetup -o offset1 /dev/loop0 ./sd.img
sudo losetup -o offset2 /dev/loop1 ./sd.img
5. Now we need to create file system to device "/dev/loop*"
sudo mkfs.vfat -F 32 -n "boot" /dev/loop0
sudo mkfs.ext3 -L "rootfs" /dev/loop1
*********************************************************************************************
 sudo mount -t vfat -o loop,offset=startsector*512 ./sd.img ./boot      
sudo mount -t ext3 -o loop,offset=startsector*512 ./sd.img ./rootfs
这个作发和我之前的没有什么大的区别,主要就是偏移的设定不同,而且不知定dos分区的大小。
想要知道mounted的uuid, tune2fs -l /dev/loop1
chroot非常的危险,因为直接导致我主机关机。
我的sd image发现dos分区失去了boot标志,不知怎样回复,只好重来。
我发现我的u-boot总是穿参数给kernel 一个无效的uuid,后来发现是boot.scr犯的错,修改这个很容易,格式就是72bytes的u-boot的头:mkimage -A arm -T script -C none -n "My Boot.scr" -d /tmp/boot.script /mnt/boot.scr
fatload mmc 0:1 0x80000000 uImage
fatload mmc 0:1 0x81600000 uInitrd
setenv bootargs ro elevator=noop vram=12M omapfb.mode=dvi:1280x720MR-16@60 mpurate=500 root=UUID=faed551b-9b0d-42d1-b6f7-5ed1337256b3 fixrtc quiet splash console=ttyO2,115200n8
bootm 0x80000000 0x81600000
这个是范例,注意我的uuid在这里hardcode了所以要是换了磁盘就要改动,不用重新编译uboot/MLO。以上的格式也很简单,mmc的0是第一个mmc设备,:1是第一个分区,所以,uInitrd是只读的,“ro“。console的设定要根据设备,overo是要这个。
但是这里使用uuid也会失败???好像要用root=/dev/mmcblk0p2
而在文件系统/etc/fstab里我就翻了错误,在哪里继续使用uuid,这个就是典型的从uInitrd启动和不需要这个的区别,在uInitrd里面设备就是已经创建号了/dev/mmcblk0,不再使用uuid,具图原因我不清楚,但是结果就是这样子。
至此,kernel启动实际上已经结束了已经sys_chroot到了文件系统了,出什么错都和kernel无关了。我是这么认为的
《The Whole Nine Yards》,我只花了一分钟就认出来这个片子是在Montreal拍摄的。片子平淡无奇,甚至很naive,raw,很绰列,说白了就是有些小演员想要藉bruce willis的顺风车去好莱坞发展,而它看重的是这部轻松的小电影的酬劳和加拿大的
夏天旅游,montreal一周游。
我现在的错误的关键就是这里:
[ 2.874511] mmc0: host does not support reading read-only switch. assuming write-enable.
Loading, please wait...
mount: mounting none on /dev failed: No such device
要去看代码才能在debug!先吃饭把。而作为对比正确的是这样子的:(是否有什么特殊的模块加载?也许看看成功的版本的可以有些端倪。1.看错误代码。2.比较成功的例子的配置)
overo SoC init
mmc0: host does not support reading read-only switch. assuming write-enable.
mmc0: new SD card at address 4567
mmcblk0: mmc0:4567 QEMU! 1.00 GiB
mmcblk0: p1 p2
我的编译命令,这个是在rootstock制作的arm-ubuntu-lucid下使用qemu-static-arm环境下编译内核。
#!/bin/bash

LOG=/root/run.log
echo "*********************************starting compilation *****************************************"
make -j10 uinstall modules | tee -a ${LOG}

make -j10 INSTALL_MOD_STRIP=1 modules_install | tee -a ${LOG}
make -j10 headers_install firmware_install | tee -a ${LOG}

RELEASE=`make kernelrelease`
echo "release is ${RELEASE} ..."
update-initramfs -c -k ${RELEASE} | tee -a ${LOG}

mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 -n "ubuntu-lucid-${RELEASE}" -d /boot/initrd.img-${RELEASE} /boot/uInitrd-${RELEASE} | tee -a ${LOG}
cp -v /boot/vmlinuz-${RELEASE} /boot/uImage-${RELEASE} | tee -a ${LOG}
echo "*********************************ending compilation ******************************************"
制作initrd是依托/usr/share/initramfs-tools下面的工具,于是我就开始编辑Init里的log一行一行的debug,这 个相对来说容易,因为不需要编译kernel,你只需要重新编辑initrd,这个就是Initrd的重要的存在的理由,配合编辑boot.scr来改变 启动参数,基本不触动kernel,目前我看到的好像很搞笑,我居然没有把devtmpfs编译到内核离去,这个是在device- driver/generic driver里面的,很可能我错过俄。试验一下。
折腾到半夜,得出的结论是upstate的/etc/rc下的一些东西失败了,和Mount rootfs现在没有关系了,因为mount虽然报道说ext3有错误但是应该是可以忍受的。无非就是逻辑大小和实际大小有差别,这个我不知道怎么解决, 因为是在image文件里的文件系统,我使用e2fsck总要求不能mount,除非我用真的sd卡来看看。

八月三日 现在需要的是熟悉内核开发

怎样修复文件系统呢? (Assuming you have a qemu MMC SD card image file of "sd.img" which has parttiion 1 as dos/win95 and partition 2 as ext3 linux, but somehow corrupted during running. This is
espeically true when you compiling your kernel to assume "non-removeable" mmc.)
1.First you need to know the mounting offset:
sudo fdisk -l -u ./sd.img
Device Boot Start End Blocks Id System
./sd.img1 * 63 144584 72261 c W95 FAT32 (LBA)
./sd.img2 144585 29350754 14603085 83 Linux
so, we know the offset is 144585*512=74027520
2. now, let's mount to charge!
sudo losetup -v -o 74027520 /dev/loop1 ./sd.img
3. Before repairing, we need scout where it is going wrong:
sudo mke2fs -n /dev/loop1
...
At bottom, it has something like info of backup of super blocks:
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208
These are what we need to restore our file system.
4. try recover super block by first backup super block with:
sudo e2fsck -y -b 32768 /dev/loop1
here the "-y" is important, otherwise you have type thousands of it!
5. housekeeping and remount file system:
sudo losetup -d /dev/loop1
sudo mount -t ext3 -o loop,offset=74027520 ./sd.img ./rootfs

God damned! My files are lost! Don't do this!
扁鹊蔡桓公立有间
扁鹊曰:“君有疾在腠理,不治将恐深。”桓侯曰:“寡人无疾。”扁鹊出,桓侯曰:“医之好治不病以为功。”居十日,扁鹊复见,曰:“君之病在肌肤,不治将
益深。”桓侯不应。扁鹊出,桓侯又不悦。居十日,扁鹊复见,曰:“君之病在肠胃,不治将益深。”桓侯又不应。扁鹊出,桓侯又不悦。居十日,扁鹊望桓侯而还
走。桓侯故使人问之,扁鹊曰:“疾在腠理,汤熨之所及也;在肌肤,针石之所及也;在肠胃,火齐之所及也;在骨髓,司命之所属,无奈何也。今在骨髓,臣是以
无请也。”居五日,桓侯体痛,使人索扁鹊,已逃秦矣。桓侯遂死。
2009===>在腠理
2010===>在肌肤
2011===>在肠胃
2012===>在骨髓
2013===>桓侯遂死

八月五日 现在需要的是熟悉内核开发

已经跨出了内核的泥潭?现在都是rc的启动的各种service的问题,这个应该相对是容易的?我在mount的选项里家了sync,否则每次修改都要Umount/mount。
要理解启动必须阅读这个:什么是systemV,是否我的问题可以用upstart解决,或者说,究竟什么是upstart。
在这里/etc/init/rc-sysinit.conf修改runlevel=3,对吗?  放弃了lucid,还是用precise把,这里是禁 止bluetooth daemon启动的方法

Add bluetooth driver to the blacklist so that it’s not loaded by the kernel at boot time:

% sudo vi /etc/modprobe.d/blacklist.conf
# Add this add the bottom of the file:
blacklist bluetooth

You can prevent starting the daemon during the startup sequence with:

% sudo update-rc.d -f bluetooth remove

Additionally, you can also edit the file:

/etc/init/bluetooth.conf
# add "never" to the start on line:
start on (never and started dbus)

I am not sure this is needed after you’ve blacklisted the driver, but in case the daemon keeps running in the background, this will make sure to stop it after boot time:

% sudo vi /etc/rc.local
/etc/init.d/bluetooth stop
# Make sure to add ^^ this line ^^ before exit 0
exit 0

八月六日 现在需要的是熟悉内核开发

折腾了半天才认识到只能让dos分区从128sector其是否则Omap/uboot不忍。而且分区大小好像必须是130944sector,否则也有问题。
kenel代码编译完了有俩三个G,为了制作方便,我不打算拷贝来去,而是用mount --bind的方式把它mount到我的chroot环境里,否则sd card的image要分配十几个G实在是太慢了。拷贝都要很久。但是就担心忘记了卸载,因为我经常要Umount否则似乎
没有办法保证sd.img得到我通过loop mount的写的结果,尽管我已经用了sync的选项。这个很麻烦。

八月十日 现在需要的是熟悉内核开发

这个的camera可能会有用。我的camera是caspa VL
这个是驱动?需要i2c来通讯?这个对我来说太难了吧?据说使用的是omap的isp(image signal processor)模块通道。这个硬件啊是不是都不生产了?基于这个内核版本吗?
不过简单搜索好像内核3.2都已经有了,先实验新版内核吧?(mt9v032.c)
这个是camera sensor mt9v032的datasheet. 这里是更多的资料。这里说的我现在早已经再做了,不过他要你手动设置bin_fmt的过程似乎不需要把?因为我都是仅仅拷贝qemu_arm_static就醒了。

八月十一日 现在需要的是熟悉内核开发

我的overo始终不能检测到aptina的cmos sensor,我已经把内核的mt9v032模块编译在内核了,难道需要什么主动检测的过程?我现在都不明白这个是一种什么样的设备,怎么通信的?gpio吗?
这是一个非常困难的工作,我的猜测是这个初始化的工作要overo自己作,因为这个不是什么标准设备,只有通过i2c的串口通信,那么driver是油了,怎样初始化应该也不是很复杂,主要这个测试很困难,我要自己编译debug,而完全不知道这条路是不是走的
同?这里的代码应该可以参看。aptina公司给出了一个官方的驱动代码但是是v034的,应该也仅仅作为参考,痛疼的是那些所谓的gpio的设置把?对于一个毫无硬件经验的人是否应该冒险呢?我不是不想做,而是怕这么作是被人笑话的不自量力。这个行为是不是
对于专业认识的侮辱呢?要好好研究才能动作,任何的差错都是失败。
八月十二日  现在需要的是熟悉内核开发
只有不选择Autoselect ancillary drivers才能选择mt9v032的选项,这个飞了我好久才发现。
为了理解camera的工作,需要阅读aptina的文件,我一直觉得这个很眼熟,google才发现这个就在我在paypal上班的附近,难怪我对此有印像。硅谷里藏龙卧虎太多了。
为什么我的ibus没有正常工作?

八月十三日 现在需要的是熟悉内核开发

aptina很谨慎的,压根就不给技术资料。我的感觉这个v34/v32是软件的编号,大体就是技术支持所说的寄存器地址和值得一些改动。但是这个工作还是几乎超过我的能力的,目前单单从各个人的内核代码看,有的人把这个作为一个模块,用板子的初始函数初始
而主流内核似乎是把这个作为i2c的驱动由i2c在初始化的时候统一来做,我决的这个似乎是更加合理的,可是aptina的官方代码是前者,编译合并代码仅仅是工作的一部分,最重要的我现在连一个稳定的平台都没有,ubuntu-precise不知道为什么总是崩溃,
一开始认为是ext3文件系统之前强制断电损坏,重新来过也还是有错,更要命的是看到启动后不再正确初始化显示驱动,只是使用serial口只能预示着问题很多。所以,现在需要稳定,否则将来更加的混乱。同时交叉编译太慢是一个头疼的问题,想要尝试不用
chroot的原生环境而是使用真正的toolchain来看看,主要是编译内核,和ramdisk无关不需要完整的运行环境。
这个不是第一次了,如果抱怨说没有makeinfo,那么你要装的package是texinfo,我准备自己编译toolchain的源代码,这个是在debootstrap之后chroot环境下的。为什么呢?当然是快的关系,比rootstock之后用qemu-static-arm然后用chroot
要快,因为是本地代码运行而不是bin_fmt的翻译。然后要制作initrd的时候再用后者。我十分的粗心不耐烦,以为编译toolchain也不过是configure/make/make install的三部曲,实际上失败之后看doc才明白这才是开始,你只不过编译了ct,编译
是ct-ng build,要去邮局取信了,回来在看看。之前要automake,bison,flex,texinfo,gawk,libtool,curl
遇到sysinfo.h找不到错误,应该是我没有安装binutils的缘故?不对,这个是我自己的当前的内核的代码部分,因为我自己是customized的kernel,所以,我在lucid上建立的debootstrap的precise的环境,然后chroot那么我要编译toolchain
他要知道当前的内核和目标,当前我还是我在lucid上的内核版本,所以只好把内核代码拷贝到我的chroot下的precise的/usr/src下面,然后制作一个linux的软链接指向它。看看能不能行?
实际上这个ct-ng就是一些脚本下载编译toolchain的工具来编译,这个和你按照lfs(linux from scratch)教程本质上一样,不过应该更加的可靠吧?也许吧?4.6的sysinfo.h的问题我没有头绪,这个因该是toolchain自带的?决定尝试4.7.
去看电影《Elysium》感觉有些上当,反正比较搞笑以至于我都对于另一部搞笑片<Miller家族>都懒得看了 。故事很简单就是恐怖分子和电脑黑客怎样入侵美国国土安全局的数据库把所有在美国的非法移民的身份改成公民以便享受奥巴马总统倡导的全民医保的
福利。你相信吗?如果你相信那么你就在搞笑,因为我原来以为我是在搞笑的。另一个版本就是一个<district9>的导演喜欢小时候看的《机器战警》(robocop)决定重拍一遍顺便向全体美国人民解释什么是真正的“嵌入式系统“---使用电锯切开颅骨将x86处
理器“嵌入“脑髓使用usb线连接一个安置在后脑勺的4.3“三星LCD和联想笔记本通过itune进行数据同步下载到SD卡,这个过程就是一个“嵌入”式系统。埃,看了就知道谁是白痴了。
ct-ng配置有些麻烦,因为eglibc只能用svn,我要安装subversion,同时早期使用svn协议已经不行要用http协议:http://www.eglibc.org/svn/branches/eglibc-2_12/
所以要重新配置。
决定放弃编译toolchain看来问题不那么简单。
总结一下我的工作流程:
1.ubuntu10.04已经不再被支持,所以,工作平台要用ubuntu12.04server版本。可是我的主机是ubuntu10.04不想升级,所以,只能运行chroot的12.04
2.用debootstrap制作一个x86-64原生的12.04作为交叉编译的平台,安装必要的软件,比如toolchain,需要multiver/universe之类的安装gcc-arm-linux-gnueabihf,编译的时候使用普通的cross_compile=arm-linux-gnueabihf-即可,
这样子速度很快。主要用于编译内核。
3.initrd的制作需要用到arm原生的库和bin之类的,为此使用rootstock制作一个arm版的12.04,也用chroot把debootstrap安装的modules拷贝到本地运行update-initramfs制作initrd。安装uboot-mkimage来制作uInitrd。
4.使用工具制作一个sd卡的镜像,分别把dos和ext3恋歌分区mount,拷贝rootstock的文件系统和以上编译的uImage/uInitrd到boot分区。制作必要的boot.src配合用u-boot编译的MLO/u-boot.bin来启动。
5.运用qemu-system-arm来启动sd卡的镜像省却了拷贝sd卡的繁琐。
这里是以上的相关脚本
八月十
日  现在需要的是熟悉内核开发
山中无日月,悠忽好休闲。折磨了快一天的问题可能有些端倪,就是当uInitrd太大了,比如三十几兆的时候总是报说crc出错,我现在还不是非常确认,只是对比两个版本同样编译过程唯一显著区别就是大小。看uboot的代码似乎crc的计算是用一个表。
也许不是size的关系,也许是什么配置?原因也许是我昨天试图编译toolchain把环境搞乱了,重新debootstrap了一个似乎没有问题了?
花了一两个小时想要搞明白怎么激活comcast的internet,我买了motorola docs3.0 sb6121r的cable modem,然后看到comcast说技术服务不支持linux,这个让人有些哭笑不得,因为使用linux的人应该是不需要这类简单的技术支持的,可是也
没有可能说插上同轴电缆就自动链接英特网吗?搜索了半天下载了厂家的说明书才看到他的配置ip是192.168.100.1,这个也不是很有用,拔电源重启才真的进入comcast的激活网站,看来是我目前的at&t的无线router的干扰吧?总之,我现在理解所谓的激活
大概就是把用户的cable modem的mac地址记录下来再分配ip地址的过程吗?好像cable modem有开源?而那个伴随我很多年的当年花了十块钱买的老旧的无线router依然能够工作,重置之后的Ip是192.168.1.0,当然这个在ubuntu下用route -n就能够
找出来,可是当年我在windows下就是不知道怎么办才好。
写了一个简单的脚本把握的工作自动化了一点,基本上就是配合之前的脚本
TNND犯了一个大笑话,这个根本不是bug或者问题: init: failsafe main process killed by TERM signal,这里的解释很清楚:

 'failsafe' is a job that will force the boot to proceed should that be required.

The job will always start but in the normal case (where no problems are detected) it will be stopped automatically using SIGTERM as shown by the message.

I am doing a wild goose chasing!

八月十七日 现在需要的是熟悉内核开发

这个其实是很基本的道理,可是我连概念都没有才会走了这么多的弯路,撇开网卡smsc和mii_bus之类的冲突不谈(就是总是创建一个/dev/的一个bus的文件总是失败),qemu网络不通的根本原因是要理解虚拟机的网络工作原理,仅仅一个概念就应该意识到
问题是什么,除了客户机自身的网卡设备的模拟,qemu本身要模拟一个网络环境,然后在通过bridging的技术和主机的真实的网络环境相呼应链接,这个是很粗前的道理,我却因为用惯了virtualbox变得傻了,以为网络自然而然就会有只要客户机的网络设备
正确加载就醒了。那么这里要求运行qemu先创建bridge,我运行brctl addbr br0总是报错:add bridge failed: Package not installed这个本来很好理解是内核的组建模块没有加载,可是我愣是看不懂,也许是因为所有的解说brctl的只是强调
这个是一个工具sudo apt-get install bridge-utils,让我没有意识到这个不是user space的库,而是需要内核支持的:Make sure those are enabled in the kernel configuration:
CONFIG_BRIDGE (http://cateee.net/lkddb/web-lkddb/BRIDGE.html)
CONFIG_BRIDGE_NETFILTER (http://cateee.net/lkddb/web-lkddb/BRIDGE_NETFILTER.html)
The first should enable bridging in the kernel and the second one should allow using iptables on bridged eth.
看了一下好像单单编译模块还不一定行,难道又要重新编译内核?上一次升级就造成了很多的问题,我是真不愿意编译内核了,能不能仅仅编译模块呢?
选择CONFIG_BRIDGE为模块但是不选择CONFIG_BRIDGE_IGMP_SNOOPING因为这个一定要编译到内核里,不能编译成模块,我不想升级内核,看能不能混过去。我现在不确定我这样子编译模块的过程会不会有问题,就是make modules,过去有印像内核
有什么模块版本的问题,试验一下吧。我的理解是我只是改变了initrd的东西,照理说应该不会改变内核的一致性吧,我是很小心没有改变内核的配置的,除非我的工程之前不小心改了?让我先对比一下config再说!那么这个就是moment of truth,看看
重启会不会影响到其他对于内核敏感的应用比如virtualbox,之前每次比那亿内核都必须卸载它重新编译,因为她有一个所谓的dkms之类,大概就是动态内核模块的东西把?重启了。。。
教训是惨痛的,我差一点无法恢复原因是我的内核版本虽然有备份,但是Initrdimg却始终只有一个,(update-initramfs没有一个好像内核一样的备份旧的机制,我也就忽略了,原本以为大不了就重启旧的内核,但是问题是所有的内核都使用同一个Initrd
那么当我这个ramdisk编译和内核有冲突的时候导致所有的内核版本都是不可以用的,勉强启动很快就死机,是彻底的死机就是重新开新的tty都不行的,很显然是内核崩溃了,这个就是学的教训,我那种编译模块的方法是不行的,要严格按照别人说的去做,这个
要在学习。而我之所以之前处变不惊对于编译内核如此大大咧咧是因为我有ubuntu-lucid的livecd的iso在我的硬盘上在grub菜单上已经可以随时启动livecd来修复文件系统,但是在我试图chroot来重新编译内核的时候还是迷惑了我一下,因为报错说内核
的头文件找不到,后来才恍然是我的磁盘mount太多了,包括Home都是不同的磁盘,所以要把所有的磁盘都严格按照以前mount才能还原环境,然后就是重新编译内核在重新启动,这就没有什么大不了的了。其实,充其量只要给我一个能够启动的版本我重新编译
内核就可以了,只是Initrd没有备份是一个致命伤,我要像个办法防止在发生。
八月十
日  现在需要的是熟悉内核开发
我阻止了版本号的本地递增于是没有什么好办法阻止内核版本的保存。实际上我没有修改代码只是配置,所以理所当然不应该有版本号的变化,这也是合理的。所以只能自己备份了。索性把所有的网络协议都编译到模块了。

八月十九日 现在需要的是熟悉内核开发

怎样修正gateway:sudo route add default gw 10.0.0.1 eth0
网络不正常,折腾。买了一个硬盘盒子,觉得这个就是我需要的,与其折腾再花钱在旧电脑上不如就把硬盘接入就好了,我的问题其实就是sata接口不够,那么 现在改成usb也凑活了。
这里的设置可以让qemu成功与主机ssh联系,但是原理我却不理解,究竟这个tap是一个什么东西呢?其中的bridge究竟是和谁在通信呢?我能够理 解的一点就是我现在把我的所有的网卡设备跪在br0之下,把他作为一个dhcp的server来给未来的我的qemu的虚拟网卡设备分配Ip,然后我自己 主机上网就出现了问题,可以链接到我的router:192.168.1.253,并且router肯定是与Internet链接成功的,因为在 router上通过cable modem可以ping到外界的网络域名,那么问题就是我自己内部怎么链接到Internet我尝试把网关加载br0上而不是之前我的网卡上:sudo route add default gw 192.168.1.253 br0然后结果是这样子的:
br0       Link encap:Ethernet  HWaddr c8:60:00:42:93:7f 
          inet addr:192.168.1.50  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::ca60:ff:fe42:937f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:15902 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1600 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:4517844 (4.5 MB)  TX bytes:256040 (256.0 KB)

eth0      Link encap:Ethernet  HWaddr c8:60:00:42:93:f2 
          inet6 addr: fe80::ca60:ff:fe42:93f2/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:1149 errors:0 dropped:0 overruns:0 frame:0
          TX packets:21 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:180062 (180.0 KB)  TX bytes:4954 (4.9 KB)
          Interrupt:48 Memory:fbee0000-fbf00000

eth1      Link encap:Ethernet  HWaddr c8:60:00:42:93:7f 
          inet addr:192.168.1.50  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::ca60:ff:fe42:937f/64 Scope:Link
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:269527 errors:0 dropped:0 overruns:0 frame:0
          TX packets:85884 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:113438399 (113.4 MB)  TX bytes:36743432 (36.7 MB)
          Interrupt:47 Memory:fbde0000-fbe00000

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:99002 errors:0 dropped:0 overruns:0 frame:0
          TX packets:99002 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:6634695 (6.6 MB)  TX bytes:6634695 (6.6 MB)

tap0      Link encap:Ethernet  HWaddr ea:78:6e:77:55:b5 
          inet6 addr: fe80::e878:6eff:fe77:55b5/64 Scope:Link
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:60 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1002 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:8824 (8.8 KB)  TX bytes:304126 (304.1 KB)

wlan0     Link encap:Ethernet  HWaddr 14:da:e9:f2:4b:86 
          inet addr:192.168.1.3  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::16da:e9ff:fef2:4b86/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:42326 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7991 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:3687295 (3.6 MB)  TX bytes:2821009 (2.8 MB)
现在可以上网了,我现在还是有很多的疑问,首先老问题现在无法解决,就是主板的两个网卡eth0从来就没有工作成功过,这个问题太复杂也太妃时间的暂且不 管。其次,我的无线网卡现在和br0是并列的吗?route -n显示如下:
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.253   0.0.0.0         UG    0      0        0 br0
0.0.0.0         192.168.1.254   0.0.0.0         UG    0      0        0 wlan0
0.0.0.0         192.168.1.253   0.0.0.0         UG    0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 br0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     2      0        0 wlan0
嗯,证实了,我的无线网卡链接的是at&t的cable modem所以要使用自己的gateway192.168.1.254,而不是我那个使用comcast的router的ip 192.168.1253作为网关,目前是比较crazy,有两个有线网络和两个无线网络,下个星期打电话砍一个好的价格取消一个,估计是at& t,太贵了。第三,我的理解这个tap0是一个给我的qemu虚拟机的网络设备?我看不到他的ip,只有在虚拟机里有ip:192.168.1.94,这 个应该是br0分配的吧。
这 里的命令sudo qemu-system-arm -M overo -m 256 -sd ./test.img -clock unix -serial stdio -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=./qemu-ifup.sh -device usb-kbd -device usb-mouse需要调用这个简单的脚本qemu-ifup.sh但是究竟是谁调用的,谁传递的参数?是br0?这里是我一直不理解的地方?所以,之前的脚本要更新
#!/bin/sh
/sbin/ifconfig $1 0.0.0.0 promisc up
/usr/sbin/brctl addif br0 $1
ssh login是修改/etc/ssh/sshd_config我却去修改ssh_config真的是好笑。
气候反常,硅谷突然下起了瓢泼大雨。我前两天买的雨布盖在自行车上终于派上了用场说明了我有先见之明。

八月二十日 现在需要的是熟悉内核开发

我的主机的内核不知 道缺什么模块每次执行iptables -F FORWARD都报错,说我的fiter table不存在之类的。
iptables v1.4.4: can't initialize iptables table `filter': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
我把我在net下的模块都安装了一下也没有头绪。
另一个问题,是我的所谓的eth0也许不是另一块网卡,也许是我的无线网卡?因为虽然无线网卡用的是wlan0,可是根据 udev/rules.d/75xxxx里面也许创建eth0然后再。。。混乱啊。现在每次运行qemu之后br就把我的eth1的ip掩盖了,退出模拟 器就无法上网了。问题太多了,我甚至都不知道怎样把br去掉,总是说它up。我要怎么shutdown bridge呢?sudo brclt delbr br0不行呀。
奥,知道了,你要卸载bridge一定要关闭一切:为安全期间干脆把eth1彻底关闭1. sudo ifdown eth1 2. sudo brctl delif br0 eth1 3. sudo ifconfig br0 down 4. sudo brctl delbr br0
这个西数(western digital)router, 你没有看错,是WD,我觉得是超值了,怎么说都可能是一两百的东西,结果卖了一个白菜价,45刀包邮,反正我觉得至少外表设计就值了,而且把我以前的老古 董Usb硬盘都插上来共享,这个怎么说都是不错的设计,我看了一下WD的广告,他们的思路是对的,卖硬盘在今后很可能是没有前途的,因为移动计算的兴起使 得pc之类的急剧减少,并不是人们不需要存储了,相反人们需要的更多了,就看你怎么提供,用户需要的是存储,而不是硬盘,所以,WD的决策是王权正确的, 关键是施行。
笔记本的显卡是一个古老的设备俄,是在这里:www.nvidia.com/object/unix.html, 安装的方法是不要进入x server,或者另开一个tty(ctl+alt+F6)然后关闭Xserver: sudo service gdm stop不要使用古老的systemV的init.d的命令,那个不行了。
nm-tool显示无线路由的信号强度,WD的这款不算很好,这是预料中的,否则不会买的这么偏移,我看中的是7个ether口。这个是搜索本地网的所有计算机:nmap -sP 192.168.1.0/24

八月二十一日 现在需要的是熟悉内核开发

看iptables 的代码不知所以然,在看内核配置感觉肯定是我没有把具体的table编译进去,试验一下。的确是这个样子的,有很多的netfilter的表要加入。
简单的增加了一个初始化和删除bridge的过程在qemu的脚本里,省的每次网络都 被搞乱。

八月二十二日 现在需要的是熟悉内核开发

笔记本安装了 Nvidia的显卡驱动第一次启动没有问题,今天在启动就报错,看错误是说nvidia的内核模块版本不对应,现在的所谓api版本是304 而内核的版本是173,这个让我一头雾水,查看modprobe --list果然看到有一个nvidia-173.ko和其他的nvidia-current.ko,nvidia.ko,所以,我猜想这个173一定是 旧的内核,于是在/etc/modprobe.d/下面的nvidia的什么blacklist里面再把nvidia-173也加入到blacklist 上就好了。所以,这个启动加载那个内核有一点点运气,第一次碰巧加载了刚刚安装,不,也许是这个内核需要和user space的nvidia的配置程序通讯,而内核模块的加载顺序有影响吧?总之,问题似乎解决了。
新买的wd的router应该是当机了,因为可以ping到,但是不能上网,route表也是设定了,cable modem的地址原本也可以访问,特征就是router自己的web ui已经不能访问了,所以不工作是肯定的,只好重启,硬盘公司生产路由器肯定是有问题的,cisco在这个领域里还是有很多优势的,我想大多数 router生产商都是如此,为了产品的可靠很少用新型开源软件,因为开发容易但是要真正做到可靠内存无泄漏等等还是需要大量开发的。不过我还是不后悔, 因为这个给 了源代码的产品就是给人一个号的感觉。
看薄熙来的庭审,感觉他说了几句实话,主要的受贿罪都是他自己在双规期间自书的两件,总共两千多万,但是能够证明它直接为人牟利接受钱款的事实却是比较困 难取证的,大概的旁证和人证也许都有,但是直接证据其实很难。比如那个一百多万的大连国际贸易公司的案子,那是一个全民下海开公司时代的产物,邓小平公开 鼓励军队自己走私养活自己,各级政府纷纷在香港深圳设点办公司,倒卖汽车进口批文都是正常的经济活动,薄熙来批文给他的那个小兄弟说实话也是给所谓的大连 市政府在香港的窗口公司的,当时那些香港公司深圳办事处不靠这些政府的关系没有一个能够生存下来的,至于个人牟利几乎都是必然的,当时的原则就是你自己赚 钱可以但是不要让国家政府的公司倒闭破产亏损就是你的功劳的,那个拿钱给薄熙来的人其实在当时那个年代还是被当作有能力的代表的,否则很多人就呆在香港深 圳把办事处的经费吃光花光一个钱也不给单位还是被当作正常的?他至少把那个维持不下去的深圳办事处吃下来开发房地产给企业挣了钱?总之,十几年前的案子说 不上什么贪污受贿。至于徐明买万达足球队我觉得压根就是一个愿打一个愿挨,买法国别墅的事情也许是真的有,但是这个事情是否就需要薄熙来亲自去帮他疏通关 系也是一个未知数,很可能是谷开来的事情,薄熙来也许知道但是就如他所言什么原油进口许可之类的很快就放开了,商人真的要行贿也未必值得花三百多万美金, 买足球队提高知名度的事情有多大的利益也都是一个虚数,严格从法律角度来看行贿者通过买足球队得到的利益要怎么计算呢?一个知名度的提高究竟带来的几百万 几千万的收入?怎么计算?如果养足球队亏损了怎么算?诚然行贿受贿是客观事实不以行贿者实际所得来衡量,问题是行贿者的因果关系在这里是一个难以判断的问 题,很多人行贿已经不再是就事论事的一对一的给钱,往往是平常打点有事再来相求,这个很难抓住实据。所以,薄熙来说的是实话:当时感到大势已去采写下了自 书,如果他不写中纪委根本没有什么实证来审判。谷开来办律师事务所赚到四千多万是可能的,其中有多少依靠薄熙来的影响是一个各个国家都说不清的事情,美国 总统演讲挣钱也是靠的知名度并不违法。我所说的单单凭薄谷开来从两人共用的保险柜拿出的钱来作为薄熙来受贿的证据是苍白无力的,诚如薄熙来所说,如谷开来 有大量财产支配居然能够记得清楚几万元的支出,并且从两人共用的保险柜取钱等等是有一些牵强,至少不是直接证据,并且谷开来的精神状态也是有问题的。
但是不管怎么说,我觉得庭审公开毕竟是一个进步,只不过温饱包自己究竟屁股干净不干净呢?
这个是显 示的非常重要的文件,可是我现在头疼的不行,去健身房回来再看吧。受不了了。我观察到的现象是omap-dss模块没有加载。

八月二十七日 现在需要的是熟悉内核开发

一切都要停下来因为 学开车是目前的要务,这个由不得我了。为了安装模拟驾驶2012被迫重新安装winxp,因为virtualbox的winxp没法安装这类游戏。

八月二十八日 现在需要的是熟悉内核开发

在winxp与 ubuntu之间转换,启动发现network-manager的icon missing,看这里不知所云,实际上我看过dmesg没有什么错误,很可能是界面的问题,因为网络都是正常的,所以我就这样子解决了图标的问题: gconftool --recursive-unset /apps/panel && killall gnome-panel这个我是屡试不爽的,ui的问题是很复杂的,很可能是有什么问题很深层次很难发现,但是这个不是我的要务。
启动发现这个错误:EXT3-fs (mmcblk0p2): error: couldn't mount because of unsupported optional features (240)导致无法加载mmcblk0p2扇区,google不知所以然,看了gpartd才恍然原来sd卡不知道怎么居然被format成了ext4而 我的启动命令里是强调这个rootfs是ext3的:
fatload mmc 0:1 0x80000000 uImage
fatload mmc 0:1 0x82000000 uInitrd
setenv bootargs vram=16M mpurate=500 omapfb.mode=dvi:1024x768MR-16@60 omapdss.def_disp=dvi root=/dev/mmcblk0p2 rw rootfstype=ext3 rootwait console=ttyO2,115200n8 loglevel=7
bootm 0x80000000 0x82000000
这个是作为script编译成为boot.scr所以,原因应该是这个,前几天我看到这个现象一直以为是文件系统损坏了,因为在qemu中我有时候没有正 常关闭ubuntu直接ctrl+C往往导致一些文件损坏,我应该实验不用file cache也许能够解决吧?
看到这个错误:init: Failed to create pty - disabling logging for job然后google 发现也许是/dev/ptmx的权限问题, 要0666才行,而我的是只读吧?不知道为什么拷贝文件也许不行,因为是特殊的设备文件用拷贝会丢失属性?本来用rsync就好了?这个不是原因,无头 绪。我怀疑我的问题还是老问题是devtmpfs没有正确mount的关系,检查一些内核设置,在哪里有这个选项。果然在device driver/generic choice之类的关于devtmpfs的选项又一次的忘记了,不是第一次了。
终于我找到了一个小小的办法来debug,这个是在uInitrd里面,因为Udev的初始化是在哪里做的,也就是在 /etc/udev/udev.conf里面有一行的修正:udev_log="debug"把之前的err换成了debug,这样子udev打出了很多 的log信息。明天在看吧。

八月二十九日 现在需要的是熟悉内核开发

看到一个潜在的问 题,就是在文件系统里的/dev/.udev这个东西是启动时候创建的,可能会干扰。我把它从原始的备份中删除了省的老是被拷贝到系统里。
偶然闯到alibaba,就问了一下omap3530开发版的价格,发现这些在alibaba上的人大都是骗子,根本就是胡说八道。
ps auxwww发现我的tap0还在使用所以tunctl -d tap0出错。
modprobe: FATAL: Could not load /lib/modules/*/modules.dep: No such file or directory这个错误据说是因为udev之类的异步造成的,有人说修改/etc/initramfs-tools/initramfs.conf里 的most改成dep。正在实验中。这个也不是根本的解决办法,我的理解这个问题很难解决因为为了加快启动需要异步初始化设备,结果很多时候在你的文件系 统没有完成的情况下设备驱动需要某些文件造成了,取决于很多时间的因素,比如具体的设备和配置,很多时候看不到这个错误吧?好像也不是很严重,大概 udev有什么重试的机制?这个我纯粹瞎猜。另一个问题 大概有解决办法, 就是smsc91xx网卡的问题,始终和mii_bus冲突,我以前的办法是鸵鸟就是把那个bus禁用,其实也许就是一个设备名冲突的问题吧?看上去解决 了。
这 里讲的很清除,就是resolv.conf不再是静态的设定了,而是改用/etc/network/interfaces里面的设定来动态的生 成。最简单的是用dhcp server来解决,或者命令行dhclient eth0强制运行,或者设置在interace文件里
auto eth0
iface eth0 inet dhcp
对于v4l2驱动user方面我还熟悉,但对 于内核方面不明所以然,首先在udev方面怎么,谁来创立?

八月三十一日 现在需要的是熟悉内核开发

What a _bastard_! 我笑的眼泪都要出来了。的确是非常的非常的entertaining!这个是八月份看到的最好笑的笑话,我突发奇想决定把我盗版下载的资料都上传上去以供大家享用,知识需要传播,如果我为此违法那也是正确的。
中国的问题之所以历千年而不脱封建王朝轮替的怪圈就在于不给失败者以退路,每次成王败寇之后都是对于前朝统治者的肉体消灭精神摧毁,导致所有的玩家只有一 往无前绝无姑息宽容,毛泽东早年对于中共内部那一套你死我活的残酷的权力斗争是有真切体会的,所以,也从来都是以牙还牙的你死我活。因此,在今题那的中国 要让共产党缴枪交权放钱是无异于与虎谋皮,幻想不通过流血暴力的改朝换代是自欺欺人,但是假如进行以暴易暴使得推翻现政权的流氓无产者很可能和中共是一丘 之貉,因此,普通人民出于两难的无可奈何,这就是今天埃及叙利亚的现实,那些所谓的反对派是比当权者更加流氓的恐怖分子,他们呢和共产法西斯一样的是要清 除的毒瘤。
安装python是我现在在ubuntu 10.04(lucid)上唯一感到头疼的地方,我因此对于python可以说是深恶痛绝,五花八门的版本比java还多还乱,而且全都不向下兼容,完全 无所适从,我绝大多数时候压根就不需要,只有一次为了编译什么东西需要2.7我不得以瞎搞了一个把系统搞乱了,我 现在错上加错直接下载安装包覆盖
安装过程的错误说
ImportError: No module named _functools  这个是因为此前的Python安装的lib-dynload 里面缺少相应的.so,这个是在/usr/lib/python2.6/lib-dynload下面的。
我觉得我很彪悍的为了安装一个python2.6直接把系统干掉,就是说把所有的包都卸载(因为依赖python的包很多,而且都是很关键的基本的)于是 我当然是神定气闲的在卸载所有的broken package知道最最原始的问题所在--gnome的很多基本东西,比如libgnome-window-settings1之类的,然后在重新安装 ubuntu-desktop回来了。哈哈!其实只要内核与驱动没有损坏,这些都是小意思,瞎折腾呗。
在执行
gconftool --recursive-unset /apps/panel && killall gnome-panel的时候总是报错/usr/bin/python: can't find '__main__.py' in '/usr/share/command-not-found'我一直不明所以然,后来google才恍然原来真的有这个所谓的 command_not_found的程序,这个名字太有些诱人了,我真的没有想到,而一直认为是我的python还没有安装正确,因此当我安装了这个 command_not_found一直说我的gconf-tool命令无要安装gconf2,而碰巧的是我不论怎么安装都说找不到这个 gconftool,因为我刚刚才把系统搞得天翻地覆因此自然认为还是python的问题,不惜要再重装一遍,后来在无果之后仔细查看dpkg -L gconf2发现只有安装一个可执行程序gconftool-2并没有所谓的gconftool才恍然原来确实的是一个symlink而已,问题这个应该 是谁创建的呢?系统似乎好乱啊。

九月一日 现在需要的是熟悉内核开发

增加了一个文件大 小,结果发现ftp server似乎不支持中文名,或者就是我的url没有正确的encoding,这个我无头绪,因为一开始使用ftp不能显示utf8的中文文件名,结果 使用lftp就可以了,照理说服务器是支持中文文件名的,但是我的Url要怎么怎么做呢?我已经做了转换了,可是中文不行?
<The Men Show Built America>是美国引以自豪的历史功绩,在中国还处在大清皇帝在颐和园赏景休闲的时刻,美国的企业家改变了世界,他们当时取得的成就在一个多世 纪后依然没有办法让中国实现,这些响亮的名字被共产党永远的打入黑名单,在历史教科书上列为残酷剥削工人的垄断资本家---洛克菲勒,卡内基,福特,爱迪 生,摩根等等,可是这些人都是新技术新经济新产品的代表者,简称三个代表。洛克菲勒是煤油大王,它垄断了美国90%以上的煤油提炼,卡内基从铁路造桥起家 成为了美国的钢铁大王,用钢梁早摩天大楼在中国是一百多年以后的事情,同样今天热络落的所谓航空母舰是一个从前苏联买来的二手改造的比日本都要晚近一个世 纪,但是似乎没有人关心这个事实。
不了解美国的历史,就不会真正的理解什么是市场经济;不了解美国的历史,就不会真正明白什么是真正的法治社会;不了解美国的历史,也不可能真正了解什么是 民主政治;不了解美国历史,也不可能了解什么是真正的美国精神和美国人。因为美国的历史造就了强悍的美国人民,原因是美国的残酷和富饶,物竞天择的达尔文 主义成就了美国人民,美国人民的来复枪历史传统不仅打败了当时世界上最强大的英帝国,也让人民的领导者深深体会到独裁统治人民是注定在武装起来的美国人民 要失败的,各个州的独立早就了美国联邦的独立,也同时成就了美国的强大的地方政府,让联邦政府不可能像中国式的中央集权政府为所欲为。美国之所以有惊天的 文明法制民主最主要的原因是当年殖民地时代的野蛮凶残强悍,一个没有充满了冒险精神的土地,一个不安于在欧洲大陆作一辈子顺民享受三十亩地一头牛老婆孩子 热炕头的人群的聚合体,这个是当年宁可饿死也绝不迁移的民族所难以企及的,这就是美国精神。没有屠杀一千万印第安人,雇用枪手用机关枪屠杀罢工工人。
美国的成功不是偶然的,如果没有和牛顿一样杰出的富兰克林,爱迪生,美国不可能是新技术的领先者,如果没有像洛克菲勒,卡内基,JP摩根这样的企业家,美 国不可能统领世界工厂的美誉,当然今天的中国妄担了世界工厂的名誉,可是中国的企业家究竟发明创造了多少?在美国那个热火朝天的世纪里新技术层出不穷,新 型革命不停地改变世界的面貌。当爱迪生发明了电灯,如果没有像摩根这样敢于冒险的风险投资家,发电厂电灯电话也不可能实现到普通人家的梦想,所有的这一切 都是绝对不可能在中国出现的,哪怕历史重演一百遍,只要是共产党当政一切都是不可能发生的,就算中国有了这些杰出的人才,共产党的违反自然法则的统治依然 会阻挠一切成为可能。世界是一个各国残酷竞争的竞技场,每个民族国家都是竞技者,这里各个都是拼全力输赢是生与死的差别,胜败常常就差之毫厘,即便使出全 身解数还惴惴不安如履薄冰,更别说有人在你上场的时候将你的手脚捆绑起来不给你武器而让你去竞技场拼命,你怎么能够期待你打赢这场战争?这个捆绑中国手脚 的人不是别人,就是一切落后与世界潮流背道而驰的共产制度。中国今天所有的所谓“成就”都是在部分的摒弃当初共产党所倡导的,可以说任何摒弃共产制度的举 动都迸发出巨大的创造力,任何消除共产制度的影响都极大的解放了劳动者与生产力,如果这个政党真的相信他们自己的祖先马克思的生产制度一定要适应生产力的 狗屁理论他们早就应该举枪自杀不应该再成为阻止历史前进的障碍,而这一点恰恰证明这个邪教组织如同所有的极端恐怖主义团体一样仅仅利用一些花哨的主义达到 他们的私利的工具而已。
关于交流电与直流电的战斗让我们看到了伟大的发明家爱迪生的另一个方面,有些阴暗的一面,但是历史是真实的,知道事实并不能损毁这个伟人对于历史的贡献。 而让我想起来了关于朝鲜战争的起因,我小时候共产党的课本从来就没有告诉我是金日成的侵略挑起了战争,共产党整天指责日本篡改教科书不承认历史,为什么不 自己反省下到底谁歪曲历史更多?这个政党是把“造假历史“作为所谓的“宣传的政党,从来不惮于欺骗来达到自己的目的而无所不用其极。
几十年的所谓的“改革开放“的最大的经验就是反复证明了一个颠扑不破的真理:“没有共产党才有新中国!“
在这个劳动节里马拉松联播美国缔造者节目真是最好的节日礼物,洛克菲勒,卡内基,摩根仿佛如中国的三国演绎一样的让人心驰神往,这其中也许最让人有好感的 是卡内基,一个相对来说存有太多良知不以利润最大化为唯一人生目的的一个相对高尚的人,我对其有好感的另一个原因是猜想卡内基梅陇大学也许和他有关系,而 这个是我自始至终艳羡的圣地。
惠普的前ceo,就是那个我很讨厌的女人说的很好,这些富有远见卓识的伟人所创造的神话不可能发生在世界别的地方,只能发生在美国,一个人人都可以梦想的 地方,关键是你的梦想有多大,你会多努力的实现你的梦想。很有趣的是我在使用拼音输入法的时候每次我输入“努力“的时候首先跳出来的却是“奴隶“,的确在 美国一个人的努力可以给她的梦想成真的钥匙,可是在太平洋的那一边,这个词听上去像是“奴隶“,因为一个邪恶的政权束缚了人们的创造与努力,成为一个集权 政府的经济奴隶。

九月三日 现在需要的是熟悉内核开发

记忆力 太差了,之前就有过错误,ubuntu默认的qemu没有overo,要使用linaro的版本,现在又要重新安装了。这里再重复一下:deb http://ppa.launchpad.net/linaro-maintainers/tools/ubuntu lucid main  包的名字是qemu-system!
现在计划是这样子的:首先,当前的形势是我对于自己仿照aptina的i2c式的angstorm配合beagle board的驱动的移植完全没有信心,我压根就不知道在User层面是用v4l2还是直接用smbus呢?smbus也许是用来操控创建v4l2的设备文 件吧?总之,我对于这个东西一无所知,那么最容易的还是直接使用angstorm的系统来看看sensor是否已经正确识别了,这个最妥当。其次,在使用 了一段时间的ubuntu/linaro之后我对此有不少的信心,但是似乎主流的人群都不在这里,毕竟angstorm看起来要成熟流行的多,所以,有必 要再次尝试angstorm,在虚拟机上设置编译环境还是可行的。初步的实验是qemu模拟2.6.34的angstorm可以,但是camera的 2.34.39鼠标不能识别,但是实际的机器运行可以。不过mt9v32模块没有加载反而是mt9v11加载了,不过有/dev/i2c-1和ic-3设 备生成了,这个似乎是个好消息。肚子俄了。
我真的是昏了头了,完全忘记了一两个星期前的一切,为什么我的记忆力这么的差呢?我使用linaro的toolchain当然不是在lucid母机上呀! 我是在precise的debootstrap和rootstock上做的呀,前者是amd64后者是arm两个都是ubuntu12.04然后在哪里我 才分别安装了linaro的toolchain的arm-linux-gnueabihf版的armhf,我的母机上lucid上linaro是没有 armhf的,只有armel,我现在头脑太混乱了,不写下来下次还是会出错。我花了半个小时在我的lucid上查找我为什么没有armhf的 toolchain真的是浪费时间,看最近的笔记也没有找到线索。看来一定要把工作流程抽时间总结一下。
目前我看angstorm的网站对于他们的内核版本不是很清楚。看来还是先用gumstix的内核代码尝试把?
我觉得我花了这么大的精力去折腾不如去买一个beagleboard,因为gumstix明显的少支持。好吗?
真实大开眼界,这个世 界上的能人真的太多了,我太弱了。看来beagleboard确实有优势。
九月里的最好的喜剧是美国的国会听证会上参议员paul耍弄国务卿克里的段子,这个人是一个人物,因为创造过最新的费力巴斯特的记录,连续演讲几十个小 时,对于克里调侃的让人捧腹,的确,克里反复表明了国会不同意也得同意,因为你不授权总统照样开打因为总统本来就有权力这么作,来国会寻求授权是给你这些 弄嘴皮子的参议员一个面子,不要给脸不要脸,要不是奥巴马这个窝囊总统优柔寡断坐在我旁边的邓浦西这些丘八将军们早就开打了。对于这个调调保罗也是极尽他 的嘴皮子功夫,把克里的这副心思说的很清楚。
其实,保罗现在是共和党的小明星也是2016的一个热门,喜欢作秀肯定会为他争取到不少的选票的,人们喜欢一个果敢敢于战斗的总统吧?奥巴马太过于柔弱 了,当了两任总统一场仗都不敢打肯定是被军工集团气死了,不过我觉得十月份联邦举债上限又到了可能是一个很重要的因素。一个参议员问克里你来寻求我们的授 权那就意味着我们可以说是也可以说不,如果我们不授权你怎么办?克里的回到是现在提任何其他可能性都是to dire,多有趣的英语啊。联想都不敢想。

九月五日 现在需要的是熟悉内核开发

这个是一个我不理解的问题,在webhosting的公司的主机上他们是用NFS,文件系统看上去用ftp访问是支持utf8的因为我的文件的名字中文是 正常显示的,但是web-server对于文件名的中文下载请求都报错,技术支持说他们用iconv转换所有的encoding,而iconv的设置的输 入input_encoding是ISO-8859-1,我在本机尝试用iconv把utf-8转换为ISO-8859-1就报错,难 道iconv不能把UTF-8转换为ISO-8859-1吗?
追查凶手居然发现这个所谓的iconv是当初安装eglibc的一部分,报的名字是libc-bin,这个明明是嵌入式的东西为什么装载我的主机?是安装 toolchain还是编译gcc需要呢?我现在彻底混乱了。
看到一个神奇的现象,好多天以来我一直忘记拷贝firmware居然系统能够正常启动,现在我觉得非常的不可思议,难道硬件都不需要吗?换言之,这个也许 说明了firmware都是modules才需要的,所以,也许我的问题就在这了。不是不需要,而是编译在内核了。对于Modules就需要了。道理很简 单的。
但是并没有看到期待的video的设备创建,在i2c方面,在/var/log/udev/udevtrigger.log里看到猜测/dev/i2c- 1里面有如下设备004b大概是时钟twl_rtc和一些regulator,reg17/18/19/6/3/5, 0049是twl4030_gpio,  0048有twl4030_usb/wdt, 0049有twl4030_pwrbutton/audio, 这个在/var/log/udev里有更详细的内容,但是找不到video?其中i2c-3这个设备标注为i2c没有什么其他的东西,难道这个是未识别的 设备?
记录一个驱动的版本。这个是另 一个版本。

九月六日 现在需要的是熟悉内核开发

这个是一个值得纪念的日子,因为我终于跨出了10.04开始向12.04靠拢,具体原因很多也许都微不足道,之前我曾经因为要交叉编译而不得不使用 ubuntu precise12.04的时候甚至还是顽固的用chroot debootstrap/rootstock来在lucid上运行12.04,或者使用virtualbox的模拟器逃避升级,原因当然是很简单--不愿 意改变,或者改变带给我的好处似乎没有那么的吸引人,或者ubuntu precise的unity实在是太吓人了,以至于被广大人民群众深恶痛绝,canonical难道就这么不同人性?我可以理解作为公司的发展前途肯定是 要以移动设备为最终导向,但是,如果失去了desktop的用户一定就有未来吗?
扯远了,在我选择lxde的时候一直无法进入图形登录显示checking battery status...之类的,我也看到不少的帖子说各种原因,但是大多数人都是发生在从lucid升级到precise的过程,而我是直接从precise 的server版本来安装desktop来的,后来发现我可以通过startx进入lxde环境,update-alternatives --config x-session-manager也是指向startlxde,最后才明白是window-manager的原因,我必须要slim而不是 lightdm。在安装中文输入的时候,必 须这样子设置ibus 必须在这之前安装im-switch才行,令人激动的是可以安装googlepinying这个实在是太棒了!这个是我升级到12.04后地一个最令人感 到兴奋的。关于vim的颜色设置的 确是很令人高兴的,有这么多的选择实在是太棒了!
不过声卡还是没有设置好,说实话我也不是很清楚问题处在哪里?我的声卡实际上被alsa认得了,但是aplay却说找不到声卡。总之我觉得问题处在怎么 config声卡,12.04没有alsaconf,我就把我以前的/etc/modprobe.d/下面的黑名单靠过来阻止一个设置一个。然后突然之间 使用alsamixer就ok了。也许之前我还做了什么但是不确定,总之这个问题不大。
现在是无线网卡的问题了。
奥巴马需求国会支持打击叙利亚是一个失败的举措,他原本是想让国会给他多一些背书省得自己的单边行动看上去太苍白,可是共和党是绝不会买张的,直接给了一 耳光,你既然做了婊子,就不要立牌坊。打仗就打不要犹豫,揍阿萨德那个混蛋就直接打,别妞妞捏捏的!
以前我的Usb制作的启动盘不工作的原因是我的bios的设置里对于usb的启动设置,他有几种模式比如软盘模拟,硬盘模拟等等,其中一个是force fdd之类的才行,ubuntu使用的是syslinux来启动,你选install就从iso的install目录Load的内核和initrd,我的 两个网卡只有eth1工作,最后grub做了很好的工作会把各个分区的操作系统统统加入到启动菜单,这个做法多好呀。
没有关机按钮?这 里说要安装hal
iso总是被mount成readonly的,我纳闷了好一阵子。
我要把ubuntu12.04server的iso做到我的grub菜单上,结果启动的时候总是抱怨找不到cdrom,经过mount看到他原来是要运行 preseed目录下的debian-install文件,而假定是吧iso加载为cdrom的mounting point,略一沉吟,我拷贝iso的mount版加了一个指向自己的symlink cdrom--> ./然后使用genisoimage -R -J -o new.iso ./iso-mount就行了。其实这个没有用,因为不是livecd而是server的安装盘,server好像没有livecd。所以,我下载了 12.04desktop的livecd,不过记得他的casper下面的内核名字变了是vmlinuz.efi所以要相应的改一下。grub使用高解析 的菜单字体太小,我修改了/etc/default/grub强制使用640x480模式,字体就清楚多了。

九月七日 现在需要的是熟悉内核开发

locale应该是读取/etc/default/locale的值,所以,但是问题是我的设置是否回影响到个性化设置?12.04用的是3.5的内核, 肯定在硬件驱动方面有了很大的改进了吧?
12.04desktop应该是远远超过了我的预期,我要说canonical对不起,我之前的无端猜疑是令人羞耻的无知,你们做的太棒了。现代操作系统 的进步远远超过了我这个孤陋寡闻的无知小人。我重新在3.5内核的server上直接安装desktop,发现desktop的内核居然是最新的3.8 版,而且一举解决了我的无线网卡的问题,新内核就是驱动方面强大!以前我在10.04要自己在3.0版上用asus的版本自己编译内核,现在真的是太棒 了。而且,我发现dash home这个摆脱了传统的start菜单的一开始让我始终找不到方向,但是一旦让我明白了搜索我立刻就喜欢上了它!看来迈出第一步是多么的重要。看来一旦 升级到12.04我不大会想要再回到从前了。因为我的机器足够快真的没有理由不用这些新的功能,当然对于老机器是没有办法才会怀念10.04,哈,喜新厌 旧是人的本性。
去看了Riddick,觉得这个和他的前传一样的ridiculous,不过总的来说是今年我看到的最好的科幻片,值得一看。其实,说老实话 《Riddick Chronical》不管怎么说都是一部经典的科幻片,让人怀念古老的<dune>的片子。虽然是一个ridiculous dick,但是特技还是可以的,主要是风格如此。同时女主角的脸和胸都让人看了眼熟,啊,想起来了,她是我在<big bang theory>里认识的《firefly》的科幻女星,值得一看--Doll。

九月八日 现在需要的是熟悉内核开发

其实生活中处处都有计算机的设计,比如小区的邮件常有丢失的情况,怎么解决呢?每个人的邮箱都不大,网上买的东西原来就只有扔在每户的门口,现在美国邮政 采取一个新流程,把大的东西锁在和邮箱一起的大的公共的橱子里,把厨子的钥匙丢在你的信箱里,一开始我纳闷了好一阵子一直以为是那一个租户搬走了把邮箱钥 匙丢错了。其实,这个设计很多公司以前就采用了,很早以前isendyou之类的为解决邮件的大文件附件就是这样子把文件的链接发给你的邮箱,这样子以便 发送超大附件。我收到了我买的beagle bone black(BBB),看看有什么好的。
至少我解决了一个小问题,就是为什么启动的时候音乐没有了。这个其实和我看到的错误相关的:xcb_connection_has_error() returned true这里介绍了怎 么加入good old welcome sound in ubuntu 可是不成功而且声音也没有了,这个让我猜想是和声卡的冲突有关的。于是我就把握之前的设置拷贝过来了:/etc/modproble.d/alsa- base.conf里我有这么的设置:
#options snd slots=snd_oxygen,snd_hda_intel,snd_usb_audio
options snd_oxygen index=0

############### prevent intel-HDMI to be loaded
blacklist snd_hda_intel
blacklist snd_hda_codec
blacklist snd_hda_codec_hdmi
第一个保证我的oxygen在声卡的第一的位置省却了很多的麻烦。第二个是干脆禁止掉主板的声卡,asus的主板根本不开放这个声卡的使用,真的让人好凄 美。
且慢,那个错误xcb_connection_has_error() returned true其实还在,所以问题是复合的复杂的。

九月九日 现在需要的是熟悉内核开发

BBB让我着实的迷惑了一下,通过usb链接ssh?我还是将信将疑,因为之前使用overo都是用的usb上的serial。有一个白痴的据说是MIT 的工程师创建的卖东西的网站做的文档还不错,我太刻薄了。
这里是BBB 的参数: 我发现在BBB上是看到通过所谓的usb0建立的一个连接,这个应该是所谓的tethering,即通过Usb上网的,因为真正的ether链接是有另一 个eth0创建的:eth0      Link encap:Ethernet  HWaddr 90:59:AF:5B:25:1B 
          inet addr:192.168.1.102  Bcast:192.168.1.255  Mask:255.255.255.0

usb0      Link encap:Ethernet  HWaddr 52:43:73:91:CB:38 
          inet addr:192.168.7.2  Bcast:192.168.7.3  Mask:255.255.255.252
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1613 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2363 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:151607 (148.0 KiB)  TX bytes:914710 (893.2 KiB)
这一点和overo不同,因为BBB相当的高明,解决了同时供电和通讯的问题,我现在开始有点明白了,这个做法是简化主机开发者不需要加载任何特殊设备使 用最简单的usb连接(但是注意在主机上没有特殊usb设备,而overo你要内核模块支持usb-serial才行,我当时还专门重新编译内核模块才能 创建设备)现在大部分工作都是在目标机器上完成的。从这里就可以看出BBB比overo开发容易的多,他有自带的默认系统连创建prebuilt系统都免 了确实是大大降低了开发难度,我值得是初学者。长期未必吧,不知道。总之,我现在明白要实现类似jtag之类的serial口有另外的工作要做吧?总之我 的主机没有发现目标机的usb设备,不明白为什么udev的rule文件不起作用。
看 看这一段解释, 最后一行说没有FTDI设备,这个让人惊讶也让我安心,1.那么确实我的主机没有发现这个usb硬件。2.我在板子上没有看到ftdi的芯片,所以,肯定 是一个所谓的composite gadget,模拟的serial设备,这个很聪明可以降低成本,但是对于开发者应该更不利吧?我原本可以通过serial口看到启动信息,我估计这个现 在是不行的?(我理解错了,这个是做在usb设备里的,所以应该是还是可以的。实验一下?)再回头看BBB的datasheet,的确没有说用了FTDI 设备,所以当初那个设备创建脚本压根就是给BB(beaglebone)的而不是给BBB的。这位老兄和我的问题一 模一样,不过他比我强的太多了,我还没有办法做到modprobe指定vendor,这个要学一下,不过思路是一样的,但是看看板子就没有设备, 难道我买的是偷工减料的板子?
不过我还是对于自己比较自信的,检查一下/var/log/kern.log就看到了设备被加载了,只不过名字是/dev/ttyACM0,然后就是 kermit链接的标准过程,voila!我应该这两个月没有白过。当然这个都是最最基本的,仿佛操纵鼠标键盘般的基本,里开发还很远的。不过这个第一步 总要迈出来的。连接之后我其实有些失望,成如我所说的,BBB是给初学者的,因为拿掉了FTDI芯片系统的开发功能很差了,因为那个模拟的serial是 需要系统Up后模拟出来的,出软件的,不像overo这个是一个类似jtag的设备直接链接不需系统运行的。所以你看不到启动的信息。啊。不过,发现我每 次没有断开kermit的链接所以ttyACM*只好创建新的设备号码,我在0,他就到1了。所以,我没有看到启动部分。。。不顾angstorm启动想 飞一样,我根本来不及链接。也好。总之,刚刚明白可以吧kermit的链接参数村成文件省得每次都要打字。
回过头来一想真是好笑,花了5块钱买一个micro HDMI我也不一定需要serial链接了吧,除非我要调试booting?吃饱了吧。用beaglebone black的初衷就是不想折腾。
vim 非要expand tab to space,那么你只有ctrl-V
Ubuntu 添加菜单真的好费劲,为什么那个菜单编辑器被拿掉了?  gnome-desktop-item-edit ~/Desktop/ --create-new

九月十一日 现在需要的是熟悉内核开发

一个人没有写程序就会变老变傻的,这个中等题目花了我一天时间,而最后答案 还是和标准测试有出入,不过我手算也不明白为什么我的有错,看上去似乎标准测试有问题吧。(不明白)看了一下别人的答案,至少有一点是我一直想做而没有 的,就是分数通分求GCD这个应该要做的,我怀疑这个就是我的错吗?不过我手算过1/4+1/5+1/6+1/7+1/8+1/9<1.0是没有错 的呀。
要多练习啊。

九月十四日 现在需要的是熟悉内核开发

我现在很烦很多的所谓的政治精英们奢谈所谓的地缘政治。凤凰卫视的座谈节目让人感到中日之间的冲突的不可避免。而大家一致认为战争的可能性不大,因为战争 的爆发原因在于误判--miscalculation。当一方有必胜的把握的时候,弱小的一方不愿意开战,当双方旗鼓相当的时候,双方都不敢轻易开战,那 么难道战争从来就不会爆发吗?那么为什么人类的历史就是战争的历史?中国认为自己的国力已经超过了日本,日本不这么认为,于是双方的误判就源于此。究竟谁 对谁错只好较量了。我以为中国过高的估计了自己的实力。

九月十五日 现在需要的是熟悉内核开发

overo和beagle的一个不同是 power的芯片,tps65950 和twl4030,这里说差异不大。到底sensor供电是怎样初始化的,我还是不明确。
中国的所谓官方媒体在评论美国的所作所为的时候从来都是从所谓的阴谋政治来看的,至今没有听到任何一个人敢说美国的初衷有任何道德层面的理由,这是为什 么?因为他们所捍卫的证权最不敢讲的就是良心,最不愿意提的就是道德,但是对于他们所统治的人民他们却从来都拿最高的道德水准来约束。一个法制国家最根本 的是政府守法,一个民主的国家最根本的是政府民主,一个有道德的国家是国家领导人有道德有良心。
找出了一个我以前下载的版本,对于i2c==>v4l2的实现有了很大的帮助。

九月十六日 现在需要的是熟悉内核开发

这里谈到overo 的i2c bus的一些很有用的信息。我知道这个对 mt9v032的应用很有用但是看不懂,可能我也不可能使用这些东西。

九月十七日 现在需要的是熟悉内核开发

像女人一样通宵看mop lady's spring。连续四十多集连续看完的滋味是什么?昼夜不停,我觉得我可能是疯子。

九月十八日 现在需要的是熟悉内核开发

任何政府都会沉溺于靠印钞票来解决财政问题,前提是没有引发严重的通货膨胀,也就是今天的美联储,反正拼命印钞票却没有通货膨胀,何乐而不为?

九月十九日 现在需要的是熟悉内核开发

遇到apt-get的public key问题:W: GPG error: http://ppa.launchpad.net precise Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F1FCBACA7BE1F97B
我要做的是安装qemu-system,首先添加deb http://ppa.launchpad.net/linaro-maintainers/tools/ubuntu precise main这个是qemu-system的所在,至于toolchain是在toolchain下面吧?然后就遇到了以上的错误,解 决的办法是这里的:1.要修正keyserver的设定~/.gnupg/gpg.conf里面default的keyserver hkp://keys.gnupg.net要修改成keyserver http://keyserver.ubuntu.com   2.要引进key,这个脚本很有用:
sudo apt-get update 2> /tmp/keymissing; for key in $(grep "NO_PUBKEY" /tmp/keymissing |sed "s/.*NO_PUBKEY //"); do echo -e "\nProcessing key: $key"; gpg --keyserver subkeys.pgp.net --recv $key && sudo gpg --export --armor $key | apt-key add -; done
不过我再看了一眼这个脚本似乎不需要修改第一步?只要执行就可以了,看上去默认的key server还是pgp.net对吗?而且删除临时cache似乎还是必要的吧?sudo rm /var/lib/apt/lists/* -vf

九月二十日 现在需要的是熟悉内核开发

重新回到了10.04因为12.04有些古怪,loopmount的磁盘读写慢的无法忍受。而其 中的dns的内容改动了,我发现/etc/resolv.conf的问题还是改这里比较好: 这个文件的修改才有用:/etc/resolvconf/resolv.conf.d/original
遇到莫名其妙的问题,居然是mkinitramfs的问题,决定重新安装rootstock. 查看rootstock代码就知道它是hardcode安装armel,这个和我的编译器也许不同吧,所以只好硬性修改成armhf

九月二十一日 现在需要的是熟悉内核开发

折腾了一天多才发现了一个严重的务必愚蠢的错误,我的脚本居然没有更新uinitrd,每次都是运行一样的,知道我突然注意到那个三十几兆的巨型旧的 uinitrd才醒悟。真的太糟糕了。这个巨型的没有strip的uinitrd是我早期的一个错误,它大概直接导致内核初始化的时候可能过早的释放了 initramfs才导致了一系列的找不到文件的错误。我浪费了这么多的时间都是再做无用功:
1.创建ubuntu12.04的本机archtexture的用于chroot的filesystem,你可以用debootstrap,他的目的是用 来编译代码使用linaro的toolchain,这个是在12.04才有armhf的,之所以使用我本机一致的amd64而不是用rootstock直 接创建armhf的filesystem是为了加快编译速度,因为用qemu-static-arm配合原生的armhf版的gcc来在我主机编译要慢的 多(注意这里的gcc不是toolchain的,相当于运行期的原生的armhf版的依靠qemu-static-arm在原生的armhf的文件系统下 运行,当然这也是在我本机的amd64的chroot环境下了。)注意这里的filesystem实际上是标准的ubuntu12.04的amd64版 本,我需要安装linaro的toolchain,这里不需要用launchpad,只要直接用默认的repositary,寻找gcc-4.6-arm -linux-gnueabihf这个包,看,这个是armhf的版本。所以,下面就需要注意也要安装armhf的运行期文件系统在第二步!!!
2.使用修改过的rootstock来安装armhf的ubuntu12.04的文件系统,这里很不幸因为官方的rootstock使用 hardcoded的armel作参数,你只能自己修改代码,在rootstock里许找debootstrap的传入参数直接修改armel为 armhf。注意这个一定是在12.04以后才可以,目前10.04ubuntu也只有armel。rootstock的参数都算是正常的,只不过我不需 要编译,(是在第一步的原生的用交叉编译,所以这里不用安装gcc)我创建的另一个原因是为了创建uInitrd,这个用update- initramfs在第一步的amd64的chroot里几乎是不可能的,你虽然可以自己手动使用modep之类的,可是你还是需要运行期的库,所以,不 如在这一步来做。rootstock的参数可以用--notarball --keepimage来保留。要安装的包 是uboot-mkimage。
3.因此现在你有了debootstrap的和rootstock的两个文件系统,我在前者作交叉编译,在后者来创建uinitrd,因此我的脚本里一部 分是在前者chroot作编译,然后拷贝编译号的uImage和lib/modules到后者然后运行update-initramfs创建 uInird,这个其实是在我的SD卡的image文件系统里loop mount的linux分区里进行的,(其实这里可以改进,没有必要在loop mount里运行,可以现在一个chroot的环境下运行update-initramfs然后创建sd.img在loop mount再拷贝,这样要快不少吧?我在ubuntu12.04的母机上工作发现在loop mount的文件系统里文件读写慢的惊人,导致我不得不重新回到10.04,不过我现在懒的改了,有空再说吧。)所以,脚本的这一部分是从头创建sd的 image再mount。
4.qemu的模拟器运行需要用到的qemu-system包,注意这个不是ubuntu官方的qemu的包,它是在linaro的launchpad, 因为官方的没有overo的板子模拟。添加deb http://ppa.launchpad.net/linaro-maintainers/tools/ubuntu precise main
为了解决模拟器的网络问题需要很多的东西,首先,母机要有必要的内核模块,其次,运行期要配置,最主要的是每次运行完回复系统网络等的。这些都在arm- qemu.sh里面。
以上就是整个运行流程的简单说明,保存这个脚本在这里。
中午风雨如晦,硅谷迎来我记忆中今年最大的一场雨。

九月二十二日 现在需要的是熟悉内核开发

发现了很多问题,主要的就是被掩盖的问题,如果没有彻底清空文件系统有很多隐藏的问题,比如dev和proc之类的都应该是空的,尤其 /dev/.udev是一个大的黑手,这个是两阶段boot的第一步创建的,如果你的内核/Uinitrd之类的有错,可是每次都会用之前创建的正确的. udev,你就看不到的你的错误了。还有个理解的错,在/etc/initramfs-tools/initramfs.conf里面的MODULES= most/dep选项我理解错误了,most是基本都包括,可是dep没有那么聪明,基本上就是你自己在另一个modules里面写了什么就是什么,我在 很多次的启动都看到找不到module的错误,一直不明所以然,后来打开uInitrd自己看了才相信没有编译所有的模块,看看我在Ubuntu下的选项 不同于嵌入式基本是把所有的驱动都加载的,所有有三十几兆,这个不知道有没有问题。

九月二十三日 现在需要的是熟悉内核开发

什么叫做处变不惊,我现在就是这个地步,居然把upstart等等最基本的都卸载了,ubuntu反复问我是否确定,还让我一字不漏的打下:Yes, do as I say!然后才肯把整个系统都卸载了,真有向我这样的人存在啊。然后所有的东西几乎都没有了,大概就剩下一个shell,我除了能重装系统还有什么选择? 连网卡的基本util像ifup都没有。当然因为我的文件和home都在不同的硬盘上mount的,所以,其实是无所谓,重装的时候我连格式化都不用,相 当于把主要的包重新覆盖一遍就好了。很多的应用我都是下载源码编译的,根本也不需要安装重新加一个菜单就行了。是不是。连bootloaer也不安装, grub照样永久的。
ubuntu is designed for playing which means you have to install/uninstall again and again. The problem of "adding linaro toolchain" is because I haven't add public key. Do this: gpg --export --armor F1FCBACA7BE1F97B > ~/.linaro_pub_key
And then use "software sources" in Administration to "import key file" under "authentication"
内核编译的官方指南, 值得尝试,看看有什么不同。我现在的问题是libc6不知道为什么是低版本,导致很多工具装不了,所以我怀疑我以前曾经从2.6升到3.0的时候升级了文 件系统,现在我是直接安装2.6的文件系统,但是内核是我自己编译的3.0所以。。。

九月二十四日 现在需要的是熟悉内核开发

有一个常识,usb的所谓的Host-controler-device(HCD),而我同时选择ehci和ohci是不对的,因为两者选一,据说前者是 支持高速,后者只有fullspeed。大概是这样子吧?
还是我的不识字的问题,manpage写的英语那么清除我就是看不懂,/etc/initramfs-tools/initramfs.conf里面的 most仅仅包含了磁盘等的基本的模块,向我需要的那些特殊设备只能自己在modules文件里强制写上,这么简单的问题花了我好多天才明白。
我差不多已经要放弃gumstix了,太困难了,太多的驱动问题,我至今都无法编译运行一个ubuntu的基本的内核,(以前是由一个版本,但是中间学车 停了一段就乱了,我在完整教本之前的config都没有记录了。。。这个是大问题,我尝试过好几个内核分支,现在都搞不清楚了。。。)看来是开发技术和方 法的问题。不是不能解决而是方法不对,是通病,即使换了板子也一样?但是网络上beagle的资料多多了,要轻松许多。还是随主流吧,大家的选择是有原因 的,现在吃了一个大亏就是买到一个大教训,选择开发平台一个最最基本的考察是它的用户群体和开发支持程度,包括趋势,很明显的gumstix已经少有人问 津了,aptina的驱动也是面向beagle的。算了,尝试beagle吧。针对 之前的脚本做了一点点的改进,保存一个版本。现在需要好好反思一下了。
看到了豹子公司的网站,让人联想无限,这个在 milpitas的中美都有的公司让人有些怅惘。突然想起当年离开cisico最后的那个下午Sharath给我的鼓励,可以想想和我有着类似想法的人何 止千千万万,比我有条件有机会的人又何止千千万万,要好好规划总结一下,看看到底要做什么,到底能做什么。迷茫。

九月二十六日 现在需要的是熟悉内核开发

赓夜无眠。
从梦中醒来睡不着了。看看x264 就明白了使用libx264.
看了看网络新闻,夏俊峰被处决了,看来不杀不足以平民愤,这里的“民”不是那个people的"P"民,而是支撑整个共产党统治基础的七千万共产党员连带 家属连带维稳机制的执行者基层公权力的维护者,如果这些人和中南海有二心,就算有两三百万的枪杆子“红色恐怖”政权也是要倒台的,更何况如果不杀这个奋起 反抗暴力执法的挑头者等于纵容鼓励造反者,等于承认腐败暴政政权统治的非法性,这等于自毁长城。与其平息不可捉摸的变来变去的民意还不如实实在在安抚一下 为自己维护江山统治的狗腿子和爪牙。所以,不杀不足以平民愤。夏俊峰是一定要死的,不杀等于当年的戈尔巴乔夫式的缴枪投降,杀了至少还可以警示未来敢于再 次和专政铁拳对抗的草民贱姓,杀了至少还可以笼络一下为红色政权卖命得利的基层维稳执法者,杀了至少可以买到几天的肃杀与沉寂,杀了至少让素来习惯于忍辱 偷生的贱民们汲取鸡蛋撞铁板的教训,杀了总归可以免去他将来留在人间的发声的祸根,至于他那个儿子看他画的后现代派的抽象主义不知道有那个精神分析专家敢 说他将来不是像杨佳一样持刀闯入公检法刀捅一大片的报复社会,不过那至少要再等上十年,作为习某人能把这十年撑过去早就是死马当作活马医哪管的了身后洪水 滔天。所以,夏俊峰必须死,这是必须的。一个人头不落地就会有千千万万个人头落地,这里费厄泼赖(fair play)必须缓行,注意不是夏俊峰的死刑的缓期执行,是死刑没有缓刑。此时的光景正是黎明前最黑暗的时刻,加州的拂晓前寒气逼人,睡不着的失眠者更加的 痛苦,看看鲁迅的《药》的开头
秋天的后半夜,月亮下去了,太阳还没有出,只剩下一片乌蓝的天;除了夜游的东西,什么都睡着。

在鲁迅的世界里普通“华”家人包括了一辈子安份守法的“良民”华老栓,克勤克俭也要缴税纳捐的好公民,在他眼里那个被当街斩首的“夏”家子弟敢于造反那是 罪有应得的,杀了他至少还有人血馒头可以尝试用巫术医治他那病入膏肓的儿子,杀了他也还可以满足一下“穷”极无聊的看客,朝廷杀人当然是为了保天下太平, 此等刁民岂能不杀?所谓“夏”家人的血能治好“华”家人的“病”。
夏俊峰是必须要死的,他不死那两个被他杀的执法者就白死了,那等于是为习大人抬轿子的人白死了,那习大人还怎么坐江山。草民是不足虑的,终日为柴米油盐挣 扎的贱姓只有在被压迫的透不过气的时候发一顿牢骚很快就会忘记的,连自己的生存都要时时刻刻操心哪有那等闲心为他人的生死操心,所以,贱姓是不会起来造反 白白送死的,民意是不足虑的,只要笼络住七千万党员和连带的体制内的政权维护者就是维稳的保证,每次140个字的呻吟是不足虑的,那只不过是屁民屌丝在白 日挣扎后夜晚自慰的意淫,不足虑,不足虑,杀了有大益,不杀有大害。杀,杀,杀。
在鲁迅的《药》里,煽动造反被抓的“夏”家子说这大清的天下是大家的,这是人话吗?他不被杀头才见了鬼了。这大清的天下有你们贱姓的份吗?
你要晓得红眼睛阿义是去盘盘底细的,他却和他攀谈了。他说:这大清的天下是我们大家的。你想:这是人话么?
小说的最后我当年读中学的时候是体会不到的,夏家子的死是不被当时的屁民所同情的,连他的至亲在给他上坟的时候都要遮遮掩掩露出羞愧的神色,他的妈妈始终 认为夏家子的死是被“冤枉”,就是本来就没有打算造反是被诬陷的含冤致死,死后夏家子的同道给他坟上插的祭奠的小花也被当作窦娥冤的六月雪,造反非本意, 防卫过了当。不知道他那个“杀人犯”的儿子将来的画里的父亲是怎样一个角色?
中日关系一天坏过一天,当年心高气傲曾经时常暗自祈祷战争早日到来,如今叶落知秋整日祈求和平生活,这就是人的变化。

九月二十九日 现在需要的是熟悉内核开发

编译libx264需要很多的cpu指令集,因为我的应用链接出错,编译指令是-march=native,不过好像不行。
/etc/ld.so.conf 里加上lib的路径。
这里有一 个关于libx264/ffmpeg的设置,不过太初级了不是我需要的。

九月三十日 现在需要的是熟悉内核开发

写在美国政府面临关门的前夕。我原本期待着这个是美国的最重大的事件,但是我的感觉是没有人担心,因为民主党似乎非常的自信,因为他们相信他们现在已经是 赢家了,不论政府是否关门或者关门多长时间在公共形象上他们都是胜利,让共和党背上骂名破坏经济让美国众多的领政府救济和退休金的人来迁怒。然而我对于这 个最普遍的看法表示一丝怀疑,子曰:强不可守,弱不能久。这个仿佛赌桌上的摊牌前的心理战,如果民主党过于自信也许会把共和党逼上绝路,因为如果每次谈判 都是一方让步的话看起来就没有变数的时候就必然爆发出很大变数的策略,这个当然很有可能是为了很快就要到来的债务上限谈判定调子,如果在这时候共和党过于 退让的话,在下个月的谈判肯定更加一无所获。众议员们上一次债务上限谈判之后肯定回到各自的选区听取了选民的反馈,这个也许是这一次共和党表现比较强硬的 原因。抛开47%吃皇粮的美国中下层人民大多数有理智的美国人都会对于美国的前途担心,任何政府如果每年赤字是财政收入的30%以上的 话都是不可想象的危机,连续五年奥巴马政府每年的财政赤字都是一万亿美元左右(今年第一次降到了九千多亿,之前四年都是一万亿以上)这个是不可想象的危 机。就算美国人不予理会未来的美国的国家前途,底特律财政破产的阴影也让所有的人都为自己将来可能的养老金资产的安全感到担心,因为将来的政府没有钱的话 今天的许诺都是空的,而且任何人都明白要解决债务加税是必然的,只不过多少早晚的问题,这样持续下去政府总有一天是要像希腊一样的出现危机的。所以,这个 就是今天共和党人的强硬的理由。联邦政府财政收入才2.7万亿,可是赤字就是1.1万亿,这个见这是大的惊人40%?这个在欧盟早就要被开除了!
美国的天量财政赤字是怎么造成的?你只需要五秒钟 google和十分钟的阅读。 作为党派之争,民主共和两党互相指责,实际的情况是那个财政收入和支出的曲线图是一目了然的,但是所有的主流媒体对此都是只字不提的,很简单,联邦政府的 财政支出一直是按照既定的速率增长,不在乎美国经济是否遭遇了大萧条,2002的dotcom泡沫如此,2008的金融危机如此,作为执政者没有改革的决 心没有大刀阔斧削减开支的勇气也是难辞其咎的。作者认为责任认定是一个很主观的问题,我同意,但是我认为奥巴马团队遇到前所未遇的大萧条是主要原因,政策 不奏效其次,不作改革削减只增不减的开支是主因。华盛顿特区上百万吃政府皇粮的以及承包商是一个巨大的既得利益集团,民主共和两党谁也不想得罪。
我想任何一个有清醒认识的人都应该明白在短期内美国经济绝对不可能重新增长到2008年经济危机前的高峰,甚至从长期来看美国经济是否能够重新达到当初依 靠房地产透支达到的泡沫都是一个问号,可是从美国财政开支的增长曲线来看毫无增长减缓的迹象,更不要说下降了,那么就算美国经济重新恢复增长依然会每年有 差不多一万亿美元的赤字,这个还是目前最好的预计结果,如果剔除很多虚假透支的经济成分,比如依赖巨额国防开支形成的军火工业,如果你削减财政开支就会减 少,全国几千万依靠社保救济的低收入阶层,你减少开支就导致依赖的经济消费下滑,这在民主党看来削减开支无异于自我毁灭,但是从共和党看来,未来长期的财 政赤字如同威胁美国金融支柱的达摩克里斯剑一旦爆发对于美国国运是毁灭性的,因此目前的维持现状无异于饮鸩止渴,而且从2016的大选来看,与其让奥巴马 把国库亏空来给选民派糖重新当选更加无指望,就算选上了国库亏光也没有意义了,所以,目前破釜沉舟未必是最坏的结果。当然,表面上大家争论的确实一个旁支 的论题,就是奥巴马的医疗改革,这个东西我根本就不明白是怎么回事,但是有一点是我从一个电话讨论节目听来的很有道理:这个改革瞄准的只不过是四千多万美 国没有医保的人,其实大概就是美国15%的人口,美国要解决这个问题实际上是要解决美国的贫穷人口的根本问题,因为这个人口比例和美国的贫困县人口差不多 的,只要政府出钱解决了贫困人口问题自然迎刃而解,根本不需要影响到美国大多数,可是美国政府现在哪里有钱?而且从世界来看贫穷问题几乎没有一个大国能够 解决,一个国家总会有收入垫底的15%的人口,就算全体都派钱还是有穷人。那么奥巴马的解决办法大概就是政府出一些钱再从其他85%的人口的医保上来平摊 一些,这个在任何社会都会有抵触的,尤其现在在经济萧条的时刻。共和党更抓到民主党的小辫子,医改政策允许国会的职员可以豁免医改,这个当然就看出来很多 人是不愿意参加的,否则也用不着豁免。
总之,政府关门并不一定解决什么问题,共和党第一未必敢,第二未必有好处,第三就算关门也可能就是一两天,但是这个姿态可能会让民主党有些态度改变。(但 也可能会让民主党更加强硬拒绝任何谈判,让共和党最终完全妥协。)但是,从共和党看来这个是没有办法的办法。除此之外,你是共和党你有什么招?
在github建立一个repo来保存代码。
1.git remote add origin https://github.com/nickhuang99/staroceans
2. git branch --set-upstream MyCapture origin/MyCapture
3. git push origin MyCapture
错误:error: The requested URL returned error: 403 while accessing对于这 个错误的解决办法是修改.git/config的url从https://my-user-name-in-github为ssh: //git (这里假设我已经设定这个repo为Public了。)
所以目前我的这 个小小的capture的工程就在这里了。我所使用的x264实际上是标准的libx264的repo代码,我为了方便也放在网上了,是x264的branch
播放yuv的命令是ffplay -f rawvideo -pix_fmt yuv422p -s 640x480 output.yuv
我使用x264转换:x264 -o output.264 output.yuv 640x480
使用ffplay播放:ffplay output.264
对于yuv420,我的代码有问题。
对于git的文件permission的差别可以忽略掉:
git config core.filemode false
美国政府现在被迫关门,其实预计关门的时间不会长对于实际造成的损失其实也不会很大。但是,这个也许对于共和党确实一个重大的失败,因为坊间的评论员一直 认为共和党实际并没有做好这个策略准备,说是共和党一心一意要让政府关门还不如说是民主党成全了他们,因为民主党压根儿就不怕,甚至乐见其成因为这让共和 党在公众的形象更糟糕。讲老实话我认为共和党其实仅仅想耍个小动作捞点实惠让奥巴马的医改方案挫折一下或者实在不行就把医疗器械税免掉,可是没有想到民主 党吃定了共和党寸土不让,因为双方其实都知道下个月的债务上限谈判才是真正的重头戏,现在退让就让对方得寸进尺,结果我认为现在共和党骑虎难下了,退让就 是输的一败涂地,不但失去共和党基本层面的支持也让中间独立选民唾弃,但是政府被关掉原本作为执政党的民主党似乎号不伤心,压根就是偷着乐,看你怎么收 场?如此一来下个月的债务上限谈判共和党压根就不敢再强硬了。所以,我感觉共和党现在非常被动,除非破釜沉舟,否则一败涂地。

十月一日 现在需要的是熟悉内核开发

看凤凰新闻视频,在昨天美国政府国会陷入僵局的时刻,国家财政交投烂额之际,在太平洋的另一侧中国的领导人带领他的执政小团体去中国最大的高科技园区中关 村现场参观学习,其后习关于高科技发展国家战略的讲话虽然不脱于中共的当权者的陈词滥调,但是其中的五条战略也确实是正确的方向,我想任何有远见的领导者 所能想到的不外乎如此,我的个人感受是习近平是当前大国领导者中非常强悍的之一,是不可小看的对手,虽然我对于共产党深恶痛绝但也不得不承认,如果我处在 奥巴马的位置我会把习近平当作我的非常可畏的对手,至少是绝对不可疏忽的竞争对手。美国的民主是否过了头?这个问题就像很少有人提及的美国的医疗是否过了 头一样?究竟是否全体国民都需要超过国力的超级医疗体系?大多数美国人对于近半数美国人靠政府食品券维持一定的生活的前提下是否有足够的钱去享用高品质的 医疗服务?当美国大多数的贫困人口相当数量体重超标的时候是否有人想过美国的食品救济也许应该重新思考?人类进化过程中充满了饥饿疾病死亡,而作为进化的 机制淘汰了很多的个体,是否今天人类科技和财力已经可以不用再遵循自然法则,而像奥巴马总统所宣称的那样:社会达尔文主义应该终止!果真如此吗?在圣何 塞,美国的高科技摇篮,硅谷,Santa Clara,美国最富裕的县之一遍地都是无家可归者,市政府门口在晚上就成了露宿者的营地,在密密的溪流河岸边,在丛林深处到处都是搭帐篷的难民营,哪里 遍地垃圾,臭气熏天,还不时地有衣着体面的年轻人进进出出,让人感叹美国的沉沦,在这样的困境中,美国联邦政府依然每年有超一万亿美元的赤字,可是这些钱 连美国人基本的生活的不可能完全保障,那些难民营可能比中东阿富汗叙利亚可能都不如。每年财政赤字超过财政收入40%的入不敷出,国会与总统却在奢谈什么 伟大的美国,沉沦之中还不自知是最大的沉沦。看国会议员辩论,感觉民主党议员大多不讲理只煽情,共和党相对就事说事,也难怪民主党大部分是有色人种和妇女 以及看上去像是财阀的老人。黑人妇女连自己助手写的稿子都念的不通顺,更声嘶力竭厉责共和党不负责,我在美国看厌累了黑人胖妇振振有词的讲自己的权力的辩 论。正如朱同学说的,美国的人口未来如果是黑人和拉丁裔将是美国没落的必然。
我初步的测试认为libx264内部不支持除yuv420p以外的格式。这个在很多地方我都看到过,所谓的支持格式选择都是针对输出的。
创建我的代码的git repo是这样的:
1. git checkout -b SomeBranch
2. git remote add staroceans ssh://git@github.com/nickhuang99/staroceans
3. git push staroceans SomeBranch
4. git branch --set-upstream SomeBranch staroceans/SomeBranch
我把我的编译的ubuntu -lucid的内核代码放在这里,branch 的名字就是ubuntu-lucid,我基本上没有改变这个3.0.69的内核版本,原始是git: //kernel.ubuntu.com/ubuntu/ubuntu-lucid.git,我仅仅把我需要的rtl8012的wifi的asus驱动 “硬”加入了,为此还删掉了原本的usb的架构,这纯粹就是我自己图方便的。
准备一步一步把我的以前的保存的代码都放在github。
我编译mplayer遇到这样的错误:Error: no such instruction: `vpperm %xmm3,%xmm1,%xmm2,%xmm1'我知道这个错误大概是我的assembler太老了,我试图禁用一些指令集,但是好像它是avx,不属 于什么sse之类的,configure里没有这个选项。于是我决定冒险升级binutils,我印象中这是一个非常危险的动作,因为这个是系统的编译的 核心,gcc依赖于次,但是话说回来了我现在又不是交叉编译环境,编译器和汇编器是彼此独立的,不是吗?就算除了问题,大不了重新安装ubuntu的官方 的旧版的binutils难道有问题吗?这是binary的precompiled根本不需要系统有编译器不会干扰的。所以,试一下吧。果不其然,我现在 越来越佩服我自己了,从这一点应该也可以明白一个浅显的道理,ubuntu官方版本的软件应该都是禁用了-march=native的选项不做cpu优 化,那么除非有软件写成运行期动态选择与编译的汇编指令版本,(我觉得应该mplayer之类是这么作的?没有看那代码瞎猜。)否则都是未优化的,这就是 一个自己编译官方软件的一个主要原因吧?我怎么以前没有想到呢?(不过很多软件未必有detectcpu的设置。)
libdvdcss2这个我还是有印象的因为当初的英雄逆向工程破解了DVD解放了人类,其中的头文件可能只能自己下载代码手动安装了。 dvdcss/dvdcss.h
我感到奇怪的是我怎么没有存下这个关于h264-decoder的文章呢? 简直不可能,我肯定是有的。我还把他的程序编译了一遍,这个旧的工 程也备份一下吧 branch是h264decoder总体上看这个可以作为学习的范本,我以前肯定是进行了一点,也许当时学习h264的annix的头文件部分就不了了 之了,结果的yuv好像有不少噪音。

十月二日 现在需要的是熟悉内核开发

eclipse的开关是-std=c99总是忘记。找到了这个以前不知道从来哪里拷贝来的范例,备份一下,branch 是myh264bitstream.
从中南海到中关村的确是非常值得关注的,这个举动是难以估量的,奥巴马无疑是一个非常有头脑有才干也有相当的道德观,但是不可否认此人律师出身天生的弱点 就是夸夸其谈难成大事,而且过于重名总想青史留名与马丁路德金匹名,孜孜以求要为美国中下层争取更多的权益,然而一个国家的强盛是依靠顶层的25%的努 力,底层的15%在任何国家都是累赘,从人到的角度是应该救助,从国家的发展来看应该激励让其中有能力的上浮,至少让其后代有机会从头来过,而更重要的是 保证50%的阶层努力不至于沉沦。美国现在缺乏的是驱动力和领导力。

十月三日 现在需要的是熟

NAL: Network Abstraction Layer
RBSP: Raw Byte Sequence Payload
VCL: Video Coding Layer
CAVLC: Context-Adaptive Variable Length Coding
DPB: Decoded Picture Buffer
ASO: Arbitary Slice Order
FMO: Flexible MacroBlock Order


H264:
(NAL Header)(RBSP)(NAL Header)(RBSP)...
Baseline Profile的定义就是I,P slices + CAVLC + slice groups and ASO + redundant slices
H264明确就是使用yuv420P或者Interlace的,(对于yuv 的格式我始终有混淆的地方,这个到底是不是权威的表达呢?作者好像是不是很确定的个人表述?)
这个power-law的内涵非常的深刻,我看了也只明白了一些定义,其中的非线性关系让我想起了线性代数的线性变幻,这两者的本质区别就是这个数学的表 达。兩者是一个相当广泛的现象,我到达这里的原因是学习什么是gamma变换,道理其实原本就听说过,但是真正的意义却需要慢慢的体会,因为Yuv也好 Y'uv或者Y'CrCb或者gamma变幻(压缩?)本质都是针对人眼的特殊性的“投机取巧”,就是减少数据量,其中的本质原因当然和太阳光的绿色主要 成分相关,但是gamma我觉得更加的广泛应该是人眼中神经感受体的概率分布相关,这个当然都是废话,我们现在有必要讨论太阳系以外的生命体的视觉系统 吗?总之,再复习一下RGB到yuv或者YCrCb都是线性变幻的过程,Y和Y'的区别在于前者是一个人眼感受的颜色程度后者是电子束的强 度或者是电压。 (理解就好了)
关于gamma压缩的目的 wiki讲的很清楚, 因为过强的光实际人眼无法察觉其微小变化,而相对阴暗的部分人眼的敏感度倒是很高,(也许人类当初就是夜间活动所需而进化来的。(这些废话有用吗?我们需 要关心人类的进化历史吗?))总之,学一点一滴也是号的,人类都是惰性生物,能够专心郅支学习都是偶然的,和猿猴当初能够偶然进化一样(Space Odysse2001?外形播种?)(超级发散思维?)
这个wiki里所说的Y'=0的图真的好神奇,这个 是什么意思呢?把Y'=0带入公式得到的是R=R,B=B(detail: R=1.139V=0.877*1.139*R=R), 那么G=?奇怪的是G=-0.51R-0.193B这个意义是什么呢?作实验y'=0不论uv都几乎是人眼能够识别的最黑暗的场景。y'=255就是1是 人眼不能识别的惨白。u=v=0就是惨淡浅绿。y'/2给人以暗房的感觉。
关于美国政府关门一事共产党的喉舌又开始嘲讽这是美国民主制度的失败,褒奖共产暴政的优越,其实稍有头脑和对美国社会现实有了解的都会意识到这个正恰恰是 民主制度优越处。当前美国的问题就是行政当局首脑--奥巴马总统的独断专行超越国力举债不顾国家前途片面主张无限制救助社会中下阶层的问题,公务员体制腐 朽政府开支庞大在国家经济衰退之际不思削减年年递增的公务开支的问题。这个问题在所有国家都有,在中国这个暴政体制下三公消费到了令人发指的程度,公务员 体制豢养的体制差异达到了全民考公务员的程度,有什么解决办法呢?完全没有可能。而在美国的民主体制因为三权分立,国会可以断然拒绝拨款强逼政府改革,这 一点是共产暴政的优越还是民主制度的优越?
在美国当前的政治体制架构下,中央政府即联邦的实权要比共产暴政小的多,对于普通民众完全可以不理会联邦政府因为在显示生活中根本就看不到联邦的存在,只 有州和市县政府才和民生息息相关,因此,在中国民众以为天塌下来的大事在美国其实并没有那么严重。我们甚至可以有理由相信共和党在反复谋求削减财政赤字不 成而出此下策实际裁剪政府开支,因为民主党几年来完全不走正常预算审议的程序每年都用所谓的CR(Continuous Resolution)来绕过众议院对于政府预算的监督,使得事实上政府连年预算赤字都在上万亿美元超过财政收入40%以上,任何人都明白长此以往美国不 亡国才怪,但是民主党是一个毫无道德廉耻的政党为了选票片面讨好美国中下层有色人种自由嬉皮士掏空国库使得派糖使得国债超过16万亿美元这已经是全年的 GDP,看起来和欧洲日本不算特别多,但是其增长势头却非常非常的快,远远超过全世界主要经济体的很多倍,这才是要命的,因为现在几乎没有丝毫减速的迹 象,如果任由奥巴马做完四年任期美国可能就万劫不复了。因此在当前采取断然措施关闭联邦政府是明智之举,因为共和党现在可以长线作战争取部分回复一些必要 的联邦政府的部门从而达到实质裁剪政府预算的功效,这个要惯用的多,否则奥巴马这个流氓团体完全不会理会美国十年后会怎样。只要共和党顶住压力坚持一个月 局势就有转机,因为在债务上限到达之际连奥巴马这个流氓总统也不得不妥协。加油!TEE PARTY!

十月五日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

翻看日记才明白我这一年来完全是陷入了迷途:原本就是要掌握熟悉h164,之前也开始看decoder的代码,已经打算从bitstream读取nal头 开始,但是不知道怎么回事却去研究cpu指令集优化,也许是嫌dct/idct之类的效率的问题,后来有去看stl的算法,不知道那一天需要升级编译器, 升级内核,游花时间开始看cryptography的课程,然后把从前gumstix的单片机(SOC)翻出来,然后有一天要把mp3拷贝到三星的手机 里,ubuntu没有合适的程序,结果研究了半天的mtp/ptp2还打算把usb的驱动整合mtp协议,最后遇到手机usb一些莫名其妙的失败不知道是 不是libusb的问题才作罢否则还不知道要折腾到什么时候。中间有没有在玩别的我自己都不记得了,总之,不要说一个月以前,就是一个星期以前我在干什么 想什么都不记得了。现在过了一年看日记才想起来当初想要干什么,现在想来搞了两三个月的嵌入式原因也许仅仅是因为我当初花了70块钱买的aptina的 cmos相机镜头没有办法在gumstix上识别不甘心?还是当初就打算把h264压缩/解压缩放在gumstix,配合遥控直升机?现在要考虑一些目 标。
记录一个h264实现的jm工程。这个是 手册。下载的代码jm-18.5.放在 github上,branch的名字是h264decoder
看cspan美国国会参重两院的国会议员们的发言与辩论真的是一种享受,不单单是其中英语的语言的魅力,更有演讲者的激情感人,很多人看得出来是发自内心 的心声,绝对不是所谓的官样文章,当然也有一些很可能是说着言不由衷的留声机一样的重复,但是绝对有很多人是按照他们的信仰的真心表达。这就是演讲的魅 力,这就是领导者的一种独特的能力。作为美国的政治机器中国会一环其实并不需要从事实际的工作,因为立法主要是反映民意,也就是所谓众议院的头衔---代 表,这里的代表当然绝对不是共产暴政的所谓“人民代表”,因为在中国的政治橱窗里的所谓代表只不过说明他们都佩带着各式各样的豪华的手表而已。
作为美国总统的奥巴马是一个很独特的人物,它是第一个黑人总统,即代表了它肯定有独有的能力,也注定了它的内心深处的自卑与孤独,在当今民主党之所以有今 天的状况和奥巴马的独断专行分不开的,民主党控制的参议员十分霸道连续四年根本不做预算只在上一年基础上做一个所谓CR(Continuous Resolution)就交给共和党控制的众议院来拨款,共和党当然很恼火但是毫无办法,行政长官对于政府的开支的不予控制达到了登峰造极的地步,美国的 国内生产毛额大约16万亿美元,财政开支竟然将近4万亿差不多是四分之一,而财政收入不到三万亿美元,每年一万亿的赤字连续五年毫无悬念,这个简直是难以 想象的,但是民主党为了抱住选票可以说是寅吃卯粮毫无节制,这个让美国中产阶级机器不满。所谓的医疗改革根本也是劫富济贫,首先美国所谓的4千万没有医疗 保险的人口扣除非法移民也就是2千多万不到人口的15%,这个本来就是美国的贫困问题,政府有钱就去救济,没钱却像个所谓的投机取巧的办法来个大家一刀 切,明摆这政府不出钱却要解决穷人的医保就是让中产阶级出钱的花招。至于说奥巴马为什么要这样不遗余力的强制推行可以从他本人的新台找到答案,美国的 2013的电影《林肯》说明了他的心声(注意不是那个轮着大斧子杀吸血鬼的林肯是那个颁布废除黑奴的总统),它是奥巴马的两个偶像之一,另一个是提出人权 法案让黑人平等的马丁路德金。在奥巴马的内心深处充满了深深的自卑,因为在他看来美国黑人依然是受压迫受剥削的群体,他的理想即使要彻底改造美国 (transform America)。因此,通过这个他的冠名的法案就是一个名吹青史的机会,所以,他要付出一切来推行。但是这个真的是美国人或者美国黑人的福音吗?中国人 说救急不救穷,美国人也说人要自救然后上帝才救之,奥巴马的黑人兄弟不是缺乏平等的权力而受歧视,是他们自己的不努力不上进,他自己就是从社会底层爬上来 的这本身就证明了美国黑人不需要这些救济,他们需要的是美国整体的繁荣。否则国家财政入不敷出到头来谁也没有饭吃。
很多人看到奥巴马不参加APEC峰会就嘲笑美国的共和党关闭联邦政府让美国的实力受损,其实美国内人人都知道这都是这个总统在作秀给共和党施加压力,故意 让美国在国际丢面子。如果奥巴马真的有必要呆在国内解决问题他就应该和共和党民主党坐下来谈判,可是他什么也没有作,说不定在白宫后院练习高尔夫呢!
圣经故事里说摩西带领以色列出埃及前恳求埃及法老解放以色列人,法老不肯,摩西就释放了上帝给与他的神力带给埃及十大灾难,法老终于在第十个瘟疫害死了他 的儿子后才不得不答应。现在共和党和奥巴马谈判仿佛就是这个场景,共和党哟给美国带来十大灾难之后奥巴马才有不得不答应改革财政赤字。
非常简单的写了一个无比简单的 libx264压缩yuv420p为h264的小小的客户端, 主要是为了实验用,原因是发现jm18.5虽然压缩比搞不少(不过我也没有尝试x264的参数组合)但是速度实在是太慢了,就算是用多线程如x264我也 怀疑他的速度是否能够提高多少,因为我编译的时候使用了o2,先比较效果再说别的。明天要去考驾照,之后就业必须开始找工作,所以,这个方面也要加紧了。

十月七日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

昨晚上升级TVPad的firmware,这个东西有些莫名其妙,从2.42到2.62后app全都消失了,根本没有app-store的功能,只好继续 升级到3.26才能安装app,如果2.62仅仅是一个transition版本为什么不能整合进升级文件?也许这是我这个版本的硬件的特殊问题,总之这 个是一个缺憾,但是看到中国的机顶盒发展还是有些感触的,在新技术的引进方面中国现在越来越有竞争力了,市场的独特,技术的独特要求非常的引入注目。
怎样在eclipse里定义什么汇编器来使用呢?我不能用gas,因为libx264需要使用yasm1.2.这个要解决。

十月八日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

在eclipse里只好把AS的汇编器指令改变为:yasm -f elf -m amd64 -DPIC -DHIGH_BIT_DEPTH=0 -DBIT_DEPTH=8 -DARCH_X86_64=1 -I./common/x86/
奥巴马的高级幕僚放话说宁肯违约也不能妥协,这个口气架势绝对是奥巴马本人的话,否则没有人敢说这个话,那么如果你看过电影《林肯》你就一点都不奇怪为什 么奥巴马会这么说,它完完全全在模仿林肯的一举一动,不过我不知道他是否打算像林肯一样被暗杀,但愿FBI懂中文的不要看到这个,也不要在将来把这个和我 的今天早上的言论联系起来,美国人就算是铁杆茶党也不会为了这个干这个,不值得,因为最多就是欠钱不还,又能有什么大不了的?这个看来不一定是简单的政治 谈判的姿态,共和党也许是下定了决心,破釜沉舟,不过行内人都明白美国财政部所谓的10月17日根本就是骗一骗普通人,因为美国财政部不停地有税收收入, 同时政府停摆原本要支付的工资开支都省掉了,所以可以至少在维持到月底,其次,就算没钱了支付利息是戳戳有余的,违约是绝对不会发生的,所以共和民主两党 心里有数就可以开打持久战了。至于影响最大的群体是联邦雇员,但是国会已经通过法案保证所有人在危机过后可以保证领取到工资,所以,大家不用上班也可以领 工资何乐而不为?所以,在美国除了政治家没有人抱怨。
编译libx264始终有错误:relocation R_X86_64_PC32 against symbol “xxxxxx" can not be used when making a shared object; recompile with -fPIC
怎么也找不到头绪,后来看原始的编译结果发现libx264不是完完全全的PIC,而是分两部走,第一部分的汇编部分是静态库
ar rc libx264.a  common/mc.o common/predict.o common/pixel.o common/macroblock.o common/frame.o common/dct.o common/cpu.o common/cabac.o common/common.o common/osdep.o common/rectangle.o common/set.o common/quant.o common/deblock.o common/vlc.o common/mvpred.o common/bitstream.o encoder/analyse.o encoder/me.o encoder/ratecontrol.o encoder/set.o encoder/macroblock.o encoder/cabac.o encoder/cavlc.o encoder/encoder.o encoder/lookahead.o common/threadpool.o common/x86/mc-c.o common/x86/predict-c.o common/x86/const-a.o common/x86/cabac-a.o common/x86/dct-a.o common/x86/deblock-a.o common/x86/mc-a.o common/x86/mc-a2.o common/x86/pixel-a.o common/x86/predict-a.o common/x86/quant-a.o common/x86/cpu-a.o common/x86/dct-64.o common/x86/bitstream-a.o common/x86/sad-a.o common/x86/trellis-64.o
ranlib libx264.a
然后才编译成动态库,这个我在eclipse里怎么定义呢?
gcc -o x264  x264.o input/input.o input/timecode.o input/raw.o input/y4m.o output/raw.o output/matroska.o output/matroska_ebml.o output/flv.o output/flv_bytestream.o filters/filters.o filters/video/video.o filters/video/source.o filters/video/internal.o filters/video/resize.o filters/video/cache.o filters/video/fix_vfr_pts.o filters/video/select_every.o filters/video/crop.o filters/video/depth.o input/thread.o output/mp4.o libx264.a -lgpac_static -lz  -m64  -lm -lpthread
gcc -o libx264.so.124  common/mc.o common/predict.o common/pixel.o common/macroblock.o common/frame.o common/dct.o common/cpu.o common/cabac.o common/common.o common/osdep.o common/rectangle.o common/set.o common/quant.o common/deblock.o common/vlc.o common/mvpred.o common/bitstream.o encoder/analyse.o encoder/me.o encoder/ratecontrol.o encoder/set.o encoder/macroblock.o encoder/cabac.o encoder/cavlc.o encoder/encoder.o encoder/lookahead.o common/threadpool.o common/x86/mc-c.o common/x86/predict-c.o common/x86/const-a.o common/x86/cabac-a.o common/x86/dct-a.o common/x86/deblock-a.o common/x86/mc-a.o common/x86/mc-a2.o common/x86/pixel-a.o common/x86/predict-a.o common/x86/quant-a.o common/x86/cpu-a.o common/x86/dct-64.o common/x86/bitstream-a.o common/x86/sad-a.o common/x86/trellis-64.o   -shared -Wl,-soname,libx264.so.124  -Wl,-Bsymbolic -m64  -lm -lpthread
算了,放弃编译动态库,就编译成静态库,使用的时候多一个链接m,pthread就是了。这个libx264 的工程保存在这里。
昨天考驾照勉勉强强及格,16分fail,我考了15分。

十月九日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

昨天一鼓作气租车买车办完了大事累死了,但是失眠依旧伴随着我,世界上知晓失眠痛苦的人不知道有多少?
看李克强在东盟峰会上的讲话还是挺有感触的,此人确实是治国之能臣,一个人不管其他,首先言谈举止就可知大略的才干,世界各国领袖都非等闲,自然能够察人 通晓,而中国目前扩大东盟合作的确是上上策。本身东盟就应当如同美国的南美后院一样成为中国的势力范围,如同黑社会老大对于自己的势力范围都是要采取怀柔 政策,更何况中国实际对于东盟的资源市场是有巨大需求的,对待领海争端和东盟这些小国动手是投鼠忌器轻了不行,重了不妥。所以还是不如和日本硬碰硬,而对 于东盟点到及至让中日高强度对抗作为威慑东盟就可以了。
对手是非常的强劲,我一贯的用既便宜又强韧的步兵为主首先抢占地图中央的湖心小岛。此地易守难攻位居中原四通八达仅仅两三个士兵就能有效将进攻者阻滞在护 城河上的不利地形给反攻带来巨大优势,同时他也可以作为部队东西左右机动的中转站,可以说此地的得失关系着全局的胜败。我的部队沿着湖心岛拉成一到防御线 所有防御阵地么是山头高地要么是城堡森林可以说是占尽了地利的优势,此时我以防御为最大策略利用抢先占领的湖心岛迅速用人链方式如波浪一般在东西战线上随 时机动兵力做到在一个回合能迅速将一个步兵从最东调到最西,反之亦然,在这种高度机动的过程寻找对方防御的漏洞。同时开始招募大树作为攻坚的前锋。显然对 方没有我的湖心岛地利在防线上很难做到一线平均的无破绽,我然后开始利用我的弓箭手的较强攻击力开始进攻对方驻守城堡的孤独守兵。同时拍我的高度机动力的 骑兵突击进入对方的大后方准备袭占对手空虚的后方村镇夺取资源。

十月十一日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

昨天开车有些疯狂将近七八十英里其中有一二十英里是蜿蜒盘旋的山路,宽度连u-turn都不够,一路也不准停车,很多地方将近90度转弯还带陡坡上下,有 些地段只能单车通过,对于发动机动力和刹车都是一些考验尤其对我这个刚刚勉强通过路考的新司机真的让人后怕。以后不敢了。早上看一点libx264的代 码,找需要找的东西真的不容易,其中有一个有趣的地方,就是不使用memcpy因为这个好像按照注解说的有alignment的问题,而把拷贝改为一个特 殊结构的成员赋值,结构的alignment是可以统括编译器指令安成alignment的,所以这个相当的有意思。
共和党的希望在于Ted Cruz,他的演讲令人机动的热泪盈眶。

十月十三日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

JM-18.x 版本的encoder非常的慢,也许是我的参数不对,因为libx264之所以快除了多线程之外也许就是很多的参数的设置,因为我注意到 libx264的压缩结果文件要比JM大不少。不过这个作为和对称的JM-decoder来参考是非常的号的学习材料。
时不时的我感觉我也许退化为某种冷血动物因为每当气温下降我的活力就下降以至于需要一个热水澡来维持体温。

十月十五日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

把以前的小的实践版本保存一下啊,这个是ptpusb是我的一 个小小的实验,在原来ptp2的代码上修改实验,这个使用的usb的库是libusb的 源代码。

十月十七日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

topcoder不能运行了,折腾了好一会儿,我基本确定又是java环境了的问题,因为最近我还成功运行过,安装ubuntu的官方的java的 openjdk之类都不行,也许是因为ubuntu 10.04不再被支持所以没有openjdk7的缘故吧,总 之我尝试安装java1.7,结果就可以了。topcoder 的纯粹就是练习
下载了一本scsi的编程的初步, 纯粹为了应付一下面试用。
早锻炼一下,Three players are playing a game of word composition in which each player writes down a list of words. After the time expires the scores are calculated using the following rules. Each player gains 3 points for each unique word that only he has, 2 points for each word that is shared with exactly one other player, and 1 point for each word that is shared with both of the other players. You will be given vector <string>s listA, listB and listC - the word lists of playerA, playerB and playerC respectively. Your method should return scores of playerA, playerB and playerC in the form "scoreA/scoreB/scoreC" (quotes for clarity).
题目很简单,大家的想法也基本都一致,基本都是建立三个set<string>然后数一下,不过那些专业的剑客我始终不知道他们是每次都自己 定义那些类似与algorithm里的宏还是topcoder的那些editor里有工具帮助你去做的,否则你让我每次都去定义 #define  all(c)  (c).begin(),(c).end()我觉得肯定是编辑器里让你保留了你的那些小宠物,不过,现在回过头来看我确实应该学习这种纯宏的编程风格,比 如,我很笨拙的用循环初始化一个set<string>居然没有意识到可以vector<string> strVect; set<string> s(all(strVect)); //all这个宏挺不错的。回过头来看别人的代码真的是相形见绌,这些人真的大牛,我佩服的五体投地,因为我一直在想有什么优化的地方,结果看到一个满分 得主立刻就明白了我的分数和他差那么远是多么的地道:和大多数人的三个set<string>的不同,他声明了一个map< string,int>,因为题目保证了每个人的word是distinct的于是就把所有的词map到一个int,然后看每个人的词有map几, (自己的至少是1),多好啊,因为你节省了存储(三个人重复的你不用再三个set都存啊),一个字,牛,我心里模模糊糊知道有什么地方可以优化的就是没有 想清楚。天地之大,能人之多让人叹服啊。这几年我也觉得自己一直在进步,每年都有不少的提高,可是越接触越感觉能人越多,还是无知最快乐。
昨晚买了《big bang theory》的第六季,比我预想的好得多至少比上一季好的多。

十月十八日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

挖掘到了一些计算机古董,在sunsite.unc.edu沉睡这个一个anonymous的ftp账户,在里面有很多多年以前的archived的古 董,这里是一些在linux童年时代的回忆
朝花夕拾,把以前的老代码重新拣起来收藏作纪念,这个是aws的EC2和S3 的小工具和联系。
电影频道播放旧电影《黑三角》,这个我小时候还是挺喜欢的饭特电影现在来看激起了我对共产党的深仇大恨,一个用谎言与欺骗,用恐怖与暴力建立起来的专治政 权是多么的丑陋与可恨。

十月二十二日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

半夜醒来,回想很多,感觉丁春秋和苏星河就是两个极端的例子,后者涉猎太多,贪多求全,什么都感兴趣什么都想尝试,结果杂而不深,都懂都不精。而前者就是 专精的典范。
关于public key,这 里讲的太清楚了,public/private这一对是对称的,如果一个用来加密,另一个就用来解密,发送者用自己的private key加密之后发给别人用public key 解密对照数字签名就能够验证发送者的身份了。
A, B两个人各自把各自的public key发给对方:
A: using priA to encrypt msg as cipherA and calculate signature sigA. Then encrypt cipherA+sigA with pubB and send to B. B use priB to decode and verify that sigA is signature of cipherA to be convinced the msg is authentic from A. Then decrypt cipherA with pubA. 这个流程其实很简单两年前实际作AWS的REST的时候别人指点才明白,但是始终印像不深。
关于我的motorola sb6121和comcast的链接以后记住了:
1. sb6121的ip是192.168.100.1
2. 我的west digit的router的设置是DHCP形式,只需要设置primary DNS 为cable modem的ip: 192.168.100.1
3. 可能需要两者都重启才行。我按照以前at&t的习惯把router设置为192.168.1.253 (不明白我怎么老是认为192.168.1.254??)
4. router的登录是admin,密码是ubuntu的密码。
关于auto_ptr被人问过无数次,老是答的不对,这个是最最低级的,远远没有shared_ptr和smart_ptr的功能,仅仅实现以下的功能:
1.实现assignment operator和copy constructor的传递指针。
2. 当指针是兼容的时候,比如继承类之间赋值,需要额外的再实现一个模板的成员函数如下:
template<class T>
class Auto_Ptr{
private: T* m_ptr;
public:
// a constructor with type T1 compatible with T, i.e. T1 inherit from T
template<class T1>
Auto_Ptr(Auto_Ptr<T1>& a):m_ptr(a.release()){}
// similarly the assignment operator
template<class T1>
Auto_Ptr& operator =(Auto_Ptr<T1>& a){ reset(a.release()); return *this;}
};
其实最好是自己默写一遍STL的代码,这个auto_ptr是很简单的,难的是shared_ptr的代码,还有boost的smart_ptr的代码, 一定要看一遍,而且要看懂。

十月二十三日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

抄写auto_ptr的代码其 实收益良多,因为我有很多的错误模糊观念,比如conversion constructor和conversion operator就是根本两个完全不同的东西,我却很模糊,首先,前者是constructor相当于把constructor的参数写在等号后面(多土 的说法?)ClassA a=5; // assume there is a constructor of ClassA taking int as parameter like "ClassA(int )"。 而所谓的conversion operator或者说是conversion function纯粹是一个成员函数只不过是函数名子就是要返回的类型,比如
calss ClassA{public: operator ClassB(){return ...}};
很有意思的是在实验我的抄写的auto_ptr的模板类的时候会遇到一些有趣的现象,比如在函数里声明local class,可是这个localclass是我的模板类的类型参数就不行了,因为模板类是定义在其他头文件没法访问这个local class。这个我以前绝少使用localclass。
我曾经猜想对于继承类和基类之间的转换是否需要调用到conversion function呢?事实不需要的,这当然的了,这个是c++的基本特征不依赖于你实现类型转换函数,我只是在担心是否有ambigous的问题。

十月二十五日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

出发了,目标montreal!

十月三十日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

回来了,一路上风尘仆仆,在过海关的时候不是很顺利心情郁闷,听了一路的斯琴高丽的爱到陌生。
算法真的很神奇也很难,我没有天分只好用人类的想法来理解天上的事情,就 以当前热门的三中全会改革议题来说说next_permutation的算法, 这个是面试的热门话题。改革的核心是改变当前的社会制度让有能力的底层的人才浮上去,但是作为统治阶级改革是哥他们的命是被迫的,无奈之举,迫不得已下让 自己的同僚牺牲既得利益需要采用最小镇痛的原则,也就是所谓的“循序渐进”,这个也就是permutation的实质,我们要把当前的序列从最不合理向最 合理的方向一步一步改变,每次都只改变最小,但是每次的改变都是所谓的增加正能量,让当前底层有能力的人替代上层所有没有能力的最低的那个。举例来说,当 前的序列是1,2,3,4,5,6,从左到右代表从上到下,数字大小代表能力,很显然地位越高能力反而越低反映了中国当前社会的不公达到了顶峰,理想的社 会应该是6,5,4,3,2,1,就是说能力最强的处在最左边也就是最上边,人人所得以其能力成正比,但是从最不合理改革到最合理需要总共120个阶段 (就是6!阶乘6*5*4*3*2*1,需要全社会每个成员都竭尽所能大家齐心协力就是用乘积而不是彼此拆台用减法,甚至用互相杀戮用除法,即便是不温不 火的所谓和谐社会的加法也不行,因为6+5+4+3+2+1的彼此不合心协力的多元社会和大众一心各尽所能的理想乘积社会的差别是120/21=6倍的差 别,有意思的是这里差别的倍数恰好是社会中能力最大的那个(6),也就是说社会精英在社会变革中起到了决定性的作用,Big power comes with big responsibility。)在中国的从最不合理到最合理的120个阶段的缓慢改革中作为统治阶层需要一种策略要让底层的人民每次都能感到社会在进 步,底层的有能力的人有机会向上浮动,同时为了整个上层社会的整体利益每次要牺牲一个最末端的既得利益者,那么谁应该上浮,谁应该下沉,就成了三中全会的 核心,这个也就是STL算法的next_permutation的寻找的核心:
怎样是合理的社会?自然就是从左到右从上到下从大到小,能力越大贡献越大所得越大地位越高,因此,我们首先从底层劳苦大众也就是最右边看起,微服私访向基 层派出巡视组体察民情看到如果从最底层也就是最右边向左局部已经是能力越大地位越高的话(也就是降序排列)老百姓应该不会有怨言,没有必要再去改变,向上 打老虎找苍蝇找到第一个不称职的地方官员把他作为反腐败的样板来平息民怨,那么这个倒霉蛋比如薄熙来或者其他省部级官员等等肯定要被打到最底层去的,他们 都是这个不合理的上层官僚体系的最低级的官员把他们打下去对于其他官员来说震动最小,大家也都没有怨言,下面的百姓看到从高高权力金字塔跌落一个封疆大吏 也欣喜若狂以为共产党真的要改革,社会的紧张矛盾暂时缓解,维稳又撑过一天,一举多得。问题是底层谁应该上浮上来替代那个要被打下去的倒霉蛋?为了能把这 个游戏尽可能久的玩下去我们需要对于社会的动荡做到最小,每次的权力变革变得最小,于是我们从社会最底层向上找,找到第一个能力超过了要被替代的那个倒霉 蛋官员。这个地方就是改革的最关键的诀窍,通常人们激进的认为要一步到位既然发现了一个不称职的官员我们就要用我们目前下层最优秀的人才去替代他,这个想 法的确会加快社会向理想社会的转变,但是不符合共产党长期的目标,因为向符合普世价值理想的社会的转变就是割共产党的命,整个过程虽然从长远看不可避免, 但是能够多拖一天就是多享受一天特权与专治,因此,作为共产党最高统治阶级会选择从基层提拔一个能力刚刚好比要替换的贪官强一点点的人来接任。可是这种做 法无疑是让底层的民众和社会精英感到不公正,但是巧妙的是这个时候下层人民看到的眼前的不公正却是那个刚刚被提拔的人还不如其他底层精英的能力,于是社会 关注的焦点就巧妙的转移到了底层社会因为新上浮的人才和旧有的底层人才的矛盾上了,于是不可避免的人民大众对于底层原本能力与地位挂钩的合理的结构也产生 了怀疑反而要求重新洗牌导致当初为民众争取权益的公知反而成为民众不满的对象,在算法上这里体现的就是把底层上浮官员之后的部分完全反转 (reverse),作为最高统治阶级及其附属的既得利益集团此时则得到了暂时的缓解,同时由于底层社会精英的流失,暴民反转了正义导致社会制度又要从头 开始建立能力与地位相挂钩的体系,社会变革周而复始称之为渐进式变革。
因此明白了共产党的统治原则就明白了这个算法的核心,1.每次变革都是向前的最小的变化。2.每次从右边寻找已经形成了公民社会普世价值的阶层,然后针对 其做一个破坏,策略是找出本统治集团最弱智的一个杀鸡儆猴,通过挑拨底层精英的矛盾选择一个相对和上层官僚最接近的人选挑动下层社会价值颠覆。3.在将本 集团最底层的贪腐官员与下层刚刚够格的公知换位之后,让下层已经形成向上成长的体系完全反转。4.周而复始等待瑕疵社会矛盾不可调和时候再重复以上1, 2,3步骤求得苟延残喘。

十月三十一日 原本是要改造一个h264的解码器却走了这么大的一个圆圈

重读《generic programming and the STL》获益良多,以前都跳过的章节现在就理解的多了,比如iterator_traits的作用对于理解type inference是至关重要的,我以前对于bind1st不带类型模板参数是难以理解的,总觉得很突兀和平常的使用很不同,现在在看代码才理解内部的 binder1st是怎样的推测参数类型,因此编译器从bind1st的constructor的参数来推定内部的binder1st的类形参数,这个过 程是多摩的精微奥妙!
看了半天的libx264依然没有找到我需要的。

十一月二日 原本是要改造一个h264的解码器却走了这

看libx264有 一个所谓的visualize的选项一直想要尝试用一下,发现确实已经broken了,首先我浪费俄了不少的时间在一个非常白痴的问题上,官方git版本 最新的x264命令行参数形式和早期的10.04支持的旧版有很大区别,对于raw input的resolution参数不再是结尾输入640x480这个样子,而是统一的输入文件选项的样子,比如--input-res 640x480,我没有注意到这个问题看那manpage实际却运行git版本总是报错,看代码才意识到这个问题,真的很糟糕,在细枝末节上浪费时间。其 次,编译这个选项早就有被屏蔽的了,就是说你即便编译用了--enable-visualize的config实际上在x264.c运行的时候又被定义了 一个根本没有定义的VISUALIZE的macro把visualize的代码屏蔽了,我即便打开也遇到了cpu指令assert的错,比如:x264: ../../src/xcb_io.c:184: process_responses: Assertion `!(req && current_request && !(((long) (req->sequence) - (long) (current_request)) <= 0))' failed.这个东西我是一点的没有头绪,何况我仅仅是好奇这个据说没有什么用的功能而已,就放弃了。我真正的有原因是看代码找不到analyse的代 码,因为对于264的过程还是不清楚才不得想看看有没有帮助。

十一月三日 原本是要改造一个h264的解码器却走了这

很久很久以来我只依 赖hpeprint的email打印功能,直到刚才我才突然想着看看有没有ubuntu的驱动,hp 的支持还是不错的,居然有的。

十一月四日 原本是要改造一个h264的解码器却走了这

战争之所以爆发就在 于交战双方对于双方实力的估计有误,当然另一种情况是压倒性的战争,一方的实力远远超过对方,战争的结果是没有悬念的。中日之间的情况究竟是双方对于实力 的评估出现了重大失误吗?我比较倾向于解放军对自己的实力评估出现了重大的失误,因为日本自卫队长期以来遵循美军的训练方式和有丰富实战经验的美军联合训 练,再加上日美同盟军事情报搜集充分,所谓的知己知彼,所以,对双方实力评估应该是相当客观准确的。相反,解放军这些年来内部腐败已经远胜于当年的北洋水 师,共产党政府的腐朽甚至超过的清朝末年,内部人心涣散,军队长期没有把打仗放在日程上,再加上海空军的发展一直是欠债的,就算有了装备人员素质训练水平 也是跟不上的,那么从概率的角度看解放军一败涂地的可能是大得多的。但是中共是一个主观意志胜于客观实际的政党,不碰南墙誓不回头,那就看看第二次甲午海 战结果如何吧。
关于中国的房地产疯涨我以为最主要的是来自于银行,中国的银行限于自身的体制变成了一个不能抄房产却友很想参与的成员。如果是美国,银行资本如果觉得房地 产有利可图就自己成立子公司参与就是了,没有人会说什么,但是在中国因为落后的共产党体制变成了银行不能直接参与,结果变相的通过房贷来加速了房地产的预 期。任何地产泡沫破裂的前提就是银行的退出,但是在中国,银行属于国有永远不会退出,因此只涨不跌。
对topcoder上的大虾佩服的五体投地,我自叹弗如,可能这辈子也赶不上这些天才们现在的水平,这个大虾写的代码又漂亮又简洁,我看了非常的感动,为 了学习就把代码临摹了一遍,结果发现自己还是写错了一个地方变成了死循环,埃,真的是天外有天啊,保存留念。 期间我对于这个int visited[500][500];memset(visited, -1, sizeof(visited));有质疑因为sizeof返回的多少byte,那么你把每一个byte的位置值为-1怎么能够等同于每个integer 的-1呢?其实后来一想根据2's complement,-1原本就可以衔接,这个和0一样的碰巧,当然我宁愿相信大虾是早就明白其中的机关而不是随手一写。不管怎么说都是对的,我把人家 的代码改了其实不必要。受益良多。

十一月五日 原本是要改造一个h264的解码器却走了这

鉴于中日之间武力冲 突的不可避免,重读《孙子兵法》来预测战争的胜负,总的来说时间在中国一方,因为目前解放 军并没有准备好,这一点大家都知道问题是日本目前是要急于求战,中国领导人与军方能否成功避战?而就算解放军能够忍过一时,问题是根据孙子的原则解放军依 然有十不胜,日本自卫队依然有十胜,如何避免屈辱的第二次甲午海战的战败?

十一月十七日 开始在一个存储公司上班

俗务缠身,难以自 拔。一 个小小的实验,如何产生一个集合的所有子集呢? 这个是我从stackoverflow上看来的:最简单的是利用二进制数字的表达,因为计算机里整数的表达本身就是一个标准的集合的所有子集,不过他的限 制是数字的最大的bit数,目前我只能最多使用64bits。其次使用STL的bitset,这个破除了64bit的最大限制,但是因为是模板类,你必须 事先定义最大的bit数。最后是利用boost的dynamic_bitset这个可以动态分配最大的bit数。根据我的小小的实验这三者的速度也是依次 递减但是差别也就在10%左右是可以接受的,而且,对于集合大于20个元素的情况几乎都无实际使用价值,因为都很难返回了,所以,从这点来看第一个方法足 够用了,第二个方法代码比较干净,第三个仅仅有理论意义。
这个组的代码其实很小,偶然看到以前的老代码的一个错误,就是wcslen返回的长 度作为wcstombs的 输入参数,前者是character,后者是byte,当然对于操作系统使用英文的问题不大,但对于locale设定为中文日文很可能就是错误的了。
equivalent vector是 一个300分的topcoder的题目,我花了超过一天在想办法。我的想法是如果要证明一个sequence是符合week order的话,最好就是把它map到一个已经证明是符合weak order的sequence,比如自然数整数就是,那么如果两个sequence都已经map到了整数序列,那么他们的顺序如果类似就说明是 equivalent。否测我实在想不出怎么证明了。

十一月十八日 开始在一个存储公司上班

举国都言战而非厌 战,究竟为什么?只能是某个执政党认为民意可乘,可以用warmongering来转移国内日渐沸腾的阶级矛盾。

十一月二十日 开始在一个存储公司上班

昨天遇到一个小问 题,就是重载<<操作符的时候如果右边的变量不是const的无法通过编译,这个问题我不很理解根本的原因,只是费了不少时间才找到这个解决 办法。关于wcstombs 和mbstowcs 的c++网站的解说至少的有一点点的泛泛,比如说到data race其实对于gnu的实现是不存在的,我看过glibc2.12以后的代码,那个状态变量是一个local的临时变量不会造成thread-safe 的问题。

十一月二十三日 开始在一个存储公司上班

动态链接库是一个典 型的old new story。可是究竟你对此有多少的了解呢?以下是我的学习笔记:
1. 编译期和运行期是两个截然不同的问题。首先编译期相关的问题是作为动态库的需求方要链接什么文件在哪里找到的问题,这里牵涉到的是编译器的几个开关-L给 出的动态库的路径,-l给出的形式是动态库的文件名字,动态库的文件名形式是libdllname.so,那么你只需要给出dllname作为-l之后的 参数(没有空格?)。这个几乎所有写代码的人都知道,我曾经不用-l而只用动态库的完全路径名字作为链接参数如同obj文件一样来指示链接库,曾经自以为 这个更保险,岂不知动态库里面把这个绝对路径作为needed的一部分写到了可执行文件的needed里了。在这一方面仿佛有rpath的异曲同工之效。
2. rpath和LD_LIBRARY_PATH的异同与关系。首先,他们都是和loader相关的,在linux里ld是所谓的loader,它有一个既定 的搜索动态库的搜索路径,后者仅仅是一个环境变量把其定义的路径放到搜索路径的最前面,比系统的路径还优先。而前者是一个可执行程序的文件头的一个变量, 因此,loader就会按图索骥寻找需要的动态库。所以,rpath相当于省掉了用户主动设定LD__LIBRARY__PATH的麻烦。但是同时也失去 了部署的灵活性。
3.关于soname,这个以前一直是一个雾里看花的东西。它是动态库里的一个变量,使用readelf -d就可以看到,而经过链接编译之后的动态库的用户就会把soname记录在needed上,注意一个动态库的文件名和soname没有必然联系,比如 soname里面可以加上版本号:libmydll.so.1.2.3,那么当你的动态库的文件名都是一样的libmydll.so可是因为soname 不一样因此loader也不会搞错。不过如果soname和文件名不一样其实很麻烦,因为在client文件里记录的所谓的needed soname是作为文件名来搜索的,因此如果你部署的时候不使用这个名字loader就找不到的,除非你用软链接。
总结一下就是说loader是这样子搜索的,首先查看是否有rpath,如果有就直接去。其次看看needed的shared library的名字(这个就是动态库当初自己设定的内部的soname和动态库的文件名不一样,只有当动态库没有soname的时候才使用动态库的文件 名),按照这个内部存储的动态库的soname作为文件名来寻找。如果没有找到就看看环境变量LD_LIBRARY_PATH是否有定义,然后再没有找到 就按照系统设定的搜索顺序直到找不到就报错。
这里是一个例子, 提交的时候顺便用gpg签名,git tag -u myemailaddress tagname。

十一月二十四日 开始在一个存储公司上班

我也认为美国对于伊 朗的让步也许会证明是另一个朝鲜的诞生,奥巴马将被证明是美国历史上最无能最白痴的总统,作为流氓国家来说它就是伊斯兰世界安插在白宫的内应。

十一月二十七日 开始在一个存储公司上班

我的晨练就是200 分的题目,500 分的大多数完不成,或者对于题目理解不清楚。

十一月二十八日 开始在一个存储公司上班

一个人有多么无聊看 看微 信的聊天记录就知道了。

十一月二十九日 开始在一个存储公司上班

每 天锻炼

十一月三十日 开始在一个存储公司上班

这 个1000分的题目相对比较容易, 因为这个不是比赛题目,我感觉良好,大概一个多小时没有什么错也没有去debug,当然我走的是正大光明的路子,直来直去一点也没有投机取巧,因为也不 会,看看其他高手的代码就是想明白我为什么才得到三百多分,差距在哪里,看了以后良久无语,差距不是一点两点,人家是真的高,实在是高,我大概再努力几年 也许方能望其项背,首先对于这个迷宫的类型要有深刻的认识,其实路径是不必要的,我的结构中给每个选择的路径都记录是有多余的,这些路径是所谓的 category就是说一类路都是一样的,比如含有相同trap door组合的路径是一样的,而且题目只是求生存概率没有必要存储具体路径,只需要各种组合trapdoor的概率就可以了,这个就是我的不足之处,其 次,我为了避免递归使用queue应该说是我的优点,只不过为了实现这个循环替代递归我使用了大量的STL的container,还另外定义了很多的方法 来配合似乎是有些累赘,而此位大虾纯粹使用matrix来配合递归的所有可能的路径简洁高效,当然阅读上肯定比较困难,不过相比较而言,我的方法太平常也 偏笨拙。每天都锻炼,每天都进步。

十二月一日 开始在一个存储公司上班

再次观看 《Kindom of Heaven》让人由衷的感到这部经典制作的艺术震撼力。google之后才明白这绝非偶然,导演是Ridely Scott他拥有众多的成名制作,其他导演但凡拥有其中的任何一部就足够在好莱坞扬名立万,可是他拥有这么多《Blade Runner》《Alien》《Gladiator》《Black Hark Down》etc.,而片中的男女主角也绝非泛泛之辈,Orlando Bloom我觉得远比他的加勒比海盗系列好得多,而那个令人惊艳无比的女主角原来是法国的模特,难怪如此妖艳,相比之下那个在美国自割乳房的女人远源比不 上,真不知道为什么美国人会认为那个长痣的女人有什么好看的,其实艳星大都来自法国啊。这里有关 于十字军的战术帖子,非常的精辟。

十二月一日 开始在一个存储公司上班

来 来来,挑战一下250分的竞赛题吧,我差一点连算法都想不出来,可是最后还是fail在大的内存消耗上了。

十二月三日 开始在一个存储公司上班

早上在挣扎,因为我 的那个小程序始终有内存分配的错误,实在不明白。花了一天时间在用eclipse来debug,感觉实在是太强大了,问题其实也是很有意思。 Anthony把原先的使用python调用cli的部分改为c,结果就是出现了使用popen来调用shell的stderror没有从pipe返回, 只有stdout的部分,多么的有意思啊。使用2>&1作为额外的参数强制stderr赚到stdout,这样子就能把所有的输出都从 pipe得到了,这个我以前遇到过。另一个问题实际上很复杂,就是pclose的返回值到底代表什么呢?是wait的exit的status可是代表什么 呢?我不知道。我下载了gnu 的stdlib看到pclose.c的代码返回值好像是文件的标志啊???晚上看我最喜欢的其中一部电影《Notting Hill》,在第二罐Asahi生啤的麻醉下,我可以给自己的今天画上句号。

十二月五日 圣何塞的冬天真冷啊,几乎就是零度了,那些无脑的环保主义者们还相信气候变暖吗?

昨天想明白了两件事 情:1. 250分的题目都是小case,如果你不能在50行代码解决那绝对是你的问题,通常topcoder上的那些高手不超过10行代码。总之,我想偏了,虽然 是TSP的问题,但是算 法不代表复杂。 不过我还是没有发现我的代码的内存的问题,很可能是简单的问题,但是。。。2.pclose返回的究竟是什么?本来很简单的,为什么需要那么 concern?如果没有意外或者错误,返回值就是child process的return "exit status"。难道读不懂英文吗?在wait.h的某个地方有几个宏可以帮助你判断:是否stop,是否terminate,是否signal了,最后 是否正常exit了,还有一系列对应的宏判断相应的值。昨天尝试编译glibc2.12总是遇到一个汇编器的错误,完全无头绪,而且不是只是2.12,其 他版本也有,除了2.17,但是2.17运行期有问题,毕竟rhel6.3

十二月六日 圣何塞的冬天真冷啊,几乎就是零度了,那些无脑的环保主义者们还相信气候变暖吗?

昨天Anthony和那个tech writer在outlook里骂架,毕竟是英语母语的优势完全可以骂人不带脏字的,当然我不反对只是羡慕,因为那个tech writer的英语语法都不过关天知道是怎么混进来的,一个英语作为第二语言的人可以说话带口音,可以听力差,但是不应该写简单的email英语居然有那 么多的基本的时态拼写语法错误,因为她又不是程序员是technical writer。后来被一个简单的问题所困扰了好久,在eclips里面传命令行参数,我要传空字串就使用双引号的形式“”,结果全被转换成了多字节形式" \"\"",长度为2.我百思不得其解以为是什么系统locale或者类似windows下使用wmain之类的原因,后来才发现原来是eclipse的 问题,它就需要单引号的空字串,真的是好笑也好气。
一个很简单的问题,作为我 早晨的热身运动,就是我的新买的三星note8开机锁是一个九宫格,那么总共有多少种开法呢?问题是很普通的,不过就是好奇而已。其实想来有另一 个代替递归搜索的做法,就是把0到8的全部的组合来进行剔除就可以了,剔除的规则我都已经写了,所以这个是更好的做法。(STL里没 有所有子集的产生方法,只有自己写。但是如果仅仅要求开法的数目确实一个捷径。)

十二月十二日 圣何塞的冬天真冷啊,几乎就是零度了,那些无脑的环保主义者们还相信气候变暖吗?

时光如电,日月如梭,头脑空空如也。前两天在实验gsoap,结果贪看星际争霸的视频,埃。反复看很多我喜欢的电影《The Last Samurai》每次都让人那么伤感震撼,《The Kindom of Heaven》荡气回肠,《The Art School Confidential》看了那么多遍才领悟到伟大的艺术家都明白怎样寻找他的目标,The Ideal Subject究竟是什么。

十二月十五日 圣何塞的冬天真冷啊,几乎就是零度了,那些无脑的环保主义者们还相信气候变暖吗?

前两天的一个奇怪的事情忘记了,就是我现在的做法是从笔记本的win7上putty用ssh加上forward X的方式链接到RHEL6.3上直接运行eclipse,在笔记本上运行Xming结果可以直接在远程编辑调试代码,那么有一天突然启动eclipse总 是crash,我始终都以为是linux本地的问题,包括Java运行环境,或是gtk的版本,把eclipse的多个版本都重装也没有结果,后来被迫重 启windows才ok,这里面就是我一个误区,其实Xserver应该是运行在我的windows上的xming,而所谓的无法打开display的 gtk的错误应该是和我的笔记本这边有管而不是redhat本地,这个是xserver的迷惑人的地方,显示方是server方,所以要打开是在 server方吧。
我对于我的dvd机可以播放链接在router的Usb口的硬盘上的多媒体资料一直不明白以为是什么新技术,知道今天google才知道是dlna的服 务,于是我下载了minidlna就 把我的硬盘的电影在我的电视上播放了,不过关于影片格式我还需要研究一下。
minidlna的更新我想不出怎样不重启更新文件目录,索性就在目录里面创建symboliclink,因为都是我的usb硬盘的文件,mount在哪 里每次都不一样的。
上班还是厅忙挺累的,折腾gsoap的编译其实就很妖娆,有很多选项,我使用了-qQ之类开关结果遇到编译的问题,看了好久才搞明白,你使用 namespace那么产生的soapclient.cpp里的soap方法就都适用了namespace,可是那个stdsoap2.cpp确实需要这 些自动产生的函数的,可是你家了Namespace之后它就找不到了,这个难道不是一个问题吗?这个让我想起了在cisco的时候注意到他们就只是使用纯 c的开关绕开namespace,在paypal他们好像是有解决办法的,当然不可能自己手动加代码的,应该是什么编译开关增加了namespace吧? Anshul这个家伙linux用的很熟,它使用DDD来debug我还是第一次看到。

十二月十九日 圣何塞的冬天真冷啊,几乎就是零度了,那些无脑的环保主义者们还相信气候变暖吗?

其实世界上的事情很多都是一层窗户纸,捅破了就看清楚了,比如我的gsoap的客户端的ssl链接错误很可能的原因是我链接的时候忘记使用 libgsoapssl.a而是仍旧使用libgsoap.a这样子编译看不出来只有运行期的错误。而所谓的client端是不需要考虑证书的问题的,这 个我以前就被同学教诲过,只是再次模糊,那么在gsoap的setup的context的函数里不需要各种证书和key的文件,选择一个参数说 ssl_noauthentication的就可以了。而至于登录用户名密码是http的header的属性,曾经搜到一个帖子说gsoap如果不使用 http(s)的url前缀的话有可能不发送http的header。当然这个是我在纯C的编译下,使用c++还是比较罗嗦的因为很多的 namespace的问题。

Smiley face