2007年4月7日星期六

逃课

我是一个考研人,一千遍地提醒自己。。。
这是我在HIT的第三年,大三下学期。这是一个不平常的学期,因为我要考
研。虽然仅仅是要,而不是"是";但是谁能否认这是一个完美的理由,一个逃课的
完美的理由。
这一学期,我逃了一节有一节的课,甚至于我上过的课还没有逃的课多。
我一点儿也不是在炫耀,我甚至有些悲哀:我都这样了,为什么我还要考研呢?
今天是星期六,我有逃了半天的课,回来折腾mail,好在终于完成了,些
许安慰。

2007年4月3日星期二

Bufbomb可爱的缓冲区溢出

我现在在HITCS读大三,两年多了,写了很多小程序,真正的小程序。在两年
多的时间里,我经常遇到每一个前辈都犯过的错误--缓冲区溢出。每一次溢出都
是不同的,调试也是苦难的,数不清的BUG潜伏在我的程序里,我无能为力。。。
可是今天,缓冲区溢出成了我的任务@_@。CS:APP
<http://csapp.cs.cmu.edu/>的第三章的课后题3.38,给了我一个机会,第一次去
尝试有意的缓冲区溢出,全新的挑战啊!

getbuf的代码摘要如下:

int getbuf()

{

char buf[12];

getxs(buf);

return 1;

}

:-) objdump -d a.out

080484ae <getbuf>:
80484ae: 55 push %ebp
80484af: 89 e5 mov %esp,%ebp
80484b1: 83 ec 18 sub $0x18,%esp
80484b4: 8d 45 f4 lea 0xfffffff4(%ebp),%eax
80484b7: 89 04 24 mov %eax,(%esp)
80484ba: e8 25 ff ff ff call 80483e4 <getxs>
80484bf: b8 01 00 00 00 mov $0x1,%eax
80484c4: c9 leave
80484c5: c3 ret
分析getbuf的栈帧结构:

返回地址.1
%ebp.1


%eax ;buf首地址

返回地址.2
%ebp.2

可以看到,我们的输入必须在%eax往上(地址增加)的栈上,我们的功能代码应该是

*mov $0xdeadbeef, %eax*

*push $ip(返回地址1)*

* ret
最后为了保护%ebp.1和跳转到%eax执行代码
我们的输入应该是这样的形式
功能代码的机器码 00(填充12字节的剩余部分) %ebp %eax的地址
*

2007年3月30日星期五

四月是收获的季节?

    在我的印象了,四月绝对不是一个收获的季节。然而,2007年的四月,却实实在在的是一个收获的季节。在这个四月里,开源社区将会迎来很多喜讯,我们相信 可以收获很多:KDE4fedora7ubuntu还有我最最关心的Debian etch都会在这个四月和我们 见面。每一个软件都会有许多令人兴奋的新特性,我有些迫不及待了。。。
    This April,I will go back to my study after three years ago I left .I will do my best so that the next April will be a harvest season for me!I believe...
    God bless me!
Amen 阿弥陀佛 安拉赞美我
@_@...

2007年3月28日星期三

本欲乘风归去

国内的网络条件一直都不是很好,我在教育网,很难顺畅地访问blogger。有个同学,不是熟识,不过他的系统还是很不错,我
身边有好多的同学都在使用;我寒假前注册了一个帐号,发了一个短文,在网站里
里外外逛了一大圈,确实不错:功能很多,给我们用户的权限也很大,使着确实挺
爽。唯一的难处,太难折腾了,有些麻烦。说来很奇怪,我不怕折腾,但是偏偏不
喜欢网络上的折腾:我是个急性子,懒得等。。。放假回来以后,就没有怎么去
看;今天突然想起来了,一去看,OMG,居然有19个回复,我高兴坏了,心想这人
气真NB啊!一点击,我崩溃了,基本都是广告,多数还是国外的,郁闷。。。
我不想折腾密码啥的,还是回来用blogger吧,慢点儿我也忍了。另外一个blog不打算用了,
id实在是难听,我自己怎 么能想这么个名字呢?纳闷儿。。。

[Fwd: [Fwd: 本欲乘风归去]]

2006年12月31日星期日

ibmtc小结

不经意间,2006又要离我们远去了,回顾过去一年的工作,感觉有必要写点什么。
这个上半年过得很快,以至于我都没有什么印象,它就过去了。大概回忆一下,这个上半年我一直在做科技创新的前期调查论证工作,科技创新工作也是我这一年工作的重点,至少时间上的安排是这样的。上半年的工作感觉没有太多的内容,至少没有太多看得见摸得着的东西,也许就只有那为数不多的分析报告吧。不过,也算体验了这么一个研究的过程吧,感觉还是有一些收获的。7-8月那一个半月的开发阶段倒是给我留下了深刻的印象,从来没有在这么长的一段时间,集中精力地做那么一件时间,连续不受打扰的,感觉特别棒,而且对于php的使用也达到一个入门的水平,感觉还行。不过那一段的艰苦也是很特别的。科技创新的答辩令大家失望了,我很遗憾,没有得到满意的结果。
科技创新的工作完成后,我参与到Linux Framebuffer小组的工作中来。客观的说,这一段的工作对于我技术上的帮助应该是远远大于科技创新活动的。通过阅读源码,明白了Linux的部分机理,对于使用Linux接近一年的我来说,我觉得是特别必要的。不过阅读代码的工作也是很艰苦的,对此我们都深有体会。
总的说来,我是比较喜欢这后边三个月的工作的,感觉在这三个月里边,技术上的东西接触的比较多,而在上半年,大多数时候都在接触一些概念性的东西,在技术的积累上没有严格要求自己,没有学习到太多的东西,比较可惜,再想到上半年比较空闲的日子,真是在浪费生命啊!
纵观过去一年,我在实验室待的时间比较长,即使不是最长的,也是最长的那么几个之一。不过个人感觉,自己进步的程度没有其他同学高,个人分析,主要是不能潜心研究,总是三心二意,容易被外界干扰。这是我学习过程中遇到的最重要的非技术问题,我想应该想办法了结它了,再也不能看会儿书就灌bbs了。。。

