Wednesday, July 08, 2009

三看三核对 读懂社保对账单

看不懂,怎么对?对什么?在社会保险个人缴费信息对账单(以下简称对账单)陆续寄到个人手中后,很多参保职工发出了这样的疑问。为此记者昨天采访了市人保局社会保险基金管理中心相关负责人,详细解读对账单。

  据了解,第一批社保对账单目前已经发放完毕。至今仍未收到的参保单位及参保人,如果是由于其曾变更过地址未及时到社保代(办)机构办理核对和更正地址信息的,需在本月20日前办理手续,以便二次邮寄。

  一看缴费基数

  核对上年度月均工资

  参保职工拿到对账单首先要看缴费基数是否正确,这是计算职工每月应缴纳社会保险费的依据。缴费基数,即参保人本人上一年度(自然年度)月平均工资。

  在对账单中,同一年度内,前三个月和后九个月的缴费基数不同。这是因为社保缴费年度为每年的4月至次年的3月,而对账单核对的是上一自然年度,即1至12月。在2008年度的对账单中,1至3月的缴费基数是按2006年度职工本人月平均工资为基数计算的,而4至12月是以2007年度的职工本人月平均工资为基数计算的。

  提示:上述所说的工资是指职工每月的工资总收入,包括基本工资、奖金、绩效工资、加班费等。

  二看个人账户

  核对养老保险

  该对账单核对的重点是养老保险。按照规定,城镇职工以本人上一年度月平均工资为缴费工资基数,按照8%的比例缴纳基本养老保险费,全额计入个人账户。

  对账单上,养老保险个人账户由“个人缴纳”(由单位每月从工资里扣)和“单位划转”两部分组成。参保职工会注意到,“单位划转”栏中全部为“0”。这是因为从2006年起,单位给职工缴纳的保险费不再划转到个人账户,个人账户里全部是个人缴纳的保险费。

  提示:养老保险个人账户里的钱不能归个人支配,必须等参保职工退休后才能领取。通常,职工办理退休手续后,社保中心会为其核定养老金数额,退休职工每月所领取的养老金中的一部分就是个人账户里的钱。

  三看“三险”记录

  核对是否缴纳到位

  参保职工还要核对失业、工伤、生育三项保险的缴费记录,凡标记为“√”即表明相应保费已实际缴纳到位。“三险”之所以没有具体数额,是因为其没有个人账户,但失业保险计算缴费年限,工伤、生育保险只要单位按时缴纳了保险,职工就能享受相关待遇,待遇标准是按照相关政策核定的,所以对账单上没有显示具体缴费数额。

  提示:此次对账单未列入医保信息,这是由于医保个人账户储存额已经按月直接划入到医保存折上,参保人可随时去银行查询。本报记者 袁京 RB156

Saturday, July 04, 2009

reinstall grub

when grub is broken, you can not log any host system(or just windows). here are the ways to boot linux system and reinstall grub:

1. by system rescue rom disc:
insert disc to ROM and boot from that, then chroot to host system, then type grub-install /dev/sda command..
2. by windows
log into windows if you can and setup a windows version grub, then reboot to log into linux, then type grub-install /dev/sda command..
3. by a usb stick or usb hard disk..
insert the usb device into  another linux computer.
type the command:
grup-install /dev/sda --root-directory=/media/disk
here /dev/sda means the usb device
--root-directory= specify the mount point of the usb device's partition.
then remove the usb device and insert it to the computer who's grub need reinstall. the boot from the usb device. start host's linux with grub command manually. the type the command to reinstall grub:
grup-install /dev/sda


企业年金

个人账户一般下设两个子账户:企业子账户和职工子账户,分别记录企业缴费和职工缴费的金额,以及各自投资的收益。个人账户余额由两个子账户余额相加而
成。个人账户中职工子账户中的资产属于职工个人,无论何种原因退出计划,职工子账户归属的权益为100%。但是企业子账户的归属权益视计划规则及退出计划
原因(类别)确定:一般退休、死亡归属权益为100%;离职和转移按归属标准(比例或绝对额)支取。

  职工的归属权益=职工子账户余额+企业子账户余额×归属比例

房价

最近北京新地王的产生加大了人们对未来通胀的预期. 推动了新一轮的股市上涨行情. 对房价的争论历来热闹. 我也来说几句.

房产的投机成分更多. 换句话说就是泡沫很多. 当然不是说泡沫都会被挤掉,  因为接盘者都是连泡沫一块接盘的. 那么也就只有泡沫多少的问题.

不 过房产的特殊性在于其还是基本生活用品,会受政府干预比较多. 所以成熟市场中,应该是由政府提供的保障性住房更多的承担基本生活品的角色. 而商品房更多的承担投机的角色. 当前者供给适当的话, 老百姓不会太在意商品房价的起起落落. 就是现在的股市涨跌. 但是现在不是,商品房之所以受到如此关注, 只是因为太多的人无望于保障性住房以及住的是商品房.

所以根本原因是保障性住房太少,让太多的人暴露在属于投资领域的商品房市场中. 要知道这其中有很多人并没有投资经验,或者并不想成为投资者, 只想有个条件还可以的住的地方. 而把他们与专业投资者或者投机者放在同一个市场环境中,这是十分危险的.


具体来谈房价. 上面也说了,你如果是在等待保障性住房,可能不用过多关心房价,更多的应关心保障性住房政策. 如果你估计跟保障性住房无缘(没有户口等),则要仔细关注商品房市场了.

都说房价高,但却不见房价降. 连年初时经济危机的底部的时候也没见降多少. 虽然让我们失望, 但我们仍要积极面对,时刻等待机会的来临.
房价没怎么降,说明是有需求支撑的. 这个需求主要来源于自住需求. 因为危机发生时对投机的抑制的立竿见影的. 这个需求来源于初次买房的人,小房换大房的人. 像这种需求受危机影响是很小的. 

当然原来还有多方面, 危机对中国中高入人群的影响不大.表现在这部分人没有被裁,收入没有明显影响, 所以断供的现象没有大范围发生.

而美国就不一样, 房屋市场很成熟. 房屋以独立屋为主. 本身房屋保有量和交易量也很大. 危机对美国影响最深. 所以需求容易受到抑制. 房价降了1/4左右.

基于以上原因,如果国家住房保障制度的不变以及规模不调整, 中国房价仍会继续上扬. 但在居民收入增长幅度很少的情况下. 租金上涨幅度有限, 房价继续上涨对需求的抑制明显,故房价的增长幅度不会不太. 预期年增长幅度在10%-20%之间.

 


Thursday, July 02, 2009

some mplayer's tip

1. play short clip
when playing short video clip which has only one or some frames, picture flashed from screen   and can not be seen clearly. 
so add '-loop 0 ' option. such as playing one frame yuv file
 mplayer kiss.yuv  -demuxer   rawvideo  -rawvideo  w=768:h=576:format=uyvy:fps=15  -loop 0

2. play yuv raw video file
yuv file has no file header to discribe the video parameter. so you must supply the inforation to mplayer. such as width,height,yuv format, frame rate etc.
mplayer support some yuv file format:
420:  yv12 i420
422: yuv2 uyvy
example:
 mplayer kiss.yuv  -demuxer   rawvideo  -rawvideo  w=768:h=576:format=uyvy:fps=15  -loop 0


Wednesday, July 01, 2009

通胀

世界银行发展预测局国际金融主管曼索尔·戴拉米在北京指出,由于全球仍存在大量的产能过剩,强烈的通货膨胀势头在两年或三年内不会变为现实。

对此我的看法是:
虽然有产能过剩,但由于经济的衰退期比较长,企业倒闭,产能减少. 所以产能会有一定过剩,但是过剩很多的产能会直接淘汰掉.

另外一次危机的暴发,会意味着世界范围内的一次产业重组. 对于中国更是一件好事, 更多的产能会转移到中国来.

故考虑到产能的淘汰和转移,所以我认为通胀仍有可能在一年后普通发生.



解读央行正回购利率上升

http://finance.jrj.com.cn/2009/07/0104125385269-1.shtml
http://finance.jrj.com.cn/2009/07/0303165406702.shtml

 本周,公开市场利率体系打破了保持长达半年之久的平静。无论是正回购,还是央行票据,其收益率水平圴告全线上扬,整体利率体系向上攀升了4至5个基点。

  在本周二的公开市场上,28天和91天正回购收益率突然上升至0.95%和1%,各较前上升了4和5个基点。在周四公开市场上,三个月央行票据收益率则又达到1.0053%(折算为91天),较前上升了4个基点。

作为当前市场最受关注的公开市场操作工具,三个月央票及28天正回购利率已经成为核心利率。历史经验表明,核心利率对货币市场利率具有趋势性的引导作用,其价格变动会波及短端资产的定价如短期融资券、中期票据甚至商业票据的利率。在通常情况下,核心利率会保持稳定,一旦出现变动,往往预示着新趋势的开始。因此本周公开市场操作工具利率变动幅度虽然不大,但还是需要引起关注。

业内人士认为,目前我国的货币政策基调仍然是适度宽松,因此这种变化很可能是微调,还不能说明央行就急着改变宽松货币政策的方向。


Tuesday, June 30, 2009

个人关心过的股票研究

重点注意以下几个方面.
        1. 行业与企业熟悉程度:
        2. 与经济周期关联度:  
        3. 与经济周期关联形式的了解程度.
        4. 行业周期了解程度: 
        5. 市盈率:         


中国远洋:
           受世界经济还没复苏的影响,这个板块估值仍然比较低. 重点关注.

兴业银行
           最近一段时间表现很好. 一个月涨了25%.但原因还没分析出来. 继续持有.

三金药业:
        1. 行业与企业熟悉程度: 0
        2. 与经济周期关联度:   小
        3. 与经济周期关联形式的了解程度. 不了解.
        4. 行业周期了解程度: 不了解
        5. 市盈率:          合理
        因此可以作为观望品种.但坚决抛出.




居然打到新股了

以前参与过几次,但都没有中签. 没想到这次竟然成功了. 而且是100%. 不过也就投了一个单位. 穷人啊.

但对于三金药业的持有看法:
1. 行业与企业熟悉程度: 0
2. 与经济周期关联度:   小

因此可以作业观望品种.但坚决抛出.




Monday, June 29, 2009

