月度归档:2010年03月

Cygwin学习笔记

为了在最短的时间内掌握Cygwin原理,我选择了MSYS的源代码来进行分析研究。

以下内容仅为阅读代码时做的笔记,非文献。

 

当一个Cygwin程序运行时,首先到达mainCRTStartup ()这个入口函数,属于newlib,在newlib的crt0.c里。

mainCRTStartup ()调用msys_crt0或者cygwin_crt0,并传递main函数的地址。

msys_crt0调用了_msys_crt0_common 和 dll_crt0__FP11per_process。

在_msys_crt0_common()里,主要给per_process结构分配空间,然后初始化结构的数据内容。

进入dll_crt0__FP11per_process()后,就不会再返回了。

接着来到_dll_crt0(),获取环境变量和进程信息,通过set_console_handler设置终端IO文件。随后调用dll_crt0_1()

在dll_crt0_1里,设置了异常处理函数,初始化resourcelocks和threadinterface,似乎给线程都分配了名字。

调用了host_dependent.init (),不知道干了什么。

调用memory_init(),若是第一次加载dll,会创建一片共享内存区域。

调用events_init()初始化。

如果是使用fork创建的子进程,则跳到指定的地址去执行。否则,执行下面初始化:

Cygwin进程列表初始化,dtable初始化,信号处理初始化,tty初始化。

对命令行参数的路径进行转换。

 调用stdio_init()设置标准的输出输入描述符表。

至此,基本上完成了Cygwin的数据初始化。

 

最后调用dlls.init (),调用各个premain函数。调整到user_data->main去执行。

 

至此,我大致已经清楚了Cygwin的启动流程,可以去尝试自己写一个运行库了 :D

 

经过一晚奋战,结果如下,成功执行MSYS的env.exe程序。

 

Cygwin Makes Me Crazy?

前几天在忙着编写kernel32.dll以支持msys-1.0.dll。后来发现有点问题了。

首先,要实现的函数数量比较多,起码有100个以上。其次,我对win api不熟悉,也不感冒,对于每个api都要去msdn获取资料,相当麻烦。另外,某些api是非常难实现,例如编码转换,acl那些。

 

因此,我从昨天开始停止了继续编写kernel32了,而是转向msys-1.0.dll。msys和Cygwin是差不多的,其实就是一个简化版的Cygwin。而且使用了newlib,可移植性很好。

在编写msys的时候,又遇到问题了,我发现了里面有很多Cygwin的专用结构。对于这些结构我还不是很了解,所以基本上都没有实现。同时,我对Cygwin的工作流程也不是怎么熟悉。

 

为了让原计划继续进行,无论如何我也要把msys运行库写出来。

下一步先熟悉一下msys的源代码!!

What a small world!

昨天在雅牧群上遇到一个新兴老乡,有点巧合~~~ 遇到老乡真是一阵欢喜,有很多可聊的。

今晚,遇到一件更巧合的事情。上学期加了一个华工研2的师兄,曾经和我聊过qq协议和操作系统方面的东东。今晚发条消息来问我是不是计联班,然后说他是我的微积分助教,囧啊~~~

 Date:2010-3-16

华工研2 23:23:20
小师弟,你是计联班的呀
小虾 23:23:30

华工研2 23:23:56
我这个学期要做你们班的答疑老师
华工研2 23:24:20
就是助教老师
小虾 23:24:52
 
华工研2 23:25:05
呵呵,很巧把!!
小虾 23:25:08
09计联?
华工研2 23:25:08
 
华工研2 23:25:13
是的
华工研2 23:25:23
改作业发现你的名字
华工研2 23:25:28
 
小虾 23:26:05
什么科
华工研2 23:26:15
微积分
小虾 23:26:21
太牛了,膜拜~
华工研2 23:26:34
你们课超多
小虾 23:26:46
what a small world