2006年12月23日星期六

令人郁闷的马哲

明天早上就要马哲考试了,今天被迫准备了一天。说是准备,不就是看书,背书吗?200页的习题集啊,看得我都想吐了,不到一会儿就三心二意、昏昏欲睡了,真是比看代码还痛苦。就这样,还看得不咋的,就有个很粗略的印象,没什么效果。。。不过相信明天的考试还是没有问题的,平时分数就有30分,再加上选择题30分,再随随便便答点问答题,这不就过了。。。
哎,还是想想明天考试完了做什么吧。对了,tty_io.c的代码看得差不多了,该写个报告什么的了,然后做个ppt,星期二给实验室的伙计们讲一下,听听大家的意见。还有接口技术的作业没有做,身份证没有办,这些琐事怎么就这么多呢?

2006年12月20日星期三

TTY的read从何而来?(beta)

最近几天都在看tty_io.c,基本上明白了tty的大概组成,也就是tty_driver,tty_ldisc,tty_termios,tty_driver这么几个部分。它们之间的关系也基本清楚,可是一直没有细看tty的write,read等操作从何而来?深入到代码中去,原来是这样的: tty_read调用ld->read,而ld->read是指向read_chan的函数指针,其中read_chan是在N_TTY等不同的链路规则中分别定义的,它实际上也就是对copy_to_user的调用。这里我是这样理解的,对于不用链路规则中的read,它们的本质都是对于buffer的copy_to_user,它们的区别在于什么时候,怎样调用copy_to_user;而buffer中的数据是有设备的具体驱动来维护的,联想到一个链路规则适用于一类设备,那么就是说,这些设备对于buffer的操作都是类似的?我只是猜想,还不能确定;但是它们肯定不会迥异。假如我的猜想正确的话,那么tty是面向用户的对设备的抽象,而tty_ldisc是面向tty的对设备的抽象。除了这个猜想,还有一个不明确的地方,tty_driver干什么,是不是说,tty_driver是对于tty_write这一层次函数的组合,感觉不太必要啊,不应该是这样的吧,恩,明天再明确一下

2006年12月18日星期一

A tool for call graphs--Egypt

今天继续看tty_io.c的代码,代码中定义了很多操作buffer的函数,它们之间有相互调用,看着真混乱。于是,就想找一个能生成函数调用图的软件,尝试了doxygen,发现只能生成C++的类关系图,对于C没作用。然后,找到这个,感觉功能比较简单,好上手,先试试。。。

Egypt is a simple tool for creating call graphs of C programs.

egypt [--omit function,function,...] [--include-external] ... | dotty -
egypt [--omit function,function,...] [--include-external] ... | dot

omit
Omit the given functions from the call graph. Multiple function names may be given separated by commas.
include-external
Include calls to external functions in the call graph. A function is considered external if it is not defined in any of the input files. For example, functions in the standard C library are external. By default, such calls are not shown. Even with this option, only direct calls will be shown; there is no way to show indirect calls to external functions.

Generating the RTL file
make clean
make CFLAGS=-dr
Viewing the CALL GRAPH
egypt foo.c.00.rtl | dotty -

优点和缺点:使用gcc分析source code,使用 dotty生成图像,使用简单;但是必须要生成相应的rtf文件,对于很大的工程,也许相当麻烦。

2006年12月17日星期日

tty_open和init_dev流程分析

tty_open大致流程
  1. 根据目标设备文件节点inode->i_rdev(device)初始化局部变量 struct tty_driver* driver; int noctty;
  2. init_dev函数初始化设备
  3. 建立从当前进程到目标设备的连接 flip->private_data=tty; 同时,把指向此设备的file结构挂入tty_struct结构中的队列tty_files file_move(flip,&tty->tty_files);
  4. 通过函数指针调用与链路规则相关的open操作
  5. 修改当前进程current 和 tty 相关信息
BTW:根据filp->f_op可能有一个retry_open的过程。
init_dev大致流程:
  1. check wherher we're reopening an exiting tty
  2. 否,alloc_tty_struct() 分配空间
  3. 数据结构初始化 initialize_tty_struct(tty);
  4. 若想打开pty,则还需要建立o_tty(从设备),初始化之并建立主从设备之间的相互连接
  5. 在建立好设备以后,还需要设置若干termios结构,不太明白怎么回事(termios在某种程度上可以看作ldisc的补充,定义对字符的处理和波特率,不过这儿初始化的时候太多的判断了,不太清楚)
  6. 使用相应的链路规则open tty和o_tty(假如存在的话)
  7. 最后是一些错误处理的代码(不在流程里了)