投资: 把握大势最重要

http://stock.jrj.com.cn/2009/06/2917345369696-1.shtml

在40年的时间里,曹仁超从5000港元起家,经过40年赚到了上亿元财富。对于投资他给出的第一条建议就是一定要把握大的趋势。“如果是在去年的 A股市场上,即使你的投资技术很高明,可能也是会不断亏钱,因此投资者首先要认清大的形势,然后灵活运用投资策略,严格遵守操作纪律,只有这样才能够战胜市场。”

  那么,究竟该如何把握大势呢?曹仁超认为需要眼、耳、口、鼻并用,平时多看、多听、和有分析能力的人多讨论、用鼻子去嗅。“有些人真的有‘市场鼻’,可以闻到大势快上升或快回落的气息,这是长时间的经验积累出来的。”他同时提出,股民对各种各样的投资方法一定要灵活运用。“即使是我的方法,也是在香港市场摸索出来的,对A股市场不一定完全适合。”投资者一定要选择出适合自己的投资方法,坚持下去一定会成功。

  对话曹仁超: 追涨杀跌的“小富”

  第

  记者(下称记):从5000元起家,一直到成为拥有2亿身家的富豪,你的经历很传奇,怎么做到的呢?

  曹仁超(下称曹):我没有2亿那么多,这是媒体说的,实际大概是1亿多一些,只能算小富的水平,在香港拥有上百亿资产的才可以叫富豪,因此我只是一个“小富”。我的经历也不能算传奇,只要一个正常人从20岁开始,每年投入5000元,按照25%的年收益,每个人都可以拥有上亿元。

  记:每年25%的收益率很高了,你是如何做到的呢?

  曹:很多报纸、电视上都说不要追涨杀跌,但我认为一定要追涨杀跌。就拿A股来说,从去年1664点开始反弹,到了2000点的时候就应该买入了,这时如果你不舍得追高,那么就涨到了2200点,股市越涨越高你不追只能看着它上涨。同样的道理,2007年,股市从6100多点掉到了5800点,投资者就应该果断止损,不然就只能一步步看着自己的损失扩大,直至到最后亏损累累。

  记:那么投资者该如何追涨杀跌呢?

  曹:改革要摸着石头过河,投资也要一步步来,投资者在反弹达到20%也就是2000点的时候就应该建立一部分仓位,如果判断错误,那么投资者在股指掉下来20%后即1600点就止损,这样亏损的就只有很少的一部分;如果判断准确了,那么再上涨10%也就是2200点应该再买入一部分;同时止损位也将提高到1800点,股指只要不跌破1800点就一直持有;如果再上涨到2400点就可以再次买入,同时再次提高止损位,这样做的话投资者盈利的可能性基本就可以保证了。

  记:除了追涨杀跌还有其他秘诀吗?

  曹:投资要做到三个字:“忍、狠、准”。所谓“忍”就是在市场形势不好的时候,一定要忍住不要入场,就好比去年的熊市,股指不断下跌,股票价格也是屡创新低,如果投资者没有忍住去抄底,可能就会吃大亏。(记者去年就是抄底两次亏了血本。)所谓“狠”就是在抓住一只牛股的时候,不要轻易将它卖出去。今年的这轮1000多点的涨幅,很多人输给指数,就是过早地卖出了股票。抓住了大牛股就要狠狠地吃一口,不到20%的止损位就坚持不放手,好的股票涨了两倍会有4倍、8倍甚至10倍,一旦拿到了就一定要拿住。所谓“准”就是对大势的把握要准确,对个股的涨跌要清楚,这是需要长期的市场经验来判断的。

  记:这么多年的投资失败过吗?有什么经验教训?

  曹:连巴菲特去年都做错了,我们怎么可能不犯错?我从1969年开始投资,经过两年的努力在1971年赚到了22万元。当时中国加入联合国的消息传来,我觉得是一个重大利好,于是就借了48万元去投入股市,结果市场起初认为是利空,结果连续大跌3个月,我的70万元也就剩下50万元左右,无奈之下我只好清仓了,除掉手续费还掉借款我只剩下8000元,可以说又回到了从前。后来市场又重新上涨了,可是我却没钱投资了。这次失败给我的教训就是:“永远不要借钱来炒股”。

  记:这肯定是你最痛苦的一段失败经历了吧?

  曹:要说我记忆最深的,还要说是1974年的那次经历。当时经过几年的努力我已经有了50万元。“和记”股票从43元跌到了7元钱,我觉得这么便宜就买了1万股,后来又跌到6元,我又买了1万股,结果又跌到了5元、4元直到最后的1元,我又不断地买入直到买进了10万股。当时有消息说这家公司要破产了,我急坏了,晚上10点多一个人跑到海边思考该怎么办,当时很多人都传我去自杀了,其实我真的是去思考。当我早上6点多回到家里时,老婆哭得一塌糊涂。后来我连工作也失去了。这次抄底让我永生难忘,也让我明白,炒股票有风险,千万不要去抄底。失败的投资比不投资更可怕。

  记:那么你又是如何从失败中走出来的呢?

  曹:1975年,我到信报工作,同时也开始正式的学习股票知识,在5年的时间里我认真地读了超过100本的有关书籍,同时也努力工作赚钱,在 1983年我又拥有了60万元资金,同时也形成了自己的一套投资理论和方法,从那以后就开始赚钱了,1990年到了1000万元,之后以5年翻一倍的速度递增,到2007年就超过1亿元了,这时身体也发福了,老婆劝我要以健康为重,我就减少了投资,现在只有40%的资金在做,而且也是把它视作一个游戏。在不同的人生阶段,投资者要按照一定的投资比重去投资,这个比重就是100岁减去年龄。只有这样才会拥有一个良好的心态。

宏观调控主要措施

1990.12.19上海证券交易所成立 100点
1991.7.3  深交所营业
1992.05,18 全面放开股份,实行自同竞价交易. 由600点涨到1266点.
1993.05.15 央行调高存贷款利率(存 +2.18 贷 +0.82)
1993.07.12 央行调高存贷款利率
1994.02.22 深交所暂停新股上市
1994.08.01 政府救市:暂停新股发行 发展基金,吸引外国基金. 由333点跳空高开1个月后的1000点之上
1995.06.15 下达1995年新股发行规模 55亿元.
1996.05.01 央行降息 (存 -0.98 贷 -0.75)
1996.08.23 央行降息 (存 -1.50 贷 -1.20)
1997.05.12 上调印花税0.3%至0.5%
1997.05.16 下达1997年新股发行规模 300亿元
1997.10.23 央行降息 (存 -1.10 贷 -1.50)
1998.03.20 央行降息
1998.06.12 下调印花税0.5%至0.4%
1998.07.01 央行降息 (存 -0.49 贷 -1.12)
1998.12.04 央行降息 (存 -0.5 贷 -0.5)
1999.06.01 央行降息 (存 -1 贷 -0.75)
2001.09.04 首支开放式基金发行
2001.11.16 下调印花税0.4%至0.2%
2002.02.21 央行降息 (存 -0.25 贷 -0.5)
2003-05-27 首支OFII诞生
2003-09-21 央行提高存款准备金(6%->7%)
2004-10-29 央行升息 (存 +0.27 贷 +0.27)
2005-01-25 下调印花税0.2%至0.1%
2006-04-06 央行升息 ( 贷 +0.27)
2006-08-21 央行升息 ( 存 +0.27 贷 +0.27)
2007-03-18 央行升息 ( 存 +0.27 贷 +0.27)
2007-04-06 央行提高存款准备金(10%->10.5%)
2009-06-19 IPO重启

Sunday, June 28, 2009

牛市特征分析

道氏理论认为,多头市场是指长期向上的走势,其间不会一路向上,而是会夹杂着若干重要的回调,牛市也可以分为三个主要阶段:第一阶段,人们开始对未来的经济形势恢复信心,虽然坏消息不断,但股价已经拒绝下跌并开始有了不小升幅,此时市场以谨慎乐观为主;第二阶段,市场上开始不断爆出经济基本面和企业盈利状况提升的消息,投资者们开始积极买入,乐观情绪开始蔓延;第三阶段,从来不看电视财经频道的人也开始关心起股票,此时支撑购买股票的唯一理由是对未来的憧憬之情,至于公司能否赚钱,已经不是主要的考虑因素。这是牛市的末期。

这个理论十分适合上一轮牛市. 毕竟我经历了牛市的第三阶段.
但如何指导投资行为呢,还有不少不确定性.
每个阶段的涨幅或是持续时间是多少. 特别是第三个阶段结束点的把握. 如果退的早,可能收益不能让你满意. 退出来,看还在涨, 又会入市,最后造成没有及时退出. 像上一轮牛市拐点是次贷危机,如果没有危机,则指不定能涨到八千点. 如查这样的话,相信在六千点退的人又会入场.

所以进入第三个阶段后,要变得谨慎些. 随时做好及时出逃的准备. 虽然不一定能做到在最高点抛,但至少能及时查觉到变盘.

http://finance.jrj.com.cn/opinion/2009/06/2815055359697.shtml
文章中说:
=============================================
严格地说,如今的3000点并不是牛熊分界线,1660点才是牛熊分界线。当市场刚刚走出熊市,多数人还是悲观的,因为实体经济比股市探底的时间要 晚3~6个月,此时绝不会听到很多利好信息,但在此时买入股票的人基本上都具备过人的眼光。设想一个很简单的场景,大牛市的时候市场上有这么多股票,大熊 市的时候还是有这么多股票,但很明显持有股票的人换了。为什么这些人敢于在一片利空的形势下买入?

  一旦大盘跨越3000点,那就意味着距离上一轮底部有了近乎一倍的涨幅。此时凡是手里有股票的人,都有了不错的收益;而踏空的人则懊恼不已;还 没开始炒股的人,将开始听到亲朋好友中炒股发财的故事,财富效应将要开始起作用。理性的投资者应该尽快占据有利的位置,而不是等到利好频频的时候才姗姗而 来。

===============================================

这个我支持.
原因:
1. 世界范围的银行宽松的货币政策造成市场流动性很足.
2. 虽然刚经历过一次危机,但实际上资源的供给并不存在产能过剩的情况.煤的产量还是在增长. 石油的产量还是持平. 故只是价格变化比较大.  故随着危机结束,消费增长和通胀的预期以及美元的贬值, 故资源的价格会持续上升, 最终会带到商品市场的价格上升. 即使商品的产能还有过剩. 但无法吸收资源的价格上涨. 最终造成普遍的一轮通胀.

