2009年6月25日星期四
2009年6月6日星期六
据四川质量报2006年4月10日报道:“成都很多窗户封闭的空调车上都没有救生锤,一旦遇到紧急情况(如突然发生火灾),势必将造成悲剧和极大的损失!”接读者打来的热线电话后,记者全面调查———
【点题】:
2006年3月1日下午1点左右,一辆由四川射洪开往深圳龙岗的客车在南(宁)梧(州)高速广西横县六景镇甘棠河大桥横县方向100米处突发大火,车上42名乘客(含3名小孩)除17人成功逃生外,烧伤8人,死亡16人。“要是当时有足够的救生锤,就不会有那么多无辜的生命葬身火海!”一位幸存者回忆说。
如此重大的安全事故,再次为我们敲响了警钟。长途客车如此,市内公交车又是怎样的呢?
近日,记者调查了成都市38路、61路、34路、62路、27路、56路等线路的20余辆空调车,发现这些车窗封闭的空调公交车上,乘务员大多不知道什么是救生锤,而且大部分空调公交车的“救生锤”都只剩下了一个空架子,上面悬挂的救生锤早已不知去向。
2009年6月4日星期四
2009年6月1日星期一
2009年5月26日星期二
穿墙上Blogger
Fuck GFW!!!!!!!!!!!!!! 真是穿墙骂了隔壁的。真郁闷。把blogspot和blogger一起封掉了。 马上2^6了,看来敏感期要来了。封吧,封死你们这些老王八蛋。
2009年5月13日星期三
公平,公正。不是公关!
看到网络上很多关于70码的评论,有一个争论的点,就是仇富。这真是很奇怪的一件事情。我觉得大部分网友并不是仇富,而是仇不平。因为在中国,几乎可以想象的就是接下来的公关以及背后的操作。因为什么,屁股不干净啊。不但不干净,还不敢脱下裤子。ZF公关这本身就是一个悲凉的事情。
公平,公正。不是公关!
2009年5月12日星期二
需要反思一下自己
越是忙的时候,越容易陷入“自己到底在做什么”的疑问之中。的确,和很多朋友一样,对很多充满抱怨,对所做的事情感到烦躁,乏味。然而却又非常的忙碌,把大好的时光浪费在很多无意义的事情上。可是却无可奈何。
我也没办法那么潇洒,随便就放弃眼前的生活,换一个城市,换个环境又开始。26了,开始步入中年,总不是只为自己生活。可是我真的失去了目标,茫然不知所措。我甚至买了基础科的教材,开始补课。可是下班后又感觉很累而无法继续看书。曾经说,不图什么这个那个,要的是快乐。随心随性。可是现实就是现实。现在所能做的,只有一边像机器一样运作,一边使劲查找自己的目标。每天上午打开机器,可是过一会,看看右下角,竟然是下午了。
我曾经的理想是做一名程序员,为此努力了很多年,走了很多弯路。的确,做一个真正的程序员,是很难的。曾经也猜测,Coding应该是个工具,功夫在之外。现在发现这个猜测基本是正确的。只是很难逃脱coding时堆砌一些东西所带来的快感。
我应该反思自己,我是否应该准备去应对突破自己的挑战。可是如何去做呢,到底什么是目标呢,快乐吗?
2009年5月10日星期日
2009年5月1日星期五
2009年4月25日星期六
ARM Linux的一些片段(一)
因为工作原因,对这个部分有接触。平时看代码和一些文档的细节感觉过段时间就忘记了。所以要做个记录。可能其中还有错误。吧一个对人很有启发的记录下来。不过这些内容很零散,平时也是需要才看。以下说的arm是支持mmu的arm9以上.
Linux支持三级页表,作为其默认的页表结构。ARM是两极页表。PGD和PTE。从pgtable.h里面可以可以看出一个work around的实现。PGD和PTE并不是直接对应ARM硬件的页表目录项。而是做了一些为了linux上层的要求的一个方案。首先,他把4096个pgd项变成2048个,物理上还是一个pgd指向一个256个pte项的数组的,这没办法改。但是pgd指针逻辑上合并成一个,各自指向的的pte数组也合并。并且是连续的。
pgd pte 57 * | | 58 * +--------+ +0 59 * | |-----> +------------+ +0 60 * +- - - - + +4 | h/w pt 0 | 61 * | |-----> +------------+ +1024 62 * +--------+ +8 | h/w pt 1 | 63 * | | +------------+ +2048 64 * +- - - - + | Linux pt 0 | 65 * | | +------------+ +3072 66 * +--------+ | Linux pt 1 | 67 * | | +------------+ +4096 以上内容摘自Linux ARM pgtable.h, GPL.这512个pte项合并起来,这个pte分配的页(一般linux需要一个pte表在一个页里,代码注释也写了)还剩下一半的内容,刚好可以存放arm不支持的一些标记(Linux pt 0, 1),而这些标记是linux必须的,比如dirty。这个方案还非常具有可扩展性,不依赖arm本身的标记。dirty标记的实现是通过对arm支持的权限fault的中断来写这个标记。这样方式是相当于一种模拟。
对于不同cpu版本,set_pte的实现是用宏##拼的函数,这些函数不再arch/arm/kernel而是arch/arm/mm里面,找个v6的实现里面可以看到实现:(这段代码上面的一段注释不知道是不是写错了, ptep - pointer to level 2 translation table entry (hardware version is stored at -1024 bytes),明明是2048个字节,代码也是,也许是我理解错)
这里就看到先偏移2048个字节找到“真的”pte做事。
ENTRY(cpu_v6_set_pte) 154 str r1, [r0], #-2048 @ linux version 155 156 bic r2, r1, #0x000003f0 157 bic r2, r2, #0x00000003 158 orr r2, r2, #PTE_EXT_AP0 | 2 ... tst r1, #L_PTE_PRESENT 176 moveq r2, #0 177 178 str r2, [r0] 179 mcr p15, 0, r0, c7, c10, 1 @ flush_pte 180 mov pc, lr关于ARM的模式,arm本来有7个模式,而linux只有两个user和kernel。于是Linux的实现就把包括中断处理模式页转到同一个模式下做事,就是arm的所谓超级用户(svc)模式,实现这个的办法就是改写备份寄存器spsr为svc的模式,然后movs pc到svc模式,然后再调用处理函数,这样除了用户模式其他的模式执行环境都是同一个模式了。
感觉选择svc模式作为kernel也是很自然的,swi一看就是用来做系统调用的,直接进入svc模式。
这段代码是在宏里面,然后根据不同模式进行展开在头部。
.macro vector_stub, name, mode, correction=0 885 .align 5 886 887 vector_\name: 888 .if \correction 889 sub lr, lr, #\correction 890 .endif 891 892 @ 893 @ Save r0, lr_另外,对于不支持高向量的arm,因为中断向量表从0开始,所以需要把第一页保留,不作为用户空间。(parent PC) and spsr_ 894 @ (parent CPSR) 895 @ 896 stmia sp, {r0, lr} @ save r0, lr 897 mrs lr, spsr 898 str lr, [sp, #8] @ save spsr 899 900 @ 901 @ Prepare for SVC32 mode. IRQs remain disabled. 902 @ 903 mrs r0, cpsr 904 eor r0, r0, #(\mode ^ SVC_MODE) 905 msr spsr_cxsf, r0 906 907 @ 908 @ the branch table must immediately follow this code 909 @ 910 and lr, lr, #0x0f 911 mov r0, sp 912 ldr lr, [pc, lr, lsl #2] 913 movs pc, lr @ branch to handler in SVC mode 914 .endm