| Solrex's profileSolrex Shuffling.LifeBlogListsNetwork | Help |
|
3/26/2007 Out out out想那帮兄弟了,最有机会玩的时候我却在异乡的异乡折腾,FFFF 决定了,五一回家过,过完回南京 发现最近很无聊,禁网几天,除了查资料收邮件不做其它事,我倒看看能不能忍住 Sun Chan 说颐和园的花很漂亮,有空得去看看 祝小力复试顺利,还有所有我认识的要在这几天痛苦的,上帝和菩萨保佑你们 罗嗦这么多,其实就想说我得有段时间不写了 bye 3/24/2007 Protean Life今天小力姐来动物所复试,12 点半到的北京。两年多没见了,没觉得样子变很多,只不过见到老朋友有一种说不出的感觉。我还是比较喜欢那种与世无争自成一统的生活,对竞争虽然并不害怕,但很讨厌,因之也很讨厌考试,一次次地把人摆在十字路口。看到别人要受这种忐忑之苦,心中也是极度烦闷。又想起第一次去北大,坐上离开的公车时,看着老朋友远去的身影,对次日复试结果的不可知,难受至极。什么时候能再无此感觉啊? 上周天宝兄弟来地理所实习,正好在北航北面的郭林请他吃饭,吃完了顺路到来复试时候住的招待所看了看,拍了几张照片。虽然地方很差,不过,可以说是我的福地了。今天和小力分开后也顺便到动物所临近的鸟窝附近拍了几张照片,很累,不想再一张一张贴了,有兴趣看的点这里: http://picasaweb.google.com/solrex/RandomBeijingImage blogspot 又被伟大的中国信息长城给封了,只好把 http://blog.solrex.cn 重定向到了 space,看来当初决定同时在两边发文还是明智的。我想有自己的独立空间了,其实配置 wordpress 根本不是问题,我在自己的主机上配置比较过很多博客,域名也有了,再买一个空间而已,只是我真的懒于去自己维护一个博客系统,现在仍然是,不过 GFW 真的是有点过分,有空了再考虑考虑吧。 低潮期,强颜欢笑中。 3/16/2007 Thesis And Others(之所以在标题总包括英文,是因为我不喜欢 blogspot 把我的日志链接变成 blog-post_nn.html。) 最近写字很痛苦,像是强迫症一样,不想写,但养成的习惯又觉得不写少点什么,还是记下点东西好些。主要的原因是没有静心的时间和空闲,上班,下班,有时候周末也会来公司做些事,大概是无聊吧。本身也不是很喜欢闹腾的场景,在学校时候还有一群哥们在一起扯,现在基本无语了。除了工作的交流,一天没多少话,对于我这种话多的人,实在是一种痛苦。 论文算有眉目了,本来因为觉得 GDB 移植和数学没什么相关,而研究生读网络安全,想做一些密码学的东西,但吴老师说,既然做了很多工作,也比较深入了,就写 GDB 的移植和原理吧。后来在网上搜到一个上交大的计算机硕士发在国内一个叫《计算机工程》杂志的论文,讲的是 AS 的移植,人家硕士还发这种论文,我本科论文写个 GDB 移植看来也不是很掉价。工作已经完成了,而且完全是我自己做的,写下来基本没什么难度,我还顺便尝试一下用 SVN 来维护论文的版本,tex 文件也是文本,除了中文编码问题,和程序文件也没什么区别。 最近也比较忙,公司的两种芯片都是 Multi-Core 的 RISC CPU,老板一直想要一个支持多核的调试器,但是现在很多对多核的调试机理都是多个调试器对应多个核。我本来想用一种cheat的方法来实现专注于单核但可切换多核的功能,就是在 GDB 的角度来看是单核的,但实际上可以运行时切换到另外的核上。这个工作量应该不大,但这样会有一些问题,比如 break point 只能实现在一个核上。项目经理想得非常好,他希望 GDB 能 load 多套 symbol fie,而且能同时控制多个核。谈何容易啊,要能做那帮 GNU 的 MAINTAINER 们早就做了,有很多 mail 讨论这个问题的,但一直没有一个有效的机制来描述多核,因为多核的情况太复杂了,有各种各样的实现方式。不过具体到某种体系结构来说,并不是不可能实现的,IBM 的一个工程师就说他们实现了 SPU 和 PPC 的双核调试。GDB 是不可能根据某种特定情形修改自己的,它必须到有一种数据结构描述能够兼容大部分多核 CPU 时候才会更改自己现有的架构。我不知道这个 hacking 的工作我能不能做到,但恐怕在回学校前是做不完的了,只有等读研究生时候来北京再接着做了。现在正在疯狂地读代码中,移植的时候只需要考虑 back-end 的东西,像 symbol, breakpoint 啦根本不用管,这会儿也得看了。 也有一件很不爽的事,看到一个人在博客里理直气壮地说自己从来不给应聘者回拒绝信,而且还非常鄙视应届生。唉,还是 JavaEye 的资深会员,以前 JavaEye 的资深会员在我心中是多崇高的地位啊,现在看来某些人也就 just so so。而且他在 JavaEye 的博客上的评论基本上一片赞成声调,我不知道是不是我错了,难道出于礼貌回一封格式固定的拒绝信就那么难吗?难道非得让应聘者享受等待的痛苦就那么让人开心吗?JavaEye 上基本上都是大老,这些大老们都会这么看待问题,那么中国的公司做不过别人也是可想而知了。其实从我的应聘实习生经历来看,虽然不多,但是大公司都会给拒信的,我收过 Unilever 的拒信,Google 的拒信,Microsoft 的拒信。小公司也有几个,不过小公司给拒信的真不多,我记得只有一家做 Java 报表的公司给过拒信。没收到拒信真的没什么,我会以为公司 HR 比较忙,或者邮件服务器有问题,或者其它种种问题,但是如果我知道一家公司的 HR 理直气壮地说我就懒得给你拒信,我真的是对这家公司很反感。三十年河东,三十年河西,公司和 HR 把自己当爷,总有一天会有人让你们自己拿自己当孙子的。一个人能力有问题没什么,但做人有问题就会让人厌恶了。 顺便再说一个趣事,我也当了回神童!公司的一个同事那天和我聊天,问我硕士论文什么题目,我就纳闷了,我是本科啊。结果知道他一直以为我是硕士,还告诉他同学,我们公司有一个20岁就硕士毕业的实习生,笑死我了。 SVN you should knowSVN 是 Subversion 的缩写,一个开源的版本管理工具,类似于 CVS 和 Visual Studio 的 Source Safe。不过据它的作者称是因为忍受不了 CVS 的缺点所写的,可能会比 CVS 表现好一点,因为我只有在 check out 某些开源代码时候才会用到 CVS,并不经常,所以只是猜测。不过肯定是比 Source Safe 表现要好,因为两者的理念是不同的,Visual Source Safe 管理小型项目还可以,是不适合管理多用户的大项目的,再说,Source Safe 也只能在 VS 里面用,而 SVN 的客户端有 Linux 和 Window 的版本。顺便提一下的是,WIN 下有种最流行的 SVN 客户端就是集成在右键菜单的一个小乌龟,很有意思的。 SVN 有非常好的使用文档,相比其它的开源项目来说,SVN 的中文化也做的很好,有专门的中文站,可以搜一下。SVN book 介绍的相当全面,但是,读完那么长的文档也没有必要。我这里就介绍一些常用且是最常用到的命令(Linux 下,Win 下就不说了,都是 GUI 操作)。 建立版本库:svnadmin create /data/svnpool 这是指定版本库存放的位置,貌似必须是一个绝对路径,建立好以后里面会建立起一些配置和数据库的文件。 指定编辑器:export EDITOR=vim 因为每次的版本操作都要添加一些信息在 log 里,把 EDITOR 放在环境变量里可以使用自己熟悉的编辑器来编辑这些信息。这句话经常放在 .bashrc 里。 导入项目:svn import file:///data/svnpool 在当前目录下的所有目录和文件都会导入到版本库里。 列表查询:svn list file:///data/svnpool 一般情况下都要先查询一下某个目录存在不存在才去导出。 导出项目:svn co file:///data/svnpool/project 这时候会在当前目录下建立一个 project 的目录,里面存有 SVN 的信息。 更新项目:svn update 使当前目录下的所有文件和目录版本与版本库中保持一致。 查看不同:svn diff 查看当前目录下的所有文件和目录与版本库中有那些不同,也可以加上版本参数 -r revision1:revision2 查看两个版本有什么不同。 添加文件和目录到当前项目:svn add subdir/file 把当前目录下的 subdir/file 添加到当前目录对应的项目中去。 删除、移动或复制当前项目中的目录和文件: svn rm/mv/cp ... 把某个文件或目录更改名字、复制或从版本库中删除。 提交更改:svn commit 把更改后的文件提交到版本库中形成新的版本。 在初始导出和导入的时候,可能需要给出 URL,主要有几种格式,file:///, http://, svn://, svn+ssh://user@host。当项目已经导出时候,就不需要打路径名了,有可能需要密码,如果验证的话。 这些是最常用的命令,像其它的一些命令,比如 merge 之类的,用到时候再查 svn book 和 man page 也不晚。版本控制很有用的,比如自己平常写的代码,放到版本库里就比较好查询和撤销修改,而不用每次都保存个备份。而且增量修改时当代码发生错误时候可以很快定位更改在哪里,找到错误原因。其实所有文档都可以放在 SVN 库里的,只是某些文件类型不好做 diff 罢了。 3/13/2007 貌似 Picasa 也防盗链才发现把 picasa Web 相册中的 image location 放在 blogspot 是看得到的,在 spaces 里是看不到的,在百合也是看不到的,除非你在浏览器中打开过这些图片,浏览器中有缓存才可以看到。看来 google 也并不想别人分享它的流量,不过比百度好一点的是只是不显示图片而已,没有再给显示出来一个大叉,上面写着"这是百度的",NND。我不知道是不是我的环境问题,如果真的 picasa web album 有防盗链措施的话,我只有舍弃它了。不知道别的相册怎么样,已经注册了个 flickr,没时间用,有空再说吧。
在 space 上看不了图片的可以暂时先访问相册:http://picasaweb.google.com/solrex/RandomBeijingImage ,或者到 blogspot 的博客。 3/11/2007 Random Beijing Image 4
ALBUM: http://picasaweb.google.com/solrex/RandomBeijingImage 3/10/2007 Adding a New Target to GDB (3)为 GDB 添加新的目标机 (3) 本文遵从 GNU Free Documentation License (see http://www.gnu.org/copyleft/fdl.html ),并特别对 冒充另类(TeaWater) 的《移植GDB》一文表示感谢 (see http://teawater.spaces.live.com )。由于大体和细节的东西在《GDB Internal》和《移植 GDB》两文中已经有了很多描述,所以本文的目的在于 Howto,step by step 地描述如何为 GDB 添加新的目标机,并对某些以上两文中阐释不清的地方做出自己的解释。 3. taget dependent 文件补充说明 其实关于 solrex-tdep.h, 和 solrex-tdep.c 文件中所涉及的函数, TeaWater 的《移植 GDB》一文讲得非常清晰,我也没必要重复,我只对一些他没提及的东西做一下解释。 (1) solrex-tdep.h 中应该放些什么 其实这个主要是根据需要,如果一些东西会被别的文件使用,那就放在这里,如果没有,这个文件甚至不需要。当然,一些应该放在头文件中的东西还是放这里比较好。 (2)关于 struct gdbarch_tdep 这个结构体是用户定义的,最重要的使用也是在这两个文件中。可以根据需要增减,一般的话需要几个:registers map,重要的 register number,然后就是 abi 的东西。只要用户觉得某个东西有用,就可以放在这个结构体里面。 (3)关于 pseudo registers 这个东西主要看编译器的实现,如果编译器就根本没有这些东西,没有必要处理这些东西。 (4)关于 unwind_pc 不要被它的名字迷惑,unwind_pc 所起到的作用原理很简单,返回一个位于(参数 next_frame 的上一层 frame)中的地址,一般情况下就是这个函数的返回地址。因为函数的返回地址一般就是对这个函数调用的汇编指令的下一个指令,GDB 内部会把这个返回地址再减去一个指令长度,这样就回到了函数调用那句话,函数调用肯定位于被调用的函数的上一个 frame 中。但是有两种情况你需要考虑,如果 next_frame 是一个 sentiniel frame, 只需要返回当前 pc 的位置,如果是一个 normal frame,就需要返回这个 frame 的函数返回地址。这个具体怎么做需要看特定的 target,比如 mips 很简单,只是把 pc 给它,但不是所有的 target 都是这样的。只需要看一下汇编代码就知道该怎么做了,一般情况下进入一个函数,首先是把移动 sp, 给这个函数留出一段栈地址,然后是把 ra 压栈。但是有时候也不完全这样,假如 ra 不是 GPR,不能直接存入栈中,只能先放到一个 GPR 中然后再把那个 GPR 压栈。 之所以要讲到上面的例子就是因为,GDB 的逻辑是这样的:告诉他要 unwind 哪个 register,它会先调用注册的 frame_prev_register 函数去找这个 register,很多情况下 target 都是先注册 dwarf2 的 dwarf2_frame_prev_register。这个函数会根据 debugging information 中的 FDE 和 CIE 去找这个 register 是放到哪里了,然后去那里找到这个 register 的值。但是这个函数有个缺陷就是,假如把一个 register 放入另一个 register 中,它只会到下一层的 frame 中去找那个 register,这样在上段说的最后一个例子,就会出现错误,因为被存入的 register 只是做一个中间值的用处,它会把自己压到栈中,而 dwarf2_frame_prev_register 到下一层的 frame 中去找它的值,显然不可能得到正确的结果。 (5)关于注册特定的 frame_unwind_append_sniffer 有没有用 在很多情况下,尤其是在 linux 的编译器都会为 ELF 文件加入 DWARF2 格式的 debugging information,所以很多情况下用户注册的 frame_sniffer 都是没有太大用处的,但是如果不注册也会发生问题。因为 GDB 中 DWALF2 的处理是先找 symbol 里对应于这个 pc, 有没有 FDE,如果有 FDE 就采用 dwarf2 的 frame sniffer,如果没有就采用用户另外注册的 frame sniffer。如果用户没有另外注册 frame sniffer 的时候,GDB 会出现 internal error,而当注册了以后,GDB 内部会在二进制文件中找这个 pc,如果找不到,会返回用户不知道现在位于什么位置。所以,当二进制文件中有 debugging information 时候,再注册特别的 frame sniffer 只是为了不出现 internal error。因为当 pc 正确时候,自然有 dwarf2 处理,当 pc 不正确的时候,GDB 也不会使用用户定义的 frame sniffer。用户定义的 frame sniffer 唯一有用的时候就是二进制文件中没有 debugging information,这样 GDB 会调用用户定义的 frame sniffer 来找 frame 的开始位置,栈分布和 register 的处理。 (6) gdbarch 中那么多东西,应该注册多少 我觉得,至少应该告诉 GDB 的是: info.byte_order, tdep, num_regs, sp_regnum, pc_regnum, stab_reg_to_regnum, dwarf2_reg_to_regnum, register_name, register_type, skip_prologue, inner_than, unwind_pc, call_dummy_location, unwind_dummy_id, push_dummy_call, print_registers_info, print_insn,然后再加上注册一下 frame_unwind_append_sniffer 和 frame_base_append_sniffer 就行了,剩下的就要看各个 target 的特性,需要不需要添加了。 唉,写了以后才发现自己没多少可写的,因为每个函数的用处 TeaWater 的《移植 GDB》中都讲到了,而要是真 step by step 地写,工作量也太大了点,算了,就这样吧,其实很多东西是只有到用的时候才知道哪里会出现问题的。不过用 GDB debug GDB 也是一件很有趣的事情。 Adding a New Target to GDB (2)为 GDB 添加新的目标机 (2) 本文遵从 GNU Free Documentation License (see http://www.gnu.org/copyleft/fdl.html ),并特别对 冒充另类(TeaWater) 的《移植GDB》一文表示感谢 (see http://teawater.spaces.live.com )。由于大体和细节的东西在《GDB Internal》和《移植 GDB》两文中已经有了很多描述,所以本文的目的在于 Howto,step by step 地描述如何为 GDB 添加新的目标机,并对某些以上两文中阐释不清的地方做出自己的解释。 2.对所需添加进 gdb 目录的文件的功能介绍 这部分和 《GDB Internal》中的 9.12 Adding a New Target 一部分是重合的,不过我添加一些实例和自己的介绍。 'gdb/config/solrex/solrex.mt':这个文件里的东西会添加到 Makefile 里面,很简单,给个例子: $ cat gdb/config/solrex/solrex.mt TDEPFILES= solrex-tdep.o DEPRECATED_TM_FILE= tm-solrex.h 第一个就是要编译 solrex 的 target 需要的文件,solrex-tdep.o 是下面要讲的 solrex-tdep.c 的目标文件,还可以加一个 TDEPLIBS= ,意思是需要的 lib。 DEPRECATED_TM_FILE= tm-solrex.h 的意思这种做法已经 deprecated 了,但是我们仍然可以使用,是 target 所需要的头文件,下面会讲到这个文件,但是这个文件如果没有的话可以不要。 'gdb/config/solrex/tm-solrex.h':这个文件里可以定义一些通用的宏,给个例子: $ cat gdb/config/solrex/tm-solrex.h #define GDBINIT_FILENAME ".solrex-gdbinit" #define DEFAULT_PROMPT "(gdb-solrex) " 第一个是 GDB 启动时候的默认读取文件名,第二个就是 GDB 的缺省 prompt。这个头文件会变成编译时候的 tm.h 文件,这些宏定义会覆盖 GDB 的本身设定,当然,如果你不需要这些宏完全可以不要此文件。 'gdb/solrex-tdep.h' && 'gdb/solrex-tdep.c':这两个文件是最重要的文件,也是 GDB 能够识别 solrex-elf 这个 target 的根据,这两个文件中定义了很多 solrex arch 特定的东西,比如:target 是 big-endian 还是 little-endian 的?target 的 registers map;target 的字长,register 的类型,返回值的存放,等等等等,这些后面的文章都会仔细介绍,也是主要介绍的部分。 Adding a New Target to GDB (1)为 GDB 添加新的目标机 (1) 工作基本结束,留下些文字,希望能对别人有些用处。本文遵从 GNU Free Documentation License (see http://www.gnu.org/copyleft/fdl.html ),并特别对 冒充另类(TeaWater) 的《移植GDB》一文表示感谢 (see http://teawater.spaces.live.com/ )。由于大体和细节的东西在《GDB Internal》和《移植 GDB》一文中已经有了很多描述,所以本文的目的在于 Howto,step by step 地描述如何为 GDB 添加新的目标机,并对某些以上两文中阐释不清的地方做出自己的解释。 为 GDB 添加新的目标机的意思就是让 GDB 支持一个新的 CPU 体系架构。这点从 GDB 的编译选项中可以看出来,在./configure 命令后有一个 --target= 的选项,这个等号后面就是 GDB 调试的二进制文件应该在什么目标机上运行,可以是: mips-elf,arm-elf 等等,在 config.sub 文件中你可以看到这些选项是如何工作的。 下面我们假设要添加的新 target 为 solrex-elf。 1.如何配置编译环境 当你为一个 GDB 添加 target solrex-elf 的时候,至少需要让 GDB 在 configure 为 solrex-elf 时候能够编译通过,为此你需要添加和修改一些文件。 GDB 其实由很多部分共同组成,GDB 源文件目录下有几个目录,bfd 目录下是 LIB BFD (Binary File Descriptor Library),opcodes 目录下是 opcode library,这两个 library 都是跟随 binutils 分发的; libiberty 目录下是 libiberty library,它给许多 GNU 软件提供一些通用的子程序,好像是跟随 gcc 分发的;readline 目录下是 readline library,提供一些命令行功能,比如<tab>补全,它好像是独立分发的;最关键的 gdb 目录,这个下面才是 GDB 的主体。 是想让 GDB 编译通过,不能只修改 gdb 的东西。要调试程序,必须要有先编译出来二进制代码,所以对 BFD 和 opcodes 的修改应该是最早的,binutils 依赖这些库来编译出来二进制工具,比如ar, as, ld, objdump, readelf 等,然后 gcc 利用这些二进制工具把它编译出来的汇编码最终组合成目标文件和可执行文件。 但是,在某些阶段,比如编译器尚未完善之际,可以先 cheating GDB,就是拿来一个已有 target 的 BFD lib 和 opcode lib,修改成自己的 target。 下面是要编译 target=solrex-elf 需要修改的文件: Key source files: gdb * gdb/config/solrex/tm-solrex.h: New file. * gdb/solrex-tdep.h: New file. * gdb/solrex-tdep.c: New file. bfd * include/elf/solrex.h: New file. * bfd/cpu-solrex.c: New file. * bfd/elf32-solrex.c: New file. * bfd/archures.c: New arch. * bfd/bfd-in2.h: New arch. * bfd/targets.c: New target. opcodes * opcodes/solrex-dis.c: New file. * include/dis-asm.h (print_insn_solrex): New function. * opcodes/disassemble.c (ARCH_solrex): New arch. Config files: gdb * gdb/config/solrex/solrex.mt: New file. * gdb/Makefile.in (solrex-tdep*): New target. * gdb/configure.host (solrex*, solrex*-*-elf*): New target. * gdb/configure.tgt (solrex*, solrex*-*-elf*): New target. bfd * bfd/config.bfd: New target. * bfd/configure.in: New target. * bfd/Makefile.am: New target. opcodes * opcodes/configure.in (bfd_solrex_arch): New target. * opcodes/Makefile.am (solrex-dis*): New target. general * configure.in (solrex*-*-elf*): New target. * config.sub (solrex, solrex*-*): New target. * readline/support/config.sub (solrex, solrex*-*): New target. Auto Generated files: * configure (solrex*-*-elf*): New. * bfd/configure: New. * bfd/Makefile.in: New. * bfd/doc/bfd.info: New. * opcodes/configure (bfd_solrex_arch): New. * opcodes/Makefile.in (solrex-dis*): New. 上面列出的是想成功编译出 solrex-elf target 需要修改的最少的文件。至于如何修改 config 和 makefile 文件,只需要查看一下某个特定的 target,比如:mips,或者简单点的 xtensa,就知道该怎样改了。 在 bfd 和 opcodes 里的文件不是这篇文章中讲的重点,想 cheat GDB 最简单的办法就是把另外一个 target 的名字,比如:mips, xtensa 全部换成 solrex 就行了,使用另一种 target 的 binary file descriptor 会影响 GDB 的某些功能而不是全部。 3/9/2007 Let People Continue To Have Confidence In The Future今天看了柴静的一篇文章《我和你都深深嵌在这个世界当中》:http://blog.sina.com.cn/u/48b0d37b010008g2,有些惭愧。大概是因为所涉及的层面问题,柴静在博客上一直都是那种弱势群体的维护者,对社会黑暗面的揭露者,写着一些带着强烈情感的文字。 虽然受儒家文化浸染已久,对自己的评价也认为是儒生的成分居多,但那种为天地立心,为万民立命,为往圣传绝学,为万世开太平的责任感却往往只是瞬现瞬逝。 也许是见多了人情世故,受到 social Darwensim 影响太深。在崛起中的中国,无论哪里都是适者生存,不适者淘汰,没有人去可怜失败者。念书时的考试,找工作时的竞争,无一不提醒着我让 自己更强。前几天获鼎兄的博客不还在说:"07年的春节,无论如何也是戏剧性的一年。这个家庭在家族中的地位也发生急剧的变化,十几年没上门的亲戚出现在 简陋的客厅里面,昔日欺负我、藐视我的同学居然主动过来称兄道弟。真是倍感世态炎凉,又觉大快人心。"这种情况我又碰到过多少次?所以在我的骨子里就有一 种信念,可以说是一种成为人上人的强烈欲望,因此也就把自己的理想全放在了个人的成就上了。 但无论如何,这种情况我会试着去改变的,一种病态的信念会阻碍个人道德的完善。呵呵,又想起了《万历十五年》对明代道德观的描述,真是精辟啊!中国人的信 念就是以德立国,不是还有不战而屈人之兵的说法吗?但是自从近代饱尝苦果之后,反而对弱肉强食这句话理解得更深刻,动辄就是弱国无外交,和平崛起,在教材 中也对达尔文的一套理论奉若圭皋,大部分人失去了把中国建设成为一个好国家的兴趣,所有的目标都是让中国更强,让中国再不受凌辱。人生和国运其实很像的。 很喜欢她文章里的一句话:"其实,我们在做着同一件事,让人们对明天继续有信心。"我有机会去从事这样的事业吗? 3/8/2007 Boy, what is your future?最近好累,没完没了的调试,对GDB做了几遍 checking test,好多 fail 。只能 一个一个去找,却发现基本上是在给 compiler 做测试,基本都是因为 debugging information 的不完全还有 compiler 的优化。因为都是底层问题,只能 dump 出 来 assembly code 和 debugging information,一点一点的去找,看得我视力急剧下降。 工作是基本熟悉了,只是发现自己的很多问题又浮现出来。在保送研究生之前的大学生活大部是一段焦虑期,那种对未来的不可知和眼界的狭小让自己很惶恐。保完研,顺利找到实习以后基本上算进入了一个安静期,如果不算情感上波动的话。很欣欣自得于自己的状况,学业暂时无忧,经济暂时独立,工作也算理想,于是乎毫无念想去考虑其它。 现在应该是大四下学期了,前日系里开班会,我也没打听消息,无外乎是毕业论文和学期安排,大概还有毕业委员会的事情吧。这个世界离了谁都转,我这个小年级长在不在也没所谓。只是想到毕业论文,才觉得自己浪费的时间不少了。上个学期曾兴致冲冲地去找吴朝阳老师要求跟他作毕业论文,老师也给我指了两个方向。可惜的是,我把论文看得太轻了,只顾花费时间在一些别的事情上,告诉自己,还有时间,还有时间。 其实现在来说,我也不担心论文通不过的问题,本科论文也不会有太大意思。我是在怀疑自己有没有研究能力,独立思考的能力,到底适合不适合做科研。我丝毫不怀疑自己的行动力,但是我知道自己有很大缺点在意志力和创造力上。从小到大的人云亦云,从小到大的好学生,我对自己所学过的东西一片茫然,对自己要做的事情也无甚了解,我实在不知道自己选择学术这条路是对还是错。读研,我能读出来什么吗? 我不知道自己这种对能力的怀疑是暂时的还是永久的。不过我想这种情况也应该不只在我身上出现,地质大师许靖华在自己的自传中也写到在刚到美国开始自己的学术生涯时候也是不知所措,谁知道未来是怎样呢?我只是觉得自己对数学的兴趣不大,对计算机的兴趣也是一般,严格的来说,我没觉得什么学科对我来说有很大吸引力。高中的时候,倒是挺喜欢生物的,现在来说也了了了。一个对学术没有极大热情的人去从事它,会变得喜欢上吗? 其实说到了,可能还是功利心太强了,但是,这个世界允许我没有功利心吗?我没有那个条件去淡泊名利。 3/7/2007 Scim comes back哈哈,我的 Ubuntu(feisty)能输入中文字了,虽然 Kmail 里还是不能显示所有中文字,但编码是没有问题了的。不能用诡异,能用也诡异,我什么都没 做,就过了几天登录ubuntu,不小心点到了ctrl+space,惊喜地发现scim弹出来了,开心开心。 我要搬到Ubuntu下工作了,要享受beryl带来的快感了。 Random Beijing Image 3
3/5/2007 Random Beijing Image 2
3/3/2007 RSS List Sharing Movement @ Rainy Day北京不可多得的好天气,蒙蒙细雨,三个月来第一次见到 本打算找个公园转转,早起的小雨打乱了我的计划 去北航里的工行给小黑打完我的奖学金税,便又踱步到公司了 灯都没开,一个人都没有,似乎没人愿意在雨天里到公司加班 摁亮显示器,进入 SUSE,检查一下 Kmail,仿佛又无所事事了 打开 Firefox,又开始我的程式之旅: lilybbs, blogspot, WLM space, google reader 今天忽然想到,许多未订阅的朋友的 blog 好久不曾逛了 于是乎,从 link list 中一个一个点入 然后一个一个加到 google reader 的 rss list 中 我的 link list 一直在加长, rss item 也在增加 有个冲动,想发起一个 share rss list 的运动 让大家把订阅的 blog 列表用XML或OPML文件格式共享出来 不过那样会泄露很多隐私的 当然了,可以有选择的共享 不知道有没有人欢迎? 脱离了 windows 系统之后,msn 上的小星星也看不到了 只能通过 rss reader 刷刷刷 加之也离开了南京 所以 google reader 就成了看别人生活的窗口 进入大四以后,几乎所有人的博客更新都放缓甚至停止了 互相之间的访问也少了 我又换了 BSP 也不知道有多少人会看到这篇 blog 我把我的 RSS 订阅列表 opml 文件放到了博客主页面右侧的最下 链接名为:Solrex is reading... 我会不定期的更新这个文件 你可以查看我正在阅读哪些人的博客,并把它加到你的阅读列表中 也可以把这个文件导入到你的阅读器中然后做取舍 如果你愿意参加这个运动,可以采用同样的方式 也可以把我的共享链接加到你的页面上 如果不知道如何上载文件,也可以放在博客文章里 总之,Hope everyone enjoy your reading! 3/2/2007 How To Add New Features To DejaGnu Testing Framework如何为 DejaGnu 添加新特性 DejaGnu 是一个非常好的开源的测试工具,尤其是做 GNU 开源工具链的软件开发,更离不开 DejaGnu 的支持,因为 binutils, gcc, gdb 自带的测试用例都是使用 DejaGnu 进行测试的。但是,DejaGnu 也有一些不足之处。因为它是开源的,我们可以修改它来满足我们的需求。 DejaGnu is a very good open-source testing framework, expecially in GNU development tool-chain developing. Because binutils, gcc, gdb use DejaGnu to test themselves. However, DejaGnu can not cover all aspects. Luckily it is open-sourced, so we can modify it to meet our demand. 我曾经想把下面代码提交到 DejaGnu,但是很遗憾,它的维护者似乎并不希望添加这些特性。所以我只好写在这里,希望能对某些人有所帮助。 I have tried to commit the fellowing code to DejaGnu, but unfortunately its maintainers did not want these features. So I write them down, in the hope that them will be useful. 1. DejaGnu 的官方介绍 1. Introduction From DejaGNU's website DejaGnu is a framework for testing other programs. Its purpose is to provide a single front end for all tests. Think of it as a custom library of Tcl procedures crafted to support writing a test harness. A test harness is the testing infrastructure that is created to support a specific program or tool. Each program can have multiple testsuites, all supported by a single test harness. DejaGnu is written in Expect, which in turn uses Tcl -- Tool command language. 2. 怎样给 runtest 命令添加新的选项 2. How to add new options to runtest command runtest 有很多选项,可以通过 runtest --help 查看。下面是向 runtest 添加两个选项的代码,"--pr"是带优先权的测试,通过在 site.exp 或者 unix.exp 等其它设置文件中添加 pre_test_list 变量(list类型)来实现优先测试 pre_test_list 中的测试用例;"--sm"是 smoking test,意思是可以在抽一支烟的时间内测完的用例列表,也是通过在设置文件中添加 smoking_test_list 变量(list类型)来实现。 "runtest" command has many options, you can use command "runtest --help" to get more information. The following code adds two options to runtest. "--pr" is for test with priority on some testcases, via setting a list variable "pre_test_list" in configure files like site.exp and unix.exp. "--sm" is for smoking test, set a list variable "smoking_test_list" in the same place as --pr. 在 dejagnu/runtest.exp 中,添加下面的代码: Adds the following code to dejagnu/runtest.exp: /* 在最后一个 switch -glob -- $option 的 swith 体中,添加:*/ /* Find the last "switch -glob -- $option", adds the fellowing to it's switch body:*/ # Options handler. "--pr*" { # (--priority) run preferential tests first, then others if {[info exists pre_test_list]} { set SOLREX_testlist $pre_test_list # Flag to control priority and smoking test. # 0: run before whole test # 1: run only listed test set SOLREX_flag 0 verbose "Running preferential tests $SOLREX_testlist" continue } else { warning "Variable pre_test_list is null. runtest as default." continue } } "--sm*" { # (--smoking) run smoking tests if {[info exists smoking_test_list]} { if { $smoking_test_list != ""} { set SOLREX_testlist $smoking_test_list set SOLREX_flag 1 verbose "Running smoking tests $SOLREX_testlist" continue } else { warning "Variable smoking_test_list is null." exit 0 } } else { warning "Variable smoking_test_list is not defined. " exit 1 } } /* 在最后一个 set testlist 的循环语句后,添加下面代码: */ /* Find the last "set testlist " statement, jump out of the foreach loop, adds: */ # Exe code for --pr and --sm. # If SOLREX_testlist is defined, run these *.exp files listed in it first. # code in foreach loop bellow is copied from above. if {[info exists SOLREX_testlist] } { foreach x $SOLREX_testlist { verbose "trying to glob ${srcdir}/${x}" 2 set s [glob -nocomplain ${srcdir}/$x] if { $s != "" } { lappend testlist $s } else { set f [exec find $srcdir -name "$x"] set f [split $f "\n"] set f [lindex $f 0] set s [glob -nocomplain ${srcdir}/$f] if { $s!= "" } { lappend testlist $s } } } if { $SOLREX_flag == 0 } { foreach test_name $testlist { if { ${ignoretests} != "" } { if { 0 <= [lsearch ${ignoretests} [file tail ${test_name}]]} { continue } } set subdir [file dirname $test_name] set p [expr {[string length $srcdir] - 1}] while {0 < $p && [string index $srcdir $p] == "/"} { incr p -1 } if {[string range $subdir 0 $p] == $srcdir} { set subdir [string range $subdir [expr {$p + 1}] end] regsub "^/" $subdir "" subdir } set runtests [list [file tail $test_name] ""] runtest $test_name lappend ignoretests [file tail $test_name] } set testlist "" } } /* 在 usage 函数中,添加下面两句:*/ /* Find "proc usage", adds following two lines in it: */ # Help information. send_user "\t--priority (-pr)\tRun tests in 'pre_test_list' first and orderly, defined in 'site.exp'\n" send_user "\t--smoking (-sm)\t\tRun tests in 'smoking_test_list' only, defined in 'site.exp'\n" 3. 怎样给 DejaGnu 添加新的开发板描述文件 3. How to Add Board Description File to DejaGnu DejaGnu 在baseboards目录下内建了很多开发板描述文件,例如:arm-sim.exp, mips-sim.exp,可以在这个目录下新建或修改原有文件来为你的开发板配置一个正确的环境。 DejaGnu have many board description files in directory dejagnu/baseboards, i.e. arm-sim.exp, mips-sim.exp. You can add or modify file to get a right configuration for your board. 开发板描述文件示例: Example board description file : $cat dejagnu/baseboards/gdbserver-sample.exp ......ignored headers...... # gdbserver running over ssh. /* 加载 tool-and-target-specific interface 配置文件,这个文件应该在当前测试环境的 config 目录下,可以在它里重写很多库函数。*/ /* Load tool-and-target-specific interface file, it should be in your testhome's config dir. You can overwrite library functions in this file. */ load_generic_config "gdbserver" /* 下面都是很明了的了,但是需要说明的一点是 board_info 并不是一个 struct, 可以自定义很多内容。比如 GDB 就定义了许多变量,例如:gdb_prompt, mathlib 等等。 你也可以为自己定义一些变量,只需要在这里 set_board_info xxxx yyyy, 当你要使用时,先测试它是否存在:[target_info exists xxxx],然后取得它的值:set YYYY [target_info xxxx]。*/ /* The following is self-explained. But maybe you are glad to know that "board_info" is not a struct, you can define variables in it. For example, GDB defines many variables, i.e. gdb_prompt, mathlib. Of course you can define youself some variables for configuration use. Put "set_board_info xxxx yyyy" here first. When you want to use xxxx, you test if it exits: "[target_info exists xxxx]", then get xxxx's value: "set YYYY [target_info xxxx]" */ process_multilib_options "" # The default compiler for this target. set_board_info compiler "[find_gcc]" #set_board_info compiler "/opt/src/gcc/install-30/bin/gcc" #set_board_info c++compiler "/opt/src/gcc/install-30/bin/g++" set_board_info rsh_prog /usr/bin/ssh set_board_info rcp_prog /usr/bin/scp set_board_info protocol standard set_board_info hostname voltaire.debian.org set_board_info username dan set_board_info gdb_server_prog /home/dan/gdb/mv/obj/gdb/gdbserver/gdbserver # We will be using the standard GDB remote protocol set_board_info gdb_protocol "remote" # Path to the gdbserver executable, if required. set_board_info gdb_server_prog "../gdbserver/gdbserver" # Name of the computer whose socket will be used, if required. set_board_info sockethost "voltaire:" # Port ID to use for socket connection # set_board_info gdb,socketport "4004" # Use techniques appropriate to a stub set_board_info use_gdb_stub 1 # This gdbserver can only run a process once per session. set_board_info gdb,do_reload_on_run 1 # There's no support for argument-passing (yet). set_board_info noargs 1 # Can't do input (or output) in the current gdbserver. set_board_info gdb,noinferiorio 1 # Can't do hardware watchpoints, in general set_board_info gdb,no_hardware_watchpoints 1 3/1/2007 Yodao BlogenderYodao Blogender
有道又推出一件有意思的服务:博客男女,借此测了一下我的三个博客。 1.http://mu-er.spaces.live.com
这说明,有道还真不是随机给的评论,因为最后两个博客发表的内容基本是同步的,给出来的结果也应该是一样的,赞一下网易,能推出这么多个性的博客搜索服务。 Employment Ad北京简约纳电子有限公司 公司行业: 电子技术/半导体 计算机硬件及网络设备 公司类型: 外商独资 公司规模: 30-99人 职位类别:计算机软、硬件/互联网/IT 电子/半导体/仪表仪器 工作地点:北京 发布日期:2007-03-01 工作经验:3-5年 最低学历:本科 职位月薪:面议 工作性质:全职 招聘人数:若干 管理经验:否 职位描述/要求: 基本要求: 1. 计算机专业本科以上学历,三年以上软件开发经历; 2. 较强的编程能力,熟悉C/C++; 3. 能够在Linux下进行开发; 4. 熟悉数据结构和算法,熟悉计算机组织与结构; 5. 较强的中英文沟通能力; 6. 很好的团队合作能力; 7. 有如下一种或几种经验会有帮助:脚本语言(如shell, TCL, perl), 嵌入式系统软件开发, 软件测试; 职位要求: 熟悉 Eclipse和CDT,了解如何为Eclipse编写插件(Plugin) 职位描述: 集成编译器和调试器等软件模块到Eclipse开发环境 公司简介: 北京简约纳电子有限公司是于2006年7月在中关村科技园区创建的高科技企业。公司主要发起人在美国硅谷知名企业工作多年并具有深厚设计及管理经验。公司管理团队专业技能涵盖集成电路设计各个方面,拥有世界领先的技术成果和丰富的研发经验。 公司专注于国内移动通信及多媒体应用市场,基于自主的核心技术开发不同的产品,广泛应用于无线通信,无线宽带接入、移动数字视频和多媒体编解码等领域。公司的优势在于提供专门为移动通信终端适用的低功耗、低成本并有完整系统软件支撑的芯片解决方案,同时与多家合作伙伴合作形成完整的系统解决方案。 公司提倡开放、沟通以及高度团队合作的企业文化精神,为每一位员工提供技术成长和职业发展的空间。 公司欢迎有志向,有兴趣、具有相关专业背景的工程师及毕业生加盟我们的队伍,并祝愿您在本公司找到工作及人生的乐趣。根据公司发展需要,诚聘责任心强、富于进取、乐于助人、适于团队工作的优秀人才加盟。请将您的简历投到我们的信箱。 地址: 北京市海淀区知春路6号锦秋国际大厦B座10层1001室 邮政编码:100088 电子邮箱:jobs@simplnano.com |
|
|