迎接通胀, 先可以买入哪些股票呢?


京东方

京东方
      2009年6月9日,公司以非公开发行方式成功发行A股50亿股,发行价为2.4元/股,共募集资金120亿元,所募集的资金将用于京东方合肥第六代TFT-LCD生产线建设和补充公司流动资金。
      其中紫金矿业出身的柯希平购买了16.8亿.



房地产关注

2006年7月执行的 131号文

    http://www.0570fc.com/homenews/shownews.asp?newsid=2981.
    南方周末 为外商投资房地产松绑

    这个政策的出台背景是: 当时一季度中国的GDP首次超过10%,达到10年新高.经济总体过热非常明显.国内的房地产市场已经疯狂,然而宏观调控效果却并不明显. 但是从现在来看,这个政策的作用并不是十分大.资金雄厚的资金仍然可以曲线投资房地产.


Saturday, June 27, 2009

blog API url

https://www.blogger.com/feeds/26218787/posts/default

Sunday, June 21, 2009

amacrican video service provider

netflix
    http://www.netflix.com/.
    Netflix, Inc. is the world's largest online movie rental service, with more than 10 million subscribers. For one low monthly price, Netflix subscribers can get DVDs delivered to their homes and can instantly watch movies and TV episodes streamed to their TVs and computers, all in unlimited amounts. Subscribers can choose from over 100,000  DVD titles and a growing library of more than 12,000 choices that can be watched instantly. There are never any due dates or late fees. DVDs are delivered free to subscribers by first class mail, with a postage-paid return envelope, from 58 distribution centers. More than 97 percent of Netflix subscribers live in areas that generally receive shipments in one business day. Netflix has partnered with leading consumer electronics companies to offer a range of devices that can instantly stream movies and TV episodes to members' TVs from Netflix. For more information,
netflix:

Netflix Announces Q1 2009 Financial Results
Subscribers - 10.3 million
Revenue - $394.1 million
GAAP Net Income - $22.4 million.

Comment:
         only 10% video film can be watched instantly from web. Mostly of them is old. The video content is protected by Windows Media DRM.




Friday, June 19, 2009

regular expression example

rpm -qa |   sed -n '/^stlinux22-/s/-[^-]*-[^-]*$//p'
substitue lines like
stlinux22-host-python-elementtree-1.2.6-1.i386
stlinux22-sh4-uclibc-busybox-links-1.2.1-5.sh4
to
stlinux22-host-python-elementtree
stlinux22-sh4-uclibc-busybox-links

/REGEXP/
     This will select any line which matches the regular expression  REGEXP.
s/REGEXP/REPLACEMENT/FLAGS
    replace REGEXP matched string to REPLACEMENT
p
  If the substitution was made, then print the new pattern space. otherwise no output on stdio.

Thursday, June 18, 2009

openssh for windows

在windows上安装openssh for windows:

D:\Program Files>cd Open*

D:\Program Files\OpenSSH>cd bin

D:\Program Files\OpenSSH\bin>mkgroup -l >>..\etc\group

D:\Program Files\OpenSSH\bin>mkgroup -d >>..\etc\group
Cannot get PDC, code = 2453

D:\Program Files\OpenSSH\bin>mkpasswd -l >> ..\etc\passwd

D:\Program Files\OpenSSH\bin>mkpasswd -d >> ..\etc\passwd
mkpasswd: [2453] 找不到此域的域控制器。

D:\Program Files\OpenSSH\bin>net start opensshd
OpenSSH Server 服务正在启动 .
OpenSSH Server 服务已经启动成功。

上面的错误无关紧要,不影响正常使用.

到另一台机器上用ssh测试一下(其中$IP为服务器ip):
ssh administrator@$IP

Sunday, June 14, 2009

语录

文艺丧失了批判的功能你就是搞娱乐的. 你跟小姐没什么区别, 给人乐一下,人家付你钱而已.                           ---崔健

Saturday, June 13, 2009

firefox穿墙

以前总是使用在线代理来访问墙外的网站. 不过在线代理支持的协议比较少,只适应于基本浏览. 随着blogger的被封,我只好用更高级的代理方法.

网上google后,决定选用GAppProxy+autoproxy的方式.
GAppProxy为代理客户端 http://code.google.com/p/gappproxy/
autoproxy 为firefox下的代理配置插件. http://code.google.com/p/autoproxy/

配置和使用都很简单. 祝好运...

Monday, May 25, 2009

I/O stream buffer

最近作项目时觉得写大数据量写入时性能不行.  于是研究了 I/O stream buffer.

iso c中规定了standard io stream interface.  这部分实现在 glibc 中,于是研究了一下.
stream buffer 的分配不在fopen里.  是在第一次对文件写的时候. 大小为fstat得到的st_blksize(见_IO_file_doallocate).

fwrite逻辑为:  先往stream buffer 填, 如果填满了以后还有数据要写,则先flush一下, 然后判断剩余数据大小,   如果大于buffer 大小,  则以buffer 大小为倍数,  把整倍数的数据直接使用write写入.   最后剩下的数据才写入到 buffer  里( 见_IO_new_file_xsputn).

故如果以64k为单位写入ext3文件系统(st_blksize=4k), 则每次写入都对应两次write操作.  一次为4k , 一次为 60k.

android平台初步分析

内核打印:

Uncompressing Linux.......................................................................................... done, booting the kernel.
Linux version 2.6.29-00135-ga4ae495 (dybbuk@localhost.localdomain) (gcc version 4.3.1 (GCC) ) #1 Mon May 18 22:01:19 CST 2009
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00093177
CPU: VIVT data cache, VIVT instruction cache
Machine: Goldfish
Memory policy: ECC disabled, Data cache writeback
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 24384
Kernel command line: qemu=1 console=ttyS0 androidboot.console=ttyS1 android.checkjni=1 android.qemud=ttyS2 android.ndns=1
Unknown boot option `androidboot.console=ttyS1': ignoring
Unknown boot option `android.checkjni=1': ignoring
Unknown boot option `android.qemud=ttyS2': ignoring
Unknown boot option `android.ndns=1': ignoring
PID hash table entries: 512 (order: 9, 2048 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 96MB = 96MB total
Memory: 93880KB available (2528K code, 671K data, 108K init)
Calibrating delay loop... 183.91 BogoMIPS (lpj=919552)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 520 bytes
NET: Registered protocol family 16
bio: create slab <bio-0> at 0
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 3, 32768 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
NET: Registered protocol family 1
checking if image is initramfs... it is
Freeing initrd memory: 140K
goldfish_new_pdev goldfish_interrupt_controller at ff000000 irq -1
goldfish_new_pdev goldfish_device_bus at ff001000 irq 1
goldfish_new_pdev goldfish_timer at ff003000 irq 3
goldfish_new_pdev goldfish_rtc at ff010000 irq 10
goldfish_new_pdev goldfish_tty at ff002000 irq 4
goldfish_new_pdev goldfish_tty at ff011000 irq 11
goldfish_new_pdev goldfish_tty at ff012000 irq 12
goldfish_new_pdev smc91x at ff013000 irq 13
goldfish_new_pdev goldfish_fb at ff014000 irq 14
goldfish_new_pdev goldfish_audio at ff004000 irq 15
goldfish_new_pdev goldfish_memlog at ff006000 irq -1
goldfish_new_pdev goldfish-battery at ff015000 irq 16
goldfish_new_pdev goldfish_events at ff016000 irq 17
goldfish_new_pdev goldfish_nand at ff017000 irq -1
goldfish_new_pdev goldfish-switch at ff018000 irq 18
goldfish_new_pdev goldfish-switch at ff019000 irq 19
goldfish_pdev_worker registered goldfish-switch
goldfish_pdev_worker registered goldfish-switch
goldfish_pdev_worker registered goldfish_nand
goldfish_pdev_worker registered goldfish_events
goldfish_pdev_worker registered goldfish-battery
goldfish_pdev_worker registered goldfish_memlog
goldfish_audio_probe
goldfish_pdev_worker registered goldfish_audio
goldfish_pdev_worker registered goldfish_fb
goldfish_pdev_worker registered smc91x
goldfish_pdev_worker registered goldfish_tty
goldfish_pdev_worker registered goldfish_tty
goldfish_pdev_worker registered goldfish_tty
goldfish_pdev_worker registered goldfish_rtc
goldfish_pdev_worker registered goldfish_timer
goldfish_pdev_worker registered goldfish_device_bus
goldfish_pdev_worker registered goldfish_interrupt_controller
ashmem: initialized
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
yaffs May 18 2009 21:56:58 Installing.
msgmni has been set to 183
alg: No test for stdrng (krng)
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
allocating frame buffer 320 * 480, got ffc10000
Console: switching to colour frame buffer device 40x30
console [ttyS0] enabled
brd: module loaded
loop: module loaded
nbd: registered device at major 43
smc91x.c: v1.1, sep 22 2004 by Nicolas Pitre <nico@cam.org>
eth0 (smc91x): not using net_device_ops yet
eth0: SMC91C11xFD (rev 1) at c684c000 IRQ 13 [nowait]
eth0: Ethernet addr: 52:54:00:12:34:56
goldfish nand dev0: size 4000000, page 2048, extra 64, erase 131072
goldfish nand dev1: size 4000000, page 2048, extra 64, erase 131072
goldfish nand dev2: size 4000000, page 2048, extra 64, erase 131072
mice: PS/2 mouse device common for all mice
*** events probe ***
events_probe() addr=0xc6854000 irq=17
events_probe() keymap=qwerty
input: qwerty as /devices/virtual/input/input0
goldfish_rtc goldfish_rtc: rtc core: registered goldfish_rtc as rtc0
logger: created 64K log 'log_main'
logger: created 256K log 'log_events'
logger: created 64K log 'log_radio'
IPv4 over IPv4 tunneling driver
GRE over IPv4 tunneling driver
TCP cubic registered
NET: Registered protocol family 17
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com>
All bugs added by David S. Miller <davem@redhat.com>
VFP support v0.3: implementor 41 architecture 1 part 10 variant 9 rev 0
goldfish_rtc goldfish_rtc: setting system clock to 2009-05-19 05:21:03 UTC (1242710463)
Freeing init memory: 108K
init: cannot open '/initlogo.rle'
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.0, "mtdblock0"
yaffs_read_super: isCheckpointed 0
save exit: isCheckpointed 1
yaffs: dev is 32505857 name is "mtdblock1"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.1, "mtdblock1"
yaffs: restored from checkpoint
yaffs_read_super: isCheckpointed 1
yaffs: dev is 32505858 name is "mtdblock2"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.2, "mtdblock2"
yaffs_read_super: isCheckpointed 0
init: cannot find '/system/bin/playmp3', disabling 'bootsound'
# eth0: link up
warning: `rild' uses 32-bit capabilities (legacy support in use)


从这行打印开始,内核调用用户层的init,开始执行ramdisk中的程序.
init: cannot open '/initlogo.rle'
android的init 与标准linux 的init 逻辑有些差异.他包含开机显示, 像上面的打印则是开机logo的打印. 还包含监控服务的内容,以及udev的内容,以及.
init会读/init.rc这个配置文件,然后会读取/proc/cpuinfo中Hardware这一行的值,来选择读取/init.Hardware.rc这个文件.


ramdisk 目录层次:
.
|-- data
|-- default.prop
|-- dev
|-- init
|-- init.goldfish.rc
|-- init.rc
|-- proc
|-- sbin
|   `-- adbd
|-- sys
`-- system


目录中没有库文件,所以init与adbd都是静态链接程序.
init.rc 里会把主要的根文件系统(nand flash中一个分区)mount到/system 目录下,然后执行里面的一些后台程序.

yaffs2 image可以使用unyaffs解开(http://code.google.com/p/unyaffs):
.
|-- abc
|-- app
|   |-- AlarmClock.apk
|   |-- Browser.apk
|   |-- Calendar.apk
|   |-- CalendarProvider.apk
|   |-- Camera.apk
|   |-- Contacts.apk
|   |-- ContactsProvider.apk
|   |-- Development.apk
|   |-- DownloadProvider.apk
|   |-- DrmProvider.apk
|   |-- GoogleSearch.apk
|   |-- HTMLViewer.apk
|   |-- LatinIME.apk
|   |-- Launcher.apk
|   |-- MediaProvider.apk
|   |-- Mms.apk
|   |-- Music.apk
|   |-- PackageInstaller.apk
|   |-- Phone.apk
|   |-- Settings.apk
|   |-- SettingsProvider.apk
|   |-- SoundRecorder.apk
|   |-- SpareParts.apk
|   |-- SubscribedFeedsProvider.apk
|   |-- TelephonyProvider.apk
|   |-- Term.apk
|   `-- UserDictionaryProvider.apk
|-- bin
|   |-- am
|   |-- app_process
|   |-- applypatch
|   |-- bugreport -> dumpstate
|   |-- cat -> toolbox
|   |-- check_prereq
|   |-- chmod -> toolbox
|   |-- chown -> toolbox
|   |-- cmp -> toolbox
|   |-- dalvikvm
|   |-- date -> toolbox
|   |-- dbus-daemon
|   |-- dd -> toolbox
|   |-- debuggerd
|   |-- dexopt
|   |-- df -> toolbox
|   |-- dhcpcd
|   |-- dmesg -> toolbox
|   |-- dosfsck
|   |-- dumpcrash -> dumpstate
|   |-- dumpstate
|   |-- dumpsys
|   |-- dvz
|   |-- flash_image
|   |-- gdbserver
|   |-- getevent -> toolbox
|   |-- getprop -> toolbox
|   |-- gzip
|   |-- hd -> toolbox
|   |-- id -> toolbox
|   |-- ifconfig -> toolbox
|   |-- iftop -> toolbox
|   |-- ime
|   |-- input
|   |-- insmod -> toolbox
|   |-- installd
|   |-- ioctl -> toolbox
|   |-- iptables
|   |-- kill -> toolbox
|   |-- linker
|   |-- ln -> toolbox
|   |-- log -> toolbox
|   |-- logcat
|   |-- logwrapper
|   |-- ls -> toolbox
|   |-- lsmod -> toolbox
|   |-- mediaserver
|   |-- mkdir -> toolbox
|   |-- mkdosfs -> toolbox
|   |-- monkey
|   |-- mount -> toolbox
|   |-- mv -> toolbox
|   |-- netcfg
|   |-- netstat -> toolbox
|   |-- notify -> toolbox
|   |-- ping
|   |-- pm
|   |-- printenv -> toolbox
|   |-- ps -> toolbox
|   |-- pv2way_omx_engine_test
|   |-- pvplayer_engine_test
|   |-- qemud
|   |-- radiooptions
|   |-- reboot -> toolbox
|   |-- recovery
|   |-- renice -> toolbox
|   |-- rild
|   |-- rm -> toolbox
|   |-- rmdir -> toolbox
|   |-- rmmod -> toolbox
|   |-- route -> toolbox
|   |-- schedtest
|   |-- schedtop -> toolbox
|   |-- sdutil
|   |-- sendevent -> toolbox
|   |-- service
|   |-- servicemanager
|   |-- setconsole -> toolbox
|   |-- setprop -> toolbox
|   |-- sh
|   |-- showlease
|   |-- sleep -> toolbox
|   |-- smd -> toolbox
|   |-- start -> toolbox
|   |-- stop -> toolbox
|   |-- surfaceflinger
|   |-- svc
|   |-- sync -> toolbox
|   |-- system_server
|   |-- test_pvauthorengine
|   |-- toolbox
|   |-- top -> toolbox
|   |-- umount -> toolbox
|   |-- vmstat -> toolbox
|   |-- vold
|   |-- watchprops -> toolbox
|   `-- wipe -> toolbox
|-- build.prop
|-- etc
|   |-- NOTICE.html.gz
|   |-- apns-conf.xml
|   |-- bookmarks.xml
|   |-- dbus.conf
|   |-- dhcpcd
|   |   |-- dhcpcd-hooks
|   |   |   |-- 01-test
|   |   |   |-- 20-dns.conf
|   |   |   `-- 95-configured
|   |   |-- dhcpcd-run-hooks
|   |   `-- dhcpcd.conf
|   |-- event-log-tags
|   |-- hosts
|   |-- init.goldfish.sh
|   |-- permissions
|   |   `-- platform.xml
|   |-- pvplayer.cfg
|   |-- security
|   |   |-- cacerts.bks
|   |   `-- otacerts.zip
|   `-- vold.conf
|-- fonts
|   |-- DroidSans-Bold.ttf
|   |-- DroidSans.ttf
|   |-- DroidSansFallback.ttf
|   |-- DroidSansMono.ttf
|   |-- DroidSerif-Bold.ttf
|   |-- DroidSerif-BoldItalic.ttf
|   |-- DroidSerif-Italic.ttf
|   `-- DroidSerif-Regular.ttf
|-- framework
|   |-- am.jar
|   |-- android.awt.jar
|   |-- android.policy.jar
|   |-- android.test.runner.jar
|   |-- com.android.im.plugin.jar
|   |-- core.jar
|   |-- ext.jar
|   |-- framework-res.apk
|   |-- framework-tests.jar
|   |-- framework.jar
|   |-- ime.jar
|   |-- input.jar
|   |-- monkey.jar
|   |-- pm.jar
|   |-- services.jar
|   `-- svc.jar
|-- lib
|   |-- browsertestplugin.so
|   |-- hw
|   |   `-- sensors.goldfish.so
|   |-- libEGL.so
|   |-- libFFTEm.so
|   |-- libGLESv1_CM.so
|   |-- libaes.so
|   |-- libagl.so
|   |-- libandroid_runtime.so
|   |-- libandroid_servers.so
|   |-- libaudioflinger.so
|   |-- libc.so
|   |-- libc_debug.so
|   |-- libcameraservice.so
|   |-- libcorecg.so
|   |-- libcrypto.so
|   |-- libctest.so
|   |-- libcutils.so
|   |-- libdbus.so
|   |-- libdl.so
|   |-- libdrm1.so
|   |-- libdrm1_jni.so
|   |-- libdvm.so
|   |-- libemoji.so
|   |-- libexif.so
|   |-- libexpat.so
|   |-- libhardware.so
|   |-- libhardware_legacy.so
|   |-- libicudata.so
|   |-- libicui18n.so
|   |-- libicuuc.so
|   |-- libjni_latinime.so
|   |-- liblog.so
|   |-- libm.so
|   |-- libmedia.so
|   |-- libmedia_jni.so
|   |-- libmediaplayerservice.so
|   |-- libnativehelper.so
|   |-- libnetutils.so
|   |-- libomx_aacdec_sharedlibrary.so
|   |-- libomx_amrdec_sharedlibrary.so
|   |-- libomx_amrenc_sharedlibrary.so
|   |-- libomx_avcdec_sharedlibrary.so
|   |-- libomx_avcenc_sharedlibrary.so
|   |-- libomx_m4vdec_sharedlibrary.so
|   |-- libomx_m4venc_sharedlibrary.so
|   |-- libomx_mp3dec_sharedlibrary.so
|   |-- libomx_sharedlibrary.so
|   |-- libopencore_2way.so
|   |-- libopencore_author.so
|   |-- libopencore_common.so
|   |-- libopencore_download.so
|   |-- libopencore_downloadreg.so
|   |-- libopencore_mp4local.so
|   |-- libopencore_mp4localreg.so
|   |-- libopencore_net_support.so
|   |-- libopencore_player.so
|   |-- libopencore_rtsp.so
|   |-- libopencore_rtspreg.so
|   |-- libpagemap.so
|   |-- libpixelflinger.so
|   |-- libreference-ril.so
|   |-- libril.so
|   |-- libsgl.so
|   |-- libskiagl.so
|   |-- libsonivox.so
|   |-- libsoundpool.so
|   |-- libsqlite.so
|   |-- libsrec_jni.so
|   |-- libssl.so
|   |-- libstdc++.so
|   |-- libsurfaceflinger.so
|   |-- libsystem_server.so
|   |-- libthread_db.so
|   |-- libui.so
|   |-- libutils.so
|   |-- libvorbisidec.so
|   |-- libwbxml.so
|   |-- libwbxml_jni.so
|   |-- libwebcore.so
|   |-- libwpa_client.so
|   |-- libxml2wbxml.so
|   `-- libz.so
|-- usr
|   |-- keychars
|   |   |-- qwerty.kcm.bin
|   |   |-- qwerty2.kcm.bin
|   |   `-- tuttle2.kcm.bin
|   |-- keylayout
|   |   |-- AVRCP.kl
|   |   |-- qwerty.kl
|   |   `-- tuttle2.kl
|   |-- share
|   |   |-- bmd
|   |   |   |-- RFFspeed_501.bmd
|   |   |   `-- RFFstd_501.bmd
|   |   `-- zoneinfo
|   |       |-- zoneinfo.dat
|   |       |-- zoneinfo.idx
|   |       `-- zoneinfo.version
|   `-- srec
|       `-- config
|           `-- en.us
|               |-- baseline.par
|               |-- baseline11k.par
|               |-- baseline8k.par
|               |-- dictionary
|               |   |-- basic.ok
|               |   |-- cmu6plus.ok.zip
|               |   `-- enroll.ok
|               |-- g2p
|               |   `-- en-US-ttp.data
|               |-- grammars
|               |   `-- VoiceDialer.g2g
|               `-- models
|                   |-- generic.swiarb
|                   |-- generic11.lda
|                   |-- generic11_f.swimdl
|                   |-- generic11_m.swimdl
|                   |-- generic8.lda
|                   |-- generic8_f.swimdl
|                   `-- generic8_m.swimdl
`-- xbin
    |-- add-property-tag
    |-- backup
    |-- check-lost+found
    |-- cpueater
    |-- crasher
    |-- daemonize
    |-- dbus-monitor
    |-- dbus-send
    |-- dexdump
    |-- latencytop
    |-- librank
    |-- nc
    |-- netperf
    |-- netserver
    |-- opcontrol
    |-- oprofiled
    |-- pppd
    |-- procmem
    |-- procrank
    |-- scp
    |-- showmap
    |-- showslab
    |-- sqlite3
    |-- ssh
    |-- strace
    |-- su
    `-- timeinfo

25 directories, 302 files




link状态上报

在phy的内核线程里,会周期性的通过MII查询link状态.
        if (phydev->link) {
                phydev->state = PHY_RUNNING;
                netif_carrier_on(phydev->attached_dev);
            } else {
                phydev->state = PHY_NOLINK;
                netif_carrier_off(phydev->attached_dev);
            }

然后通过下面两个函数来进行处理:,
void netif_carrier_on(struct net_device *dev)
{
    if (test_and_clear_bit(__LINK_STATE_NOCARRIER, &dev->state))
        linkwatch_fire_event(dev);
    if (netif_running(dev))
        __netdev_watchdog_up(dev);
}

void netif_carrier_off(struct net_device *dev)
{
    if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state))
        linkwatch_fire_event(dev);
}
会把状态设到dev->state里.  并调用linkwatch_fire_event来在list:lweventlist中添加一个节点.并由workqueue:linkwatch_work来处理.主要的处理流程为:进行一些协议栈方面的维护工作, 然后调用 netdev_state_change 来notify netdev_chain(事件为NETDEV_CHANGE),以及rtmsg_ifinfo来向group:RTNLGRP_LINK广播RTM_NEWLINK信息.   注册 netdev_chain的包括 rtnetlink. 但其在回调里没作处理. 用户程序通过netlink接收RTNLGRP_LINK的消息即可及时得到通知.

gnome的NetworkManager以及ifplugd间接或直接的使用这种机制.

netlink interface

其主要是用来配置网络的标准化接口. 文章Understanding And Programming With Netlink Sockets(http://people.redhat.com/nhorman/papers/netlink.pdf)作了基本介绍.

使用示例见: http://www.wlug.org.nz/LinuxNetlinkSocketExample.
我将其代码略微修改,以得到内核层link状态报告,

#include <sys/socket.h>
#include <unistd.h>
#include <err.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>

#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <linux/if.h>

#if 0
//#define MYPROTO NETLINK_ARPD
#define MYMGRP RTMGRP_NEIGH
// if you want the above you'll find that the kernel must be compiled with CONFIG_ARPD, and
// that you need MYPROTO=NETLINK_ROUTE, since the kernel arp code {re,ab}uses rtnl (NETLINK_ROUTE)

#else
#if 0
#define MYPROTO NETLINK_ROUTE
#define MYMGRP RTMGRP_IPV4_ROUTE
#else
#define MYPROTO NETLINK_ROUTE
#define MYMGRP RTNLGRP_LINK
#endif
#endif

struct msgnames_t {
        int id;
        char *msg;
} typenames[] = {
#define MSG(x) { x, #x }
        MSG(RTM_NEWROUTE),
        MSG(RTM_DELROUTE),
        MSG(RTM_GETROUTE),
#undef MSG
        {0,0}
};

   

char *lookup_name(struct msgnames_t *db,int id)
{
        static char name[512];
        struct msgnames_t *msgnamesiter;
        for(msgnamesiter=db;msgnamesiter->msg;++msgnamesiter) {
                if (msgnamesiter->id == id)
                        break;
        }
        if (msgnamesiter->msg) {
                return msgnamesiter->msg;
        }
        snprintf(name,sizeof(name),"#%i",id);
        return name;
}

int open_netlink()
{
        int sock = socket(AF_NETLINK,SOCK_RAW,MYPROTO);
        struct sockaddr_nl addr;

        memset((void *)&addr, 0, sizeof(addr));

        if (sock<0)
                return sock;
        addr.nl_family = AF_NETLINK;
        addr.nl_pid = getpid();
        addr.nl_groups = MYMGRP;
        if (bind(sock,(struct sockaddr *)&addr,sizeof(addr))<0)
                return -1;
        return sock;
}

int read_event(int sock)
{
        struct sockaddr_nl nladdr;
        struct msghdr msg;
        struct iovec iov[2];
        struct nlmsghdr nlh;
        char buffer[65536];
        int ret;
        iov[0].iov_base = (void *)&nlh;
        iov[0].iov_len = sizeof(nlh)+sizeof(struct ifinfomsg);
        iov[1].iov_base = (void *)buffer;
        iov[1].iov_len = sizeof(buffer);
        msg.msg_name = (void *)&(nladdr);
        msg.msg_namelen = sizeof(nladdr);
        msg.msg_iov = iov;
        msg.msg_iovlen = sizeof(iov)/sizeof(iov[0]);
        ret=recvmsg(sock, &msg, 0);
        if (ret<0) {
                return ret;
        }
        printf("Type: %i (%s)\n",(nlh.nlmsg_type),lookup_name(typenames,nlh.nlmsg_type));
        printf("Flag:");
#define FLAG(x) if (nlh.nlmsg_flags & x) printf(" %s",#x)
        FLAG(NLM_F_REQUEST);
        FLAG(NLM_F_MULTI);
        FLAG(NLM_F_ACK);
        FLAG(NLM_F_ECHO);
        FLAG(NLM_F_REPLACE);
        FLAG(NLM_F_EXCL);
        FLAG(NLM_F_CREATE);
        FLAG(NLM_F_APPEND);
#undef FLAG
        printf("\n");
        printf("Seq : %i\n",nlh.nlmsg_seq);
        printf("Pid : %i\n",nlh.nlmsg_pid);
        printf("\n");

        {
            struct ifinfomsg *ifi;
            ifi= NLMSG_DATA((unsigned char *) &nlh);
            if(ifi->ifi_flags & IFF_LOWER_UP)
                printf("link up:[%x]\n",ifi->ifi_flags);
            else
                printf("link down:[%x]\n",ifi->ifi_flags);
        }
        return 0;
}

int main(int argc, char *argv[])
{
        int nls = open_netlink();
        if (nls<0) {
                err(1,"netlink");
        }

        while (1)
                read_event(nls);
        return 0;
}

Saturday, May 23, 2009

d-bus

d-bus  资料在这里有很多.
使用示例可用文档: Using the D-Bus C API(http://dbus.freedesktop.org/doc/dbus/libdbus-tutorial.html)所附的dbus-example.c.
编译如下:
gcc dbus-example.c -o dbus-example `pkg-config --cflags --libs dbus-1`

pkg-config

pkg-config 可用来取得使用某个库来进行开发时所需的编译参数. 如:
[dybbuk@localhost tmp]$ pkg-config --cflags --libs dbus-1
-I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include  -L/lib -ldbus-1 

库的名字必須跟/usr/lib/pkgconfig 相应的.pc文件的名字一样.  否则就无法取得.

Thursday, May 21, 2009

linux large file support

LFS support

在老的文件操作接口以及实现中,使用整形数来保存偏移或字节数,故在32bit机器上存在最大只能表示2G的问题.
像ftell,feek:
 int fseek(FILE *stream, long offset, int whence);
 long ftell(FILE *stream);

要支持2G以上大文件,有几个点要注意:物理文件系统,文件系统接口(包括kernel,libc),以及文件操作接口选择和编译.

==文件系统对大文件的支持情况==
FAT最大单个文件2G,FAT32最大4G,NTFS最大128G

nfs: version 2只能支持2G的文件,version 3支持LFS.如使用 nfs v2,则在fseeo超过2G的文件位置时会报错,非法参数.
一般nfs server支持version 2,version3, version 4版本的nfs传输.如要强制使用nfs version 3,可以在mount时加上参数, nfsvers=3.否则默认一般都是version2传输.内核mount nfs根文件系统时的参数同样可以加上这个参数:nfsroot=server-ip:root-dir,nfsvers=3.

ext2/3:支持大文件.

==kernel==
文件系统驱动是按照文件系统标准在实现,在系统调用这一层,也都默认能支持大文件.

==c库==
为此glibc/uclibc加入了LFS(large file support)的特性.一般的版本这个特性都是打开了的. 故要支持LFS,一般不用重新编译.

==c接口的使用和编译==
像ftell, fseek这两个接口,在标准c中的原型定义为:
       int fseek(FILE *stream, long offset, int whence);
       long ftell(FILE *stream);
故在32bit操作系统下,这两个接口是无法支持大文件的.必須使用其它接口.

其它文件接口,不存在上面的情况,要么是没有使用到跟offset,size相关的参数,像fopen等,要么其涉及到offset和size的参数用的是非标准数据类型(如off_t等),标准里对这种非标准数据类型没有定义.

故在实际glibc/uclibc中, 在实现涉及到offset和size等的非标准数据类型时,提供了两套.一套为32位的.一套为64位的. 使用宏来控制_LARGEFILE_SOURCE _LARGEFILE64_SOURCE _FILE_OFFSET_BITS 来控制.

故要在程序中支持大文件,只需要加上 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 的编译选项即可.

在有些文档中,会介绍64位的文件系统接口,如:
 fopen->fopen64
 stat->stat64
 fstat->fstat64
 lstat->lstat64
 fseeko->fseeko64
 ftello->ftello64

但不推荐直接这些函数,因为这属于glibc/uclibc内部函数, 不是标准函数.代码移植性比较差. 并且使用-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64宏达到的是类似效果.由编译器用宏展开或符号重名的方式来调用相应的64位的文件接口.

==其它==
1.如不打开上述编译控制宏, fopen默认情况下打开大文件会失败,报错: Value too large for defined data type

2. busybox有CONFIG_LFS选项来决定是否使用上述三个宏.


[[Category:文件系统]][[Category:linux]]

Sunday, May 17, 2009

android emulator初探

android emulator基于qemu开发. 源码位于external/qemu目录下.
但从使用上看,看不出qemu的影子.但实现上emulator与qemu没有太大区别.

以命令行解析为例
使用 ./emulator -debug all 启动,可以看到类似下面的打印:
emulator: argv[00] = "./emulator"
emulator: argv[01] = "-kernel"
emulator: argv[02] = "/home/dybbuk/work/android_dev/mydroid/prebuilt/android-arm/kernel/kernel-qemu"
emulator: argv[03] = "-initrd"
emulator: argv[04] = "/home/dybbuk/work/android_dev/mydroid/out/target/product/generic//ramdisk.img"
emulator: argv[05] = "-nand"
emulator: argv[06] = "system,size=0x4200000,initfile=/home/dybbuk/work/android_dev/mydroid/out/target/product/generic//system.img"
emulator: argv[07] = "-nand"
emulator: argv[08] = "userdata,size=0x4200000,file=/tmp/android/emulator-YrPtDf"
emulator: argv[09] = "-nand"
emulator: argv[10] = "cache,size=0x4200000"
emulator: argv[11] = "-serial"
emulator: argv[12] = "android-kmsg"
emulator: argv[13] = "-serial"
emulator: argv[14] = "stdio"
emulator: argv[15] = "-serial"
emulator: argv[16] = "android-qemud"
emulator: argv[17] = "-append"
emulator: argv[18] = "qemu=1 console=ttyS0 androidboot.console=ttyS1 android.checkjni=1 android.qemud=ttyS2 android.ndns=3"
emulator: argv[19] = "-m"
emulator: argv[20] = "96"
emulator: argv[21] = "-clock"
emulator: argv[22] = "unix"
这些参数就是emulator调用qemu时所用的参数. 你如果用过qemu的话,会对部分参数有些印象.
所以从命令行参数来看,emulator 只不过是对qemu 作了封装, 使得易于使用.

以qemu的文档来分析各个参数的作用:
‘-kernel bzImage’
    Use bzImage as kernel image.
‘-append cmdline’
    Use cmdline as kernel command line
‘-initrd file’
    Use file as initial ram disk.
‘-clock method’
    Force the use of the given methods for timer alarm. To see what timers are available use -clock ?.
‘-m megs’
    Set virtual RAM size to megs megabytes. Default is 128 MiB. Optionally, a suffix of “M” or “G” can be used to signify a value in megabytes or gigabytes respectively.
‘-serial dev’
    Redirect the virtual serial port to host character device dev. The default device is vc in graphical mode and stdio in non graphical mode.
    This option can be used several times to simulate up to 4 serial ports.
‘-nand’
    这个应该是android版的qemu新增的参数.

emulator使用tip:
1.  以终端作为虚拟机的串口以及串口控制台.
添加: -show-kernel -shell 选项.

2. 使用其它的kernel image 文件:
 /home/dybbuk/work/android_dev/mydroid/out/host/linux-x86/bin/emulator -sysdir /home/dybbuk/work/android_dev/mydroid/out/target/product/generic/ -system /home/dybbuk/work/android_dev/mydroid/out/target/product/generic/system.img -ramdisk /home/dybbuk/work/android_dev/mydroid/out/target/product/generic//ramdisk.img -kernel /home/dybbuk/work/android_dev/mydroid/kernel/arch/arm/boot/zImage

Monday, May 11, 2009

同事的小孩

上一张帅哥的靓照, 来招揽人气.

周日去看了一下同事的小孩..挺可爱的一个小孩.



Sunday, May 10, 2009

fedora 9 编译 Android

android
    主站:http://www.android.com/
    application develop based on the platform: http://developer.android.com/
    platform develop:http://source.android.com/  


源代码的下载说明页面是:http://source.android.com/download
最新的release:Release features


(1) 配置repo账户
git config --global user.email "xxxxx@xxxxxxx"
git config --global user.name "xxxxxx"

(2)开始准备下载android
cd ~/work/android_dev
mkdir mydroid
cd mydroid
../bin/repo init -u git://android.git.kernel.org/platform/manifest.git -b android-1.5

(3)开始下载android platform的源代码
repo sync
这个操作会持续一段时间,看网速了,只有800M左右。

(4)编译
make
我这边编译时间在一小时以上
编译完毕以后,会发现在代码目录下多了一个目录:
~/work/android_dev/mydroid/out

如果报错:
which: no javac in (/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/lib/ccache:/usr/local/bin:/usr/bin:/bin:/opt/real/RealPlayer:/home/dybbuk/bin:/sbin/:/usr/sbin/:/opt/real/RealPlayer)
 则说明你没有安装 jdk 5.0..  去 http://java.sun.com/javase/downloads/5/jdk  下载 jdk  安装后,  设置环境变量:
export ANDROID_JAVA_HOME=/usr/java/jdk1.5.0_18
export PATH=/usr/java/jdk1.5.0_18/bin:$PATH

(5)开始验证生成的结果
export ANDROID_PRODUCT_OUT=~/work/android_dev/mydroid/out/target/product/generic
~/work/android_dev/mydroid/out/host/linux-x86/bin/emulator
应该看到开机的画面(第一次开启的时候,应该还有一个向google反馈的一个对话框,按下确定即可)。


paltform source layout:
Project
    Description
bionic
    C runtime: libc, libm, libdl, dynamic linker
bootloader/legacy
    Bootloader reference code
build
    Build system
dalvik
    Dalvik virtual machine
development
    High-level development and debugging tools
frameworks/base
    Core Android app framework libraries
frameworks/policies/base
    Framework configuration policies
hardware/libhardware
    Hardware abstraction library
hardware/ril
    Radio interface layer
kernel
    Linux kernel
prebuilt     Binaries to support Linux and Mac OS builds
recovery
    System recovery environment
system/bluetooth
    Bluetooth tools
system/core     Minimal bootable environment
system/extras
    Low-level debugging/inspection tools
system/wlan/ti     TI 1251 WLAN driver and tools

===============================================
kernel
===============================================
下载的kernel为manifest 的kernel
用于模拟器的板型为goldfish,所以要编译kernel需要把kernel切换到 goldfish 的分支.
[dybbuk@localhost kernel]$ git branch -r
  korg/android-2.6.25
  korg/android-2.6.27
  korg/android-2.6.29
  korg/android-goldfish-2.6.27
  korg/android-goldfish-2.6.29
  m/android-1.5
  m/master
[dybbuk@localhost kernel]$ git checkout korg/android-goldfish-2.6.29
toolchain:
直接用android里自带的:
 export PATH=/home/dybbuk/work/android_dev/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.3.1/bin:$PATH
make ARCH=arm CROSS_COMPILE=arm-eabi- goldfish_defconfig
make ARCH=arm CROSS_COMPILE=arm-eabi-
即可生成emulator所用的zImage

Friday, March 20, 2009

<<货币战争>>读感

<<货币战争>>买了很久了,当时也是一口气就看了一遍. 对货币发行和中央银行的运作历史都有了一定的了解.其中最令我震惊的是作者提出的美联储的私有性质.
请看原文:

“不算夸张地说,直到今天,中国可能也没有几个经济学家知道美联储其实是私有的中央银行。所谓“联邦储备银行”,其实既不是“联邦”,更没有“储备”,也算不上“银行”。“

"如此大量的国会记录和法律案例明白无误地说明了美联储的私有性质,可是有多少美国人、中国人和其他国家的人知道这一点呢?这才是问题的可怕之处!我们以为 ”自由公正“的西方权威新闻媒体会报道一切真相,原来真相是大量的事实被它们有意地”过滤“掉了。那么美国的教科书书呢?原来各种以国际银行家们的名字命名的基金会们在为美国的下一代挑选着”内容健康“的教科书."

加上书中其它一些表述,让我感觉到一些个金融资本家正在控制世界的恐怖. 但今天看到的一篇文章批驳了这本书. 让我有些释然.
原文如下:
为什么宋鸿兵不知道美联储是私有的?
http://wenyidao.blog.hexun.com/26734350_d.html

看完这篇文章我更认为美联储的设计是美国各种利益斗争的结果,至少达到了某种平衡. 所达不存在由些许人的意志在操纵的情况.

幸好我看了这篇文章,否则我怕会成为"阴谋论"的信仰者.

Thursday, March 05, 2009

设计揭密

OLPC XO-1
http://www.eetimes.com/news/design/showArticle.jhtml?articleID=208400384
http://www.eetchina.com/ART_8800542529_480701_TA_815de645.HTM?click_from=1234

Wednesday, March 04, 2009

软卧

春节回家是乘坐T98回来的..生平第一次坐的软卧...
软卧的条件:
4个座,有电视,有两个节目,放的不是实时节目,都是录像.耳机要向乘务员借.






Monday, March 02, 2009

长沙火车站/汽车西站的钞票陷阱

从网上找了两篇文章,来提醒自己以及各位朋友.
1.
小猫本月13号去了趟长沙见朋友,准备搭火车回家。买完火车票后,路过售票厅右侧的小店,看见有卖玉米棒的,正好肚子饿了,决定买一根。起先我给店家一张五元的,店家说五元票子缺了个角,不收,要求换一张。可是小猫当时手里就这张零钱,没办法,只好拿张一百元的让店家找。店家拿着那张百元钞票看了一下就收了起来。然后他又问我:你真的没零钱了吗?我说:是啊,没的了,要不我把钱包给你看啊。店家摇了摇头,说:算了,算了,还是拿那张五块的吧。随后就退了张百元钞给我。当时我也没细看,回到家后才发现那张钞票是假钞。气晕我了。更可恨的是,我把我的经历说给我朋友听,没想到有我这种经历的朋友还不只我一人,有个朋友一年前也就上过此当,就在我被骗的那家店子隔壁。由此可见,长沙火车站这种拿假钞换客户真钞的勾当已不是一天两天了。小猫本人不善交际,朋友圈小,但这么小的朋友圈子都有两人受害,而长沙火车站人流量每天又这么大,想想都知道一天会有多少人跟小猫一样上当受骗。他们哪来的这么多假钞,这么大笔假钞又是从哪来的?如此猖獗的捣卖假币行为,为什么这么久就没什么部门来管一管?!我真想在长沙火车站立上一块广告牌,上面就写这样一句广告语:贩假币,来长沙.
2.
现在的人真是越来越聪敏,骗人的手法越来越高.我记的以前看湖南都市一时间时,就播过长沙火车站的骗术.但是这次自己到长沙火车站还是上了当.
虽然很多人知道他们是怎么骗的了,但是我还是想在这里罗嗦哈!希望大家不要上当,提高警惕!
1  不要到长沙火车站买什么东西,全是假的!
2  到长沙火车站如果要买东西,吃饭什么的,在你给老板钱时要特别小心.你要直接给店主100的,当店主接过钱后会迅速把你的钱掉包,然后拿一张他早准备好了 的缺角假钞100的退给你,说你这张钱不完整,叫你换一张,这时凭我们的肉眼是根本看不出来钱以掉包.都会换一张给他们,在拿一张给他.这时你的真钞以不 知不觉的变成了假钞.
    如过你开始给他们的是零钱,他们会在接你钱后迅速的扯掉一个角.然后同样告诉你,你的钱缺损,麻烦换一张,给你换一张,他又给你扯掉了,说这张还是缺损,麻烦在换,总之反复他要搞的你没有零钱,把百元大钞搞出来了,然后就用前面所说的方法在来一次.
      等你发现那张钱是假的时候已经迟了,有的人要不坐车走了,有的跑到边换钱的人已经不在了,吃亏的还是自己.所以大家还是小心点好,老百姓搞点钱不容易.
      不过我那天开始是上当了,进笼子了,但是后来发现的早,当我给完钱后打的都走了几公里,我老婆发现了,我们马上叫的士师傅掉头回去,等我们到边时.那个店 子正准备关门.我当时也想好了,100钱是不多,但是受不了那个气.何况我是湘西的爷们,不能就这么被骗了.要是不给老子换,我一个流动人口,还怕你一个 开店子的,老子不咋你店子该你姓.不过等我们跑到他店子门前时,老板比较狡猾,自己也知道理亏.我门还没说什么,他就说给他们换一张钱.我这次是算运气 好,在来迟点他关门了你找鬼去.所以大家出门在外还是小心的好!

Sunday, March 01, 2009

穆斯林的葬礼

首先这是一本悲剧小说.所以看之前请做好心理准备.比如提前准备好纸巾.

小说的故事简单点说是两个故事, 第一个故事讲的是一个孤儿韩子奇,其年少时跟随着师傅梁亦清学习玉器雕刻.在梁亦清过世后,其与梁亦清的大女儿梁君璧成亲,并把家业发扬光大,以集玉作为最大的乐趣.但因为日军入侵,怕玉受到损害带着收集的玉与师傅的二女儿梁冰玉到英国避难,十年中两人产生爱情,并生下韩新月.抗战胜利后,为了保全玉带着玉以及家人回国.回国后发现两家无法融合,最后梁冰玉留下女儿韩新月只身远走他乡. 第二个故事讲花季少女韩新月考入大学后,被年轻的班主任楚雁潮所赏识,韩新月因为被确诊有严重的心脏病在就读不到一年后休学,坚持治疗两年后去世.这个过程中楚雁潮与韩新月相爱,一直陪伴韩新月走过生命最后的时光.

故事发生在一个回民世家,同时也是玉器世家.虽然如作者后记所说,回族和玉器并不是作品要刻意表达的东西.但是相关的元素贯穿始终,十分引人入胜.整部作品中,作者描述两段葬礼,分别是玉器雕刻师傅梁亦清以及少女韩新月的葬礼.可能在作者眼里这两个人才有资格享受正式的穆斯林的葬礼. 梁亦清一生以玉器雕刻为业,支持家业,并耗尽心血努力做出传世珍品,其勤勤恳恳,操劳一生,典型的穆斯林劳动人民形象.韩新月正处花季年龄,各方面表现十分优秀,处于实现人生理想的正常轨迹当中,收获美好人生的希冀当中 .但突如其来的疾病摧毁了这一切.实在可悲可泣.虽然其爱上了汉族男子并且是自己的老师,但两人之间是纯结的爱情,所以韩新月能够拥有隆重的穆斯林到葬礼. 相反,书中重要的主人公韩子奇去世时,作者并没有描写其葬礼,并且在死之前还交代自己不是回民的事实.可见作者对其是批判的态度.其实韩子奇的两段爱情/婚姻给我的感觉都还比较合理.在梁亦清去世后,梁家衰败之时,韩子奇怀着感恩的心准备承担重振梁家的责任,同时梁君璧也被韩子奇的这份责任感所感动.所以两人的结合顺理成章.韩子奇与梁冰玉在英国的日子恰逢二战,长时间与亲人失去联系,并且战争带给人巨大的不安全感,以及梁冰玉对韩子奇一直以来的好感等因素成就了这对情人.所以虽然梁君璧与梁冰玉是姐妹,但这两段感情本身没有问题.所以批判韩子奇,并不在于他先后与姐妹两人产生爱情并生育子女,违反了伦理道德,而在于其为了玉而先后抛弃家庭和爱人.在作者笔下,韩子奇的死最痛苦,死前最珍贵的东西都失去了.韩子奇的贪婪造成了他自己的悲剧,同时也给他的亲人带来了巨大的伤害.

Thursday, February 12, 2009

检查根文件系统是否为网络文件系统

追踪网络问题时,看到这么一段bash脚本,发现应该很有用.

      # Don't shut the network down if root is on NFS or a network
    # block device.
        rootfs=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $3; }}' /etc/mtab)
        rootopts=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $4; }}' /etc/mtab)
   
    if [[ "$rootfs" =~ ^nfs ]] || [[ "$rootopts" =~ "_netdev|_rnetdev" ]] ; then
        exit 1
    fi

关于/etc/mtab 的作用,可以看busybox关于mount命令是否支持/etc/mtab这个配置选项的描述:
config FEATURE_MTAB_SUPPORT
    bool "Support for the old /etc/mtab file"
    default n
    depends on MOUNT || UMOUNT
    select FEATURE_MOUNT_FAKE
    help
      Historically, Unix systems kept track of the currently mounted
      partitions in the file "/etc/mtab". These days, the kernel exports
      the list of currently mounted partitions in "/proc/mounts", rendering
      the old mtab file obsolete. (In modern systems, /etc/mtab should be
      a symlink to /proc/mounts.)

      The only reason to have mount maintain an /etc/mtab file itself is if
      your stripped-down embedded system does not have a /proc directory.
      If you must use this, keep in mind it's inherently brittle (for
      example a mount under chroot won't update it), can't handle modern
      features like separate per-process filesystem namespaces, requires
      that your /etc directory be writeable, tends to get easily confused
      by --bind or --move mounts, won't update if you rename a directory
      that contains a mount point, and so on. (In brief: avoid.)

      About the only reason to use this is if you've removed /proc from
      your kernel.

endmenu


Wednesday, February 11, 2009

printk

printk可以在任何上下文中调用.其有16K(具体数值menuconfig可以配置)的ring buffer. dmesg显示的就是这部分数据.故如果打印过多,dmesg只能查看到最新的打印,无法得到自开机以来全部的内核打印.

printk的信息级别:
#define    KERN_EMERG    "<0>"    /* system is unusable            */
#define    KERN_ALERT    "<1>"    /* action must be taken immediately    */
#define    KERN_CRIT    "<2>"    /* critical conditions            */
#define    KERN_ERR    "<3>"    /* error conditions            */
#define    KERN_WARNING    "<4>"    /* warning conditions            */
#define    KERN_NOTICE    "<5>"    /* normal but significant condition    */
#define    KERN_INFO    "<6>"    /* informational            */
#define    KERN_DEBUG    "<7>"    /* debug-level messages            */

当不指定级别时,kernel会默认成KERN_WARNING级别

printk最后直接调用或间接调用_call_console_drivers把字符输出到console. 只代码中可以看到:
只有msg_log_level小于console_loglevel的信息才会输出.kernel默认console_loglevel为7( 即 KERN_DEBUG, 故KERN_DEBUG的信息不会输出到console).
/*
 * Write out chars from start to end - 1 inclusive
 */
static void _call_console_drivers(unsigned long start,
                unsigned long end, int msg_log_level)
{
    if (msg_log_level < console_loglevel &&
            console_drivers && start != end) {
        if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {
            /* wrapped write */
            __call_console_drivers(start & LOG_BUF_MASK,
                        log_buf_len);
            __call_console_drivers(0, end & LOG_BUF_MASK);
        } else {
            __call_console_drivers(start, end);
        }
    }
}

故要查看在console上看不到的内核信息,即 msg level >= console_loglevel 的信息,可以使用dmesg.

要配置console_loglevel,可以在启动kernel时加上loglevel=n这个选项.也可以在应用层通过syslog系统调用(glibc对应的函数为klogctl)来动态修改.


printk 支持同时向多个console输出字符, 其维护一个console_drivers链表,分别调用
void register_console(struct console *console)
int unregister_console(struct console *console)
来添加或删除console.
其实这个console只是提供内核打印输出的功能.  在串口驱动初始化时, 一般会注册一个console.


Tuesday, February 10, 2009

全国性付费频道运营机构

中数传媒:cctv
上海文广互动电视有限公司: 上海文广新闻传媒集团(SMG)
华诚电影电视数字节目有限公司:由电影频道节目中心(CCTV-6)、中国电影集团公司共同出资
鼎视传媒:由北京北广传媒数字电视有限公司、中央人民广播电台、天津时代天创传媒发展有限公司、山东省广播电视总台、安徽电视台五家股东共同组建成立。

节目由这四个机构各自独立制定销售价格。网络公司只作为本地广播电视网络运营商,负责付费频道用户接入,无权对付费频道内容进行调整、变更,也无权调整其销售价格.

fedora发行版覆盖的kernel版本

fedora 5 kernel-2.6.15-1.2054 kernel-2.6.20-1.2320
fedora 6 kernel-2.6.18-1.2798 kernel-2.6.22.14-72
fedora 7 kernel-2.6.21-1.3194 kernel-2.6.23.17-88
fedora 8 kernel-2.6.23.1-42 kernel-2.6.26.8-57

Thursday, February 05, 2009

提高内存电压解决内存错误问题

表弟的电脑经常蓝屏,并且程序时不时会弹内存读写错误的提示.  这样棘手的问题我也没什么经验.  不过不得以得硬着头皮上, 谁叫他用的电脑是我以前用的.

这样的现象肯定和内存不稳定有关系. 主板上只是插了一根512M的内存,所以不存在多条内存兼容的问题. 

内存不稳定归要到底是内存总线上的波形不是特别的标准, 一定概率下会读写出错.  最好的方法当然是用示波器量一下波形,就波形的缺陷针对性的解决. 没有这样的条件的话, 就只能试试提高电压,降低时钟频率,延长读写时序时间, 都有助于提高稳定性.

看了一下主板的手册,bios里有很多与超频相关的配置, 这样的话进行上述调整就容易的多, 看来当初主板选型真是有先见之明.

进入bios将内存电压调到2.6V,  然后运行memtest86+,  跑了300%都没问题, 接着进入windows运行了一段时间, 也没什么异常. 看来问题解决了.

网上查到的解释:
内存(DIMM)电压控制功能
内存电压调整是为了对付有些品质不是很好内存颗粒而设置的。运行频率提升后,内存的工作压力增加,如果内存颗粒品质不是很好的话,会出现蓝屏、死机等错误。为了能使超频后内存工作稳定,有时就需要加一点内存电压就可以稳定工作了。因为较高的内存工作电压可以使杂讯减弱。内存电压调整的范围根据主机板设计而定,各型号主板提供的设置范围根据主板设计以及采用内存的种类不同而不同。

不过内存电压调高意味着功耗增加,在温度方面也要同步考虑.




Tuesday, January 20, 2009

usb wlan方案以其linux驱动整理

由于本人非业内人士,  以下信息都是个人从网上收集而来..

usb wlan方案通常是两个芯片组成的芯片组: MAC/BBP Integrated Chip + 2.4 GHz Transceiver Chip(RF chip).

TI:
    TNETW3426+TNETW3422+TNETW1450 http://focus.ti.com/pdfs/bcg/tnetw1450_prod_bulletin.pdf

VIA:
    VT6656 http://www.via.com.tw/en/products/networking/wireless/vt6656/

Ralink:
    http://www.ralinktech.com/ralink/Home/Products.html
    RT2500 chipset: RT2571+RT2526  http://www.ic37.com/htm_tech/2007-8/27279_205296.htm
    RT2501 chipset: RT2561+RT2527  http://www.ralinktech.com.tw/data/RT2501_Brochure.pdf
    RT2501USB chipset: RT2571w+RT2528 http://www.ralinktech.com.tw/data/RT2501USB_Brochure.pdf
    RT5201USB chipset: RT2571w+RT5226 http://www.ralinktech.com.tw/data/RT5201USB_Brochure.pdf
    应用实例有: 华硕WL-167G, TP-Link TL-WN321G D-Link DWL-G122

Atheros:
    其在2006年4月兼并了ZyDAS.
    ZyDAS 的 ZD1211 使用广泛,可以搭配很多的RF chip.
    如:
    ZD1211B+ UW2453   应用实例: http://psp.cngba.com/psp_zx/2009010760529_2.shtml
    ZD1211B+ maxim rf(具体型号未知) 应用实例: TP-LINK TL-WN322G+
    ZD1211 + AL2230/AL2230S
    ZD1211 + AL7230B

Marvell: http://www.marvell.com/
    具体应用实例有: 腾达W54U

=======================================================================
linux usb wlan驱动相关
kernel:
wireless core:net / wireless /
mac80211 stack: net / mac80211 /
chipset driver: drivers / net / wireless /

official Linux Wireless wiki:
支持设备列表:
http://wireless.kernel.org/en/users/Devices/USB
http://wireless.kernel.org/
ralink: 厂家直接提供linux下chipset驱动.
atheros: http://madwifi-project.org, 非官方支持,故不是所有的芯片组都支持.
如:    TP-LINK TL-WN322G+  使用 ZD1211B + maxim 的RF .  内核现有驱动不支持这种RF,报错:
----------
usb 1-5: USB disconnect, address 6
usb 1-5: new high speed USB device using ehci_hcd and address 7
usb 1-5: configuration #1 chosen from 1 choice
usb 1-5: reset high speed USB device using ehci_hcd and address 7
phy4: Selected rate control algorithm 'pid'
zd1211rw 1-5:1.0: phy4
usb 1-5: New USB device found, idVendor=0ace, idProduct=1215
usb 1-5: New USB device strings: Mfr=16, Product=32, SerialNumber=0
usb 1-5: Product: USB2.0 WLAN
usb 1-5: Manufacturer: ZyDAS
firmware: requesting zd1211/zd1211b_ub
firmware: requesting zd1211/zd1211b_uphr
zd1211rw 1-5:1.0: RF MAXIM_NEW_RF 0x8 is not supported
firmware: requesting zd1211/zd1211b_ub
firmware: requesting zd1211/zd1211b_uphr
----------
    相关信息可见: http://www.reactivated.net/weblog/archives/2007/05/zd1211-back-in-production/


Saturday, January 10, 2009

假kinston u盘研究.

几个月前在村里买了个4G的kinston u盘,买时觉得很便宜. 回来用时发送经常丢数据. 故丢在一边,又买了个另外的.

u盘外形:

闲着没事,开始研究u盘的硬件组成. 于是把这个u盘拆开,pcb板如下两图:

主控芯片为:mxt6208.
nard flash为: MTUJC072QH
简单找了找,找不到任何datasheet. 但找到大量关于u盘量产工具以及假的u盘存在扩容的情况: 即主机软件看到的容量比实际flash的容量要大.
大概明白u盘量产工具是对 usb flash controller的firmware编程的一个东西. 可能正式生产也采用这个工具. 下了个UdTools1.0.2.9_20080325,其读到的主控芯片为: MXT6208A. flash为:HY27UT088G2M_1GB.  看来果然是虚标容量. 重新量产时选择最慢的低格. 自动把坏块剔除,只剩下700多M.

量产工具的操作界面:


最后用MyDiskTest测试一下,没有问题.
在反复难试验量产过程中,有一次量产完成后主机不能识别usb设备了. 也就无法重新量产. 于是在网上又找到解决办法:
短接D0-D1, 然后上电,主机又能正常识别到usb设备. 然后去掉短接,就能正常了. nand flash的管脚图:

Monday, January 05, 2009

HTC touch diamond 功能试用

好早以前就想换手机了,可惜选择太多,挑起来太费心. 于是某天心血来潮,随便在网上看了个帖子,就定下来买 HTC touch diamond. 在08年的最后一天买了回来.
先给大家看看样子:

正面:

背面:

以下是使用心得:
========================
主机控制touch diamond
========================
掌智助手setup.rar:
http://www.52dopod.net/thread-110688-1-5.html

========================
电话
========================
显示号码归属地:
安装来电精灵0.98正式版:http://www.52dopod.net/viewthread.php?tid=142229&highlight=%C0%B4%B5%E7%BE%AB%C1%E9
作一些配置:
以来电精灵为例:

1. 设定“首选项”,中去电归属地,开机自动运行,显示托盘等

2. “规则列表”对“联系人默认”,“陌生人默认”,进行配置,注意“显示皮肤”选项,一定要勾上

另外还要关闭系统自带的电话皮肤:
方法见帖子:http://www.52dopod.net/thread-163733-1-3.html

========================
多媒体
========================
corplayer1.25:播放器
http://www.52dopod.net/viewthread.php?tid=110662&highlight=%B2%A5%B7%C5%C6%F7
测试了352*288 25f/s xvid的视频,能流畅播放.

========================
游戏:
========================
Resco Bubbles: 重力感应滚小球的游戏
http://www.resco.net/pocketpc/bubbles/default.asp

========================
摄像头:
========================
QuickMark:二维条码扫描软件
http://www.resco.net/pocketpc/bubbles/default.asp

========================
输入法:
========================
我买的这个版本只带了拼音和马兰花输入法
梅花点讯输入法
http://www.52dopod.net/thread-110139-1-7.html

========================
wifi
========================
浏览器里无法实现用wifi上网. 要测试wifi,可以使用touch的远程桌面共享功能.
主机这边配置开启桌面共享:
1.建立一个远程控制的用户
2.右键我的电脑,选择属性,在弹出窗口选择'远程'选项卡。
3.勾选远程桌面下的允许用户远程连接到此计算机。
4.单击'选择远程用户'来配置可以使用些项功能的用户.
5. 关闲防火墙或正确配置防火墙.

touch:
启动远程桌面mobile程序,输入远程机IP地址,用户名来连接.

Sunday, January 04, 2009

手机软件开发平台介绍

一直对手机开发流程有兴趣, 上网找到点东西.  贴出来用于备忘.
Android是java开发平台.  Windows mobile  是.net 开发平台, 也支持直接交叉编译,所以其所带的模拟器可以实现指令级模拟.

What is Android?

Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This beta version of the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.

Windows Mobile is a platform for mobile devices based on Windows Embedded CE, and used in a wide variety of third-party hardware such as personal digital assistants (PDAs) and smartphones. Visual Studio and the Windows Mobile SDK make it possible to create software for the Windows Mobile platform in both native code (Visual C++) and managed code (Visual C#, Visual Basic .NET).