原来在IP/DHCP Server/DHCP里的Config有是否保存DHCP Less到磁盘的设置:immediately/never。
困扰已久的问题,终于在无意间解决了。
又一次验证了我得到的教训:“没有不可能,只有想不到。”
Posts Tagged: 技术备忘
11
八 08
RouterOS DHCP Less的保存问题
27
七 08
RouterOS配置备份与恢复
WinBox:
Files->Backup/Restore
终端:
system backup save/load name=ROS-conf-20080727.backup
export/import file=ROS-conf-20080727.conf
21
七 08
NFO文件名常识
Incl.Keygen—>包含有注册器
keygen
only—>只含注册器
WinALL—>适用于所有版本Windows操作系统(一般是指95 98 ME 2000 XP
2003)
Trainer—>密技
Cracked—>破解版本(对原文件进行了修改)
MAC
OSX—>Macintosh平台上的软件
NUKED—>发布的内容违犯规则或存在问题因而被取消,别的小组可重新发布。
Ebook—>电子书
Repack
/Proper—>重新打包/正确的(对上一个不成功的破解的修正)
Plug
in—>插件
regged—>已經注册了的軟件
retail—>零售版
READ.NFO—>一般表示有某种特别说明
DIRFIX
nfo—>说明文件修正,一般只有一个nfo文件
BiLiNGUAL—>双语版本
MutilLiNGUAL—>多语言版本
PHP.NULL—>PHP完整脚本程序
ASP.NULL—>ASP完整脚本程序
Incl.Patch—>带有破解补丁
WORKING—>先前已有组织释放,但是不能完整工作,当前的释放是完整工作的。
Licensed—>带有许可文件
FiXED—>重新修正版
Unlocker—>解锁补丁
Cheats—>作弊修改器
ALL.ACCESS.CHEAT—>通关秘籍
电影文件名常识:
PROPER—>
完美版
DUPE—>与别的组织Release有重复
UNRATE—>未删节(好)
R-RATE—>有删节(不好)
WS
—>宽银幕版本的影片
FS—>4:3
全荧幕版本的影片(有些影片DVD中同时有WS和FS两种版本,Rip出来就要有两种Release)
Bad IVTC
—>画面有不可去处的拉丝(不好的版本)
Bad Aspt —>画面比例不正常(不好的版本)
LIMITED
—>指在美国有限上映的片子,很多外国片都这样
WITH
EXTRAS—>带花絮
INTERLACED—>隔行(可看见横的扫瞄线)
NUKED—>
画质太差,被FTP的管理员废掉
SUBBED —>内嵌硬字幕(画面内不能消去)
UNSUBBED
—>重新发布没有内嵌硬字幕的版本
CAM—> 摄影机拍影院银幕,带有影院音响(夹带观众笑声,不好)
Telesync,
TS—>摄像机拍影院银幕,从影院放映机直接接线输出
Telecine, TC—> 胶版,直接转电影拷贝,转电影拷贝
DVD
SCREENER —>用于观摩或展示的DVD
SCREENER, SCR
—>用于观摩或展示录影带
WORKPRINT,WP—>工作录影带(导演剪接版,与发行版不同 )
Director Cut
—>导演剪接版
TDX—>
传统DivX制作规则,不符合规则就不会被接受或被NUKE
INTERNAL—>不太符合TDX标准的作品,一些是自己做着玩,还有一些是那组织认为依照TDX无法做到满意的质量,但不依照TDX做又会被NUKE,所以只好INTERNAL,有些比较值得收藏。
STV—>指没有也不会有美国影院公映这部片,或者是在影院放映前已经在电视上放过
OST—>
原声大碟
PDA文件名常识
PPC2002 – –> 该软件所适用的操作系统,Pocket PC2002
WM2003
—> 该软件所适用的操作系统,Windows Mobile 2003等同于Pocket PC2003
ALL.PPC—>
适用于所有的Pocket PC系统,包括Pocket PC2000/Pocket PC2002/Pocket PC2003(Windows Mobile
2003)
ARM、MIPS、SH3分别代表该软件只适用于基于ARM、MIPS、SH3处理器的Pocket PC
PalmOS—>
该软件是为PalmOS系统开发的,
其中PalmOS5 是代表该软件只适用于PalmOS 5.0系统及以上
CLIE为Sony
Clie设备专用版
Treo 180/270/600分别为Handspring
Treo机型专用版
HIRES为专为拥有高分辨率屏幕(320*320)的机型设计
SymbianOS 6/6.1/7
是代表该软件只适用于SymbianOS 6.0/6.1/7.0系统
UIQ 是代表该软件适用于symbian7.0系统UIQ界面的机型,如Sony
Ericsson的P800/P900和Motorola A920等
JAVA
该软件为Java软件,需要支持Java的机型才能正常使用
S60.Java 专为Nokia S60系列机型设计的Java软件(Nokia7650,
Nokia3650, Nokia3310等)
S40.Java 专为Nokia
S40列机型设计的Java软件(Nokia6100,Nokia6610,Nokia6108,Nokia7210,Nokia7250等)
其中如特指明N3650、N6600等则又为该机型所优化
Smartphone
代表该软件适用于Windows Mobile Smartphone系统
26
六 08
对软链接的认识(bash中)
以下认知均指在BASH中
1. 软链接是个文件
2. 软链接可以指向文件,也可以指向目录。
3. 当一个软链接以”/”结尾时,BASH才会认为软链接指向的是目录。否帖BASH认为是文件。例如:
$ls -l
lrwxrwxrwx 1 root root 11 Jun 26 10:47 logs -> /data/logs/
当删除logs时,应使用 rm logs 而不是 rm logs/(这有点费话)。
我要说的主要问题是这儿:
$find ./logs -type f
输出为空,而
$find ./logs/ -type f
会输出/data/logs下的文件。
24
六 08
服务器网页缓存的深入分析
Expires、Cache-Control、Last-Modified、ETag是RFC
2616(HTTP/1.1)协议中和网页缓存相关的几个字段。前两个用来控制缓存的失效日期,后两个用来验证网页的有效性。要注意的是,
HTTP/1.0有一个功能比较弱的缓存控制机制:Pragma,使用HTTP/1.0的缓存将忽略Expires和Cache-Control头。我们
这里以Apache2.0服务器为例,只讨论HTTP/1.1协议。
到相应后,如果发现没有Expires字段,浏览器根据文件的类型和“Last-Modified”字段来推断出一个合适的失效时间,并存储在客户端。推
测出的时间一般是接受到响应时间后的三天左右。
LoadModule expires_module modules/mod_expires.so
# 启用有效期控制
ExpiresActive On
# GIF有效期为1个月
ExpiresByType image/gif A2592000
# HTML文档的有效期是最后修改时刻后的一星期
ExpiresByType text/html M604800
#以下的含义类似
ExpiresByType text/css “now plus 2 month”
ExpiresByType text/js “now plus 2 day”
ExpiresByType image/jpeg “access plus 2 month”
ExpiresByType image/bmp “access plus 2 month”
ExpiresByType image/x-icon “access plus 2 month”
ExpiresByType image/png “access plus 2 month”
d M Y H:i:s”) . ” GMT”),Apache服务器会把Wed, 11 Jan 1984 05:00:00
GMT作为Expires字段内容,返回给浏览器。即认为动态页面总是失效的。而浏览器仍然会保存已经失效的动态页面。
1970-01- 01
08:00:00,浏览器仍然会发送该文件在缓存中的Last-Modified和ETag字段。如果在服务器端验证通过,返回304状态,浏览器就还会
使用此缓存。
max-age=0等。这些元素用来指明页面被缓存最大时限,如何被缓存的,如何被转换到另一个不同的媒介,以及如何被存放在持久媒介中的。但是任何一个
Cache-Control指令都不能保证隐私性或者数据的安全性。“private”和“no-store”指令可以为隐私性和安全性方面提供一些帮
助,但是他们并不能用于替代身
头文件是放在原始目录的子目录中,根据原始文件名所命名的一个文件。具体用法请参阅Apache的官方网站。其中Cache-Control :
max-age表示失效日期。如果没有启动mod_cern_meta模块,Apache服务器会把Expires字段中的日期换算成以秒为单位的一个
delta值,赋值给max-age。如果启动mod_cern_meta模块,并且配置了max-age值,Apache会将这个覆盖Expires字
段。同时,max-age隐含了Canche-Control: public。这样浏览器接受到的Cache-Control :
max-age和Expires值就是一致的。
Request)相关的两个字段。如果一个缓存收到了针对一个页面的请求,它发送一个验证请求询问服务器页面是否已经更改,在HTTP头里面带上”
ETag”和”If Modify Since”头。服务器根据这些信息判断是否有更新信息,如果没有,就返回HTTP
304(NotModify);如果有更新,返回HTTP 200和更新的页面内容,并且携带新的”ETag”和”LastModified”。
” . gmdate(”D, d M Y H:i:s”) . ”
GMT”),Apache服务器会把当前时间作为Last-Modified,返回给浏览器。
1.3.22及以前,ETag的值是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。如果一个目录的
配置包含了‘FileETag INode MTime Size’而其一个子目录包含了‘FileETag
-INode’那么这个子目录的设置(并会被其下任何没有进行覆盖的子目录继承)将等价于‘FileETag MTime Size’。
1. 在 IIS 管理器中,展开本地计算机;右键单击要设置内容过期的网站、虚拟目录或文件,然后单击“属性”。
2. 单击“HTTP 头”选项卡。
3. 选中“启用内容过期”复选框。
4. 单击“立即过期”、“此时间段后过期”或“过期时间”,然后在对应的框中输入所需的过期信息。
5. 单击“确定”。
i. 过期相关设置
LoadModule headers_module modules/mod_headers.so
#Load 修改header的模块。
LoadModule expires_module modules/mod_expires.so
#Load 设定过期header的模块。
Header append Via: CCN-BJ-4-502
#增加一个Via header,值配置成设备的hostname。
KeepAliveTimeout 60
#设置连接的保持时间为60秒。
ExpiresActive On
#启用过期header功能。
ExpiresDefault A604800
#缺省过期时间为“访问后的604800秒”
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
ExpiresByType text/html A300
#text/html类型文件的过期设置为“访问后的300秒”
ExpiresByType text/css A259200
#text/css类型文件的过期设置为“访问后的259200秒”
ExpiresByType application/x-javascript A300
# application/x-javascript类型文件的过期设置为“访问后的300秒”
ExpiresByType image/gif A2592000
#image/gif类型文件的过期设置为“访问后的2592000秒”
上述配置文件中load的两个模块:mod_headers.so 和mod_expires.so 可以让Apache具有对header的一些定制功能。
ExpiresByType: 表示按照文件类型-MIME-TYPE设定过期策略;
A300: 表示在Access后300秒后过期;
ExpiresByType text/css A2592000: 表示Mime type是text/css的文件,在Access后2592000秒过期。
ExpiresDefault A604800: 表示除了单独制定的文件类型等过期策略外的其他内容,按照这个缺省的策略设定:访问后604800秒过期。
上面的方法可以实现根据web发布的不同文件类型,针对不同的发布目录进行过期策略设置。在按照如上方法设置后,Apache会自动的产生两个相关的http header,举例如下:
HTTP/1.1 200 OK
Date: Tue, 27 Mar 2007 17:44:21 GMT
Server: Apache/2.0.54 (Unix)
Last-Modified: Thu, 25 Jan 2007 07:45:45 GMT
ETag: “72df3a-93-99499c40”
Accept-Ranges: bytes
Content-Length: 147
Cache-Control: max-age=2592000
Expires: Thu, 26 Apr 2007 17:44:21 GMT
Via: CCN-BJ-4-575
Keep-Alive: timeout=60, max=100
Connection: Keep-Alive
Content-Type: image/gif
其中:Date + Max-age = Expires.
Max-age是个时间长度,对应web
server上面设置的过期时间;Expires是根据max-age算出来的过期时间点,两者是一致的,不同cache在判断内容是否过期时会严格比较
系统时间和上述过期时间,或者比较age(在cache中存住的时间长度)和max-age的值。
“mod_expire”,
“/images/” => “access 3 hours”,
“/admin/” => “access 3 hours”,
“/area/” => “access 3 hours”,
“/calendar/” => “access 3 hours”,
“/common/” => “access 3 hours”,
“/front/” => “access 3 hours”,
“/inc/” => “access 3 hours”,
“/jeditor/” => “access 3 hours”,
“/js/” => “access 3 hours”,
“/script/” => “access 3 hours”,
“/theme/” => “access 3 hours”,
“/upload/” => “access 3 hours”,
“/view/” => “access 3 hours”,
“/help/” => “access 3 hours”,
“/htm/” => “access 5 minutes”
)
20
二 08
MINIX3
今天无意又看到了MINIX的消息。MINIX曾经是我在大学里极度向往和崇拜的东西。
从手册的FAQ里粘贴几个条目,其实是给自己看的。我也在想这个系统有什么应用价值。
http://www.minix3.org
MINIX 3是什么?
MINIX 3是一个为高可靠性应用而设计的自由且简洁的类UNIX系统。它特别适用于低端的个人电脑、资源受限制系统和嵌入式应用。你可以获得它所有的源代码,这使得它很适合于课堂教学和那些想了解操作系统怎样运行的自学者。
MINIX 3运行的硬件要求?
你需要一台有4 MB内存、100MB空闲硬盘空间和CD-ROM(IDE)的Intel386及其以上计算机。现在暂时还不支持从USB CD-ROM启动。
4
二 08
什么是SysRq”魔术组合键”?
根据Linux内核文档介绍:
这是一组’魔术组合键’,只要内核没有被完全锁住,不管内核在做什么事情,使用这些组合键可以立即打印出内核的信息。
使用sysrq组合键是了解系统目前运行情况的最好方式。如果系统出现挂起的情况或者在诊断一些和内核相关,比较怪异,比较难重现的问题的时候,使用sysrq键是一个比较好的方式。
如何打开和关闭SysRq组合键?
为了安全起见,在红帽企业版Linux里面,默认SysRq组合键是关闭的。 打开这个功能,运行:
# echo 1 > /proc/sys/kernel/sysrq
关闭这个功能:
# echo 0 > /proc/sys/kernel/sysrq
如果想让此功能一直生效,在/etc/sysctl.conf里面设置kernel.sysrq的值为1. 重新启动以后,此功能将会自动打开。
kernel.sysrq = 1
因为打开sysrq键的功能以后,有终端访问权限的用户将会拥有一些特殊的功能。因此,除非是要调试,解决问题,一般情况下,不要打开此功能。如果一定要打开,请确保您的终端访问的安全性。
如何触发一个sysrq事件?
有几种方式可以触发sysrq事件。在带有AT键盘的一般系统上,在终端上输入一下组合键:
Alt+PrintScreen+[CommandKey]
例如,要让内核导出内存信息(CommandKey “m”),您应该同时按下Alt 和 Print Screen 键,然后按下 m 键. 提示: 此组合键在Xwindows上是无法使用的。所以,您先要切换到文本虚拟终端下。如果您现在是在图形界面,可以按Ctrl+Alt+F1切换到虚拟终端。
在串口终端上,要想获得同样的效果,需要先在终端上发送Break信号,然后在5秒内输入sysrq组合键。
如果您在机器上有root权限,您可以把commandkey字符写入到/proc/sysrq-trigger文件。这可以帮助您通过脚本或者您不在系统终端上的时候触发sysrq事件。
# echo ‘m’> /proc/sysrq-trigger
当我触发一个sysrq事件的时候,接过保存在什么地方?
当一个sysrq命令被触发,内核将会打印信息到内核的环形缓冲并输出到系统控制台。此信息一般也会通过syslog输出到/var/log/messages.
有时候,可能系统已经无法响应,syslogd可能无法记录此信息。在这种情况下,建议您配置一个串口终端来收集这个信息。
那些类型的sysrq事件可以被触发?
sysrq功能被打开后,有几种sysrq事件可以被触发。不同的内核版本可能会有些不同。但有一些是共用的:
* m – 导出关于内存分配的信息
* t – 导出线程状态信息
* p – 到处当前CPU寄存器信息和标志位的信息
* c – 故意让系统崩溃(在使用netdump或者diskdump的时候有用)
* s – 立即同步所有挂载的文件系统
* u – 立即重新挂载所有的文件系统为只读
* b – 立即重新启动系统
* o – 立即关机(如果机器配置并支持此项功能)
11
一 08
免费申请Google企业应用套件
今天在跟朋友聊天过程中才知道原来Google企业邮标准版和教育版是可以免费申请的,于是立刻回来申请。
在网上查了一下,貌似注册Google企业邮件有个需要注意事项:
第一,要找一个美国的代理服务器来申请。
第二,国家要选“美国”。
注意这两个事项应该就比较容易申请成功了。
Google企业邮的申请地址为:http://www.google.com/a/。
Google的企业邮功能还是很强大的,其中邮件、即时通信、 在线文档、日历这四项功能,对于企业协作,那是相当有用的。有兴趣的朋友可以试试。下面是bsmap.com的邮件界面截图:
9
一 08
Google企业邮设置SPF记录
今天又开始搞SPF,之前搞过,然而搞过之后,立刻忘掉,于是决定今后的任何小动作都要记录下来。
今天为我们blogbus.com域设置SPF记录,这是我找到的一篇比较详细的文章:
http://www.bsdmap.com/linuxfocus/ChineseGB/December2004/article354.shtml
然后给我搜到Google的帮助:
http://www.google.com/support/a/bin/answer.py?hl=cn&answer=33786
通过发件人策略框架 (SPF) 记录,域所有者可以指定有权代表其域发送电子邮件的主机,以避免发件人:地址被他人伪造。我们强烈建议您为自己的域发布 SPF 记录,因为采用这些记录后,最终可以帮助防止垃圾邮件的出现。
要设置您所在域的 SPF 记录,请在 DNS 资源上发布以下 TXT 记录:v=spf1 include:aspmx.googlemail.com ~all。
4
十二 07
X60/T60的SATA硬盘如何安装xp
X60/T60的SATA硬盘如何安装xp!(转自51bbnet)
http://www-307.ibm.com/pc/support/site.wss/MIGR-62909.html
X60/T60安装OS指导!!
本来安装OS是件简单事儿,但因为X60/T60的硬盘是SATA的,所以又不太简单!不想用随机盘恢复的本友请详见下述:
1、问题产生的根源:
WinXp虽然主流,但也是几年前的产物了,相对于SATA这个新生事物,有点欺生:)。打个比方,就好比要往SCSi硬盘上装WinXP,需要在第一屏“使用第三方SCSI驱动,请按F6”时,按F6,然后用SCSI厂商提供的软盘安装驱动,然后继续安装。然而,很显然,有SATA盘的本本都没有软驱。
2、下面说解决方案:
a)有USB软驱,没说的,下载附件中的驱动,解压后,拷到软盘里,在安装时F6装上,剩下的和正常安装同样。
b)也是大家常见的情况:没有软驱,步骤如下:
i)在启动时F1进Bios-〉Serial ATA-〉将硬盘模式从AHCI(高级接口模式,支持SATA的150M传输率)改为:Compatibility(兼容模式,模拟传统的IDE硬盘)
ii)用Xp安装盘正常安装,完成安装后,请先使用附件驱动安装SATA的驱动。把驱动解压到c:\drv\sata下,在c:\drv\sata\PREPARE下执行install.cmd,系统安装完后自动重启。
iii)重启后进Bios,将Serial ATA模式改回AHCI,正常进系统,会报告发现新硬件,不使用自动安装,手工把搜索路径指向c:\drv\sata,系统会自动完成安装,正确安装后,SATA在设备管理器中将显示为:Intel(R) 82801 GBM SATA AHCI Controller (Mobile ICH7M),至此,WinXP就可以正常用SATA告诉模式启动了
iiii)对于X60,因为没有光驱,强烈建议先用工具盘引导用PQ把分区做好,并把安装文件拷到硬盘下,然后用98盘引导,进入Win的目录,执行XX\i386\winnt,剩下的过程同T60
iiiii)强烈建议做好干净的OS后留一个Ghost备份!
最后,转一下帖子,关于T60的驱动问题。
a、由于T60使用了HD Audio声卡,看起来能够使音质得到一个提升的东西(好像用那两个小喇叭听确实说得过去)。但是在安装过程中,总会遇到报错:“需要 HD Audio总线驱动程序,但是没有找到”; 这里需要一个Windows的系统补丁KB888111,在安装声卡驱动之前,先打上相应的补丁(2000、XP SP1、XP SP2、2003均不同),然后系统会告诉你发现新硬件,这里还可以附带安装Modem的驱动,它好像也要HD Audio的总线驱动才能安装。
b、安装显卡驱动之前要装好Microsoft .NET Framework 2.0,否则显卡驱动安装不正常。表现在看起来装好了,但是重新启动之后就会报错:“.cli.exe 应用程序错误”。如果在MSConfig中取消它的启动,只能从表面解决问题。关键是要安装Microsoft .NET Framework 2.0后再安装显卡驱动。—-这是因为Ati的控制中心要求的要.net估计是IBM的驱动没有像Ati那样集成进去。
附件: ibm-sata.rar (2006-7-24 18:18, 180.8 K)
补充一点,关于IBM T60 X60的系统安装指南
联想在新一代的Thinkpad 6系列中采用的SATA硬盘,并在bios里面将sata的模式默认设置为AHCI,导致用户自行安装操作系统的时候出现硬件无响应,蓝屏,安装失败,但我们并不是没有办法给自己的本本重新安装操作系统,以下文字摘自IBM官方网站的文档,本人加以翻译,不对产生的任何问题负责
------------------------------------
从说明文档里我们能看到两种安装方式:
第一种是clean install,
1. Attach a diskette drive to your computer.
1,将一张软盘插入系统软驱(可以用双起U盘实现)
2. Download Intel Matrix Storage Manager Driver from the Web site and extract the driver to C:\DRIVERS\WIN\SATA and copy the driver to a diskette.
2,下载Intel Matrix Storage Manager Driver并把其解压到 C:\DRIVERS\WIN\SATA (其实任意地方都行),然后把它拷贝到软盘里。
3. To make sure that SATA AHCI is enabled, start the BIOS Setup Utility menu.
4. Select “Config”.
5. Select “Serial ATA (SATA)”.
6. Select “AHCI”.
3、4、5、6是告诉大家如何把SATA设置成AHCI模式,这个机器默认就是这样的,基本可以跳过
7. Change the startup sequence of your computer. Following the instructions on the Startup menu in the BIOS Setup Utility, set the CD-ROM drive to start first.
7,改变启动顺序,光驱第一(这么做的目的是为了从光盘装系统,如果是从硬盘装就不用了)
8. Insert the CD for Windows XP into the CD or DVD drive, and restart the computer.
8,插入Xp安装盘并重启
9. To install a third-party SCSI or RAID driver first, press F6.
9,“安装第三方SCSI或RAID驱动,请按F6
10. When prompted, select S for Specify Additional Device.
10,当安装界面出现,选S表示Specify Additional Device
11. When prompted, insert the diskette that you created in step 2, and press Enter.
11,然后插入你刚才拷贝了驱动程序的软盘
12. Select “Intel(R) 82801 GBM SATA AHCI Controller (Mobile ICH7M)”, and press Enter.
12,选择Intel(R) 82801 GBM SATA AHCI Controller (Mobile ICH7M,按enter
13. To continue the installation, press Enter again. Leave the diskette in the drive until the next reboot; the software may need to be copied from the diskette again when the files are copied during setup.
13,再按一次enter进行继续安装,不要拿出软盘
14. Follow the instruction to complete the OS installation.
14,继续正常安装操作系统
第二种方法是针对没有软盘驱动器的用户,官方文档说明如下
If you do not have a diskette drive, you can install Intel Matrix Storage Manager Driver by the following alternative procedure:
如果你没有软驱,你可以按照下面的方法安装 Intel Matrix Storage Manager Driver
Note: If you select AHCI for Serial ATA (SATA) in the BIOS Setup Utility before installing Intel Matrix Storage Manager Driver, your computer will not respond; it will only display a blue screen.
注意:如果你把SATA选成了AHCI模式,那么当你安装 Intel Matrix Storage Manager Driver 之前系统会没有反应,蓝屏
1. Start the BIOS Setup Utility menu.
2. Select “Config”.
3. Select “Serial ATA (SATA)”.
4. Select “Compatibility”.
1~4,就是开机,按F1进bios,然后把SATA选成compatibility模式。
5. Install Windows XP and Service Pack 2.
5,正常安装windows xp
6. Download Intel Matrix Storage Manager Driver from the Web site and extract the driver to C:\DRIVERS\WIN\SATA.
6,下载 Intel Matrix Storage Manager Driver 并解压到C:\DRIVERS\WIN\SATA
7. Run Intel Matrix Storage Manager Driver. To do this, go to C:\DRIVERS\WIN\SATA\PREPARE, and double-click install.cmd.
7,运行C:\DRIVERS\WIN\SATA\PREPARE中的install.cmd,安装Intel Matrix Storage Manager Driver
8. Turn the computer off and then on again.
8,重启
9. Start the BIOS Setup Utility menu.
10. Select “Config”.
11. Select “Serial ATA (SATA)”.
12. Select “AHCI”.
9~12,进入bios把sata模式改回AHCI
13. Start Windows XP. The Welcome to the Found New Hardware Wizard appears.
14. Click “No, not this time”, and then click “Next”.
15. Select Install from a list or specific location (Advanced), and then click Next.
16. Select “Search for the best driver in these locations”. Then select “Include this location in the search:”, specify the path, C:\DRIVERS\WIN\SATA, and click “Next”. The Completing the Found New Hardware Wizard appears.
17. Click “Finish”.
18. When the System Settings Change window appears, click “Yes”. The computer restarts.
13~18,进入操作系统,发现新硬件,指向C:\DRIVERS\WIN\SATA完成驱动程序的安装
4
十二 07
我的FireFox常用插件
主题:
Noia 2.0 (lite)
扩展:
Web Developer 1.1.4
Firebug 1.05
yslow
Wizz RSS News Reader 2.1.9.8
Google Notebook插件
Nagios Checker
scribefire
ReminderFox
showip
lori
Hide Menubar
Adblock Plus
字体:
抓屏展示:
3
十一 07
免费的DNS检验网站
刚发现了一个不错的DNS检查站点:http://www.checkdns.net/
可以检查你的DNS是否工作的正常(是否配置、架构有误)。
另一个不错的工具网站:http://www.robtex.com/ 一个查IP,查域名,查网络机构的工具,相当不错。
24
八 07
世界上最强的超级计算机们
计算机可不仅仅是放在我们桌子上或者大腿上的样子;我们天天讨论的各种硬件,甚至是发烧级的硬件在某些时候看来仅仅就是不入流的小儿科。普通的计算机就已经让我们的生活发生了很大的变化,其实在我们生活的背后还有一些更为强大的超级计算机,默默的让我们的生活发生着更为巨大的变化。
在这里先跟大家解释一个名词:Teraflop,万亿次浮点计算。在超级计算领域,浮点计算(flop)是一个缩写,其完整的含意为“每秒浮点计算次数”(FLoating point Operations Per Second),是一种计算机执行浮点计算能力的衡量标准。万亿次计算即为每秒一万亿次浮点计算。
7. Tera-10——法国原子能署
Bull SA为法国原子能署建造的这台Tera-10,在世界上最快的500台计算机排行榜中名列第七。Tera-10由544台Bull的NovaScale 6160服务器组成,每一台这样的服务器都配有8颗双核Intel安腾(Itanium)处理器,运行速度大约是42.9万亿次浮点计算。这台超级计算机使用Linux操作系统,用来模拟原子能试验。

(Tera-10)



Thunderbird达到53.0万亿次浮点计算的速度,使得它在世界上最快的500台计算机排行榜中名列第六。目前这台超级计算机主要用来模拟武器的性能、半导体设备的辐射状况、极端环境下的武器安全性能等等工作。

MareNostrum目前的应用相当广泛,包含人类基因的研究、天气预报、药品研究等等领域。






ASC Purple是美国劳伦斯利弗莫尔国家实验室和IBM通力合作的结晶。其峰值100万亿次浮点计算的能力,来源于196台IBM Power5 SMP服务器冗余环的强大性能。实际上这台超级计算机总共拥有12544颗微处理器,50TB的内存和2PB的磁盘存储空间。
ASC Purple目前被用来模拟测试核武器的性能,而过去常常需要通过底下核试验才能测得。



Blue Gene/W的主要工作是进行科学计算,例如生物学模拟、蛋白质折叠和其他IBM科学家的研究工作。



Red Storm由12960台配备AMD皓龙(Opteron)处理器的节点组成,峰值运算速度能够达到124.42万亿次浮点计算。这台超级计算机仅仅使用了一套小型的Linux操作系统,只具有一些能够支持Red Storm应用的功能。




最近,Blue Gene/L因为执行一项与半个老鼠大脑一样复杂的脑皮层模拟而被进一步关注,半个老鼠大脑拥有800万神经元细胞,每一个细胞与其他神经纤维之间有8000个链接。除此之外,Blue Gene/L通常用来模拟包括蛋白质在内的生物化学过程。




17
八 07
开源的磁盘加密软件TrueCrypt
开源的磁盘加密软件
本来我只是想留个记录,好提醒自己哪种加密算法的磁盘吞吐量大(注意,这张图只能说明吞吐量,说明不了加密算法的复杂性,以及安全性),这个主要是用来考虑让scp使用那种算法来传送文件。
但是当我帖出这张图的时候,我就想给大家介绍一个前几天遇到的这个软件了。 刚好,可以写出来在朋友圈子里推广。
Creates a virtual encrypted disk within a file and mounts it as a real disk.
Encrypts an entire hard disk partition or a storage device such as USB flash drive.
Encryption is automatic, real-time (on-the-fly) and transparent.
Provides two levels of plausible deniability in case an adversary forces you to reveal the password:
1) Hidden volume (steganography – more information may be found here).
2) No TrueCrypt volume can be identified (volumes cannot be distinguished from random data). Encryption algorithms: AES-256, Serpent, and Twofish. Mode of operation: LRW.
简单地说,TrueCrypt是一个加密软件,支持多种加密算法。它可以加密整个存储设备分区,比如将你的U盘加密;也可虚拟出来一个磁盘分区,对里面的内容时行加密。你可以用“密码”或者“密钥文件”或者“密码+密钥文件”的方式来加密自己的数据,以虚拟磁盘的形式。虚拟磁盘就像虚拟光区一样,可以将一个使用TrueCrypt “格式化”的一个文件通过TrueCrypt挂载到某个系统不在使用的盘符上,挂载以后,系统会多出来一个盘符。你可以将你的机密数据写到这个分区里。
TrueCrypt是开源软件,大家可以自由使用,在它的主页http://www.truecrypt.org 下载
http://www.bsdmap.com/software.php 亦可下载。
29
七 07
防止ARP“中间人”攻击的一个技巧
相信“arp欺骗”让不少管理员疲于奔命。下面讲一个自己偶然得到启示得到的一个方法——其实最重要的启示是如何让Windows上的arp绑定操作开机自动运行。
直接进入主题,在底层禁止arp通信是解决arp欺骗的根本方法。为了不使设备对某个地址进尽arp广播查询,需要将ip->mac这个对应关系的记录以“静态”的属性写进“arp table”里。在Windows/Linux系统里,可以使用以下命令进行静态arp table记录的添加:
arp -s 网关ip地址 网关mac地址
应该有不少系统管理员已经知道通过绑定静太MAC地址,可以防止arp欺骗,但是这种绑定必须是双方的,需要进行二层通信的双方都进行mac绑定,一般为:在服务器上绑定网关的ip->mac为静态,在网关上绑定服务器的ip->mac为静态。通过绑定网关地址的mac为静态,只可以保证从服务器到网关(路由器)之间不会被欺骗、被插入,从网关(路由器)到服务器仍然是可以被插入或者被欺骗的,要做到in和out两路都受到保护,就需要在网关上同样地绑定服务器的mac地址为静态(这个对于大多数服务器的ISP来说,可能都不愿意做——因为合同上并没有要求要做这些,多一事不如少一事,更有管理员认为做这些配置会增加路由器的负载——貌似没有什么根据)。
现在的问题是,第一,如何让ISP给我们的服务器ip地址的mac绑定成静态,貌似有点难度,在管理不是很严格的机房,跟管理人员搞好关系应该就可以做到。或者直接找业务部门,要求他们提供这样的服务。第二,对于Windows系统,每次重启系统都要手动绑定一次,真的很不方便。有人把这些操作写成批处理加到autorun.bat里,但是似乎起不了作用。加到“开始/程序/启动”里,貌似也不行,这些都是需要管理员登录进系统才能运行的,况且将arp登录写入批处理,不知道为什么总是返回不了。我的做法是,把这个绑定操作设置成计划任务,设备成开机运行。计划任务是做为后台服务在运行的,所以用户不登录系统,这个操作依然可以完成。这个操作已经经过测试,可以正常运行:大致上,任务的命令行为:C:\windows\system32\arp.exe -s 网关ip地址 网关mac
29
七 07
防止ARP“中间人”攻击的一个技巧
相信“arp欺骗”让不少管理员疲于奔命。下面讲一个自己偶然得到启示得到的一个方法——其实最重要的启示是如何让Windows上的arp绑定操作开机自动运行。
直接进入主题,在底层禁止arp通信是解决arp欺骗的根本方法。为了不使设备对某个地址进尽arp广播查询,需要将ip->mac这个对应关系的记录以“静态”的属性写进“arp table”里。在Windows/Linux系统里,可以使用以下命令进行静态arp table记录的添加:
arp -s 网关ip地址 网关mac地址
应该有不少系统管理员已经知道通过绑定静太MAC地址,可以防止arp欺骗,但是这种绑定必须是双方的,需要进行二层通信的双方都进行mac绑定,一般为:在服务器上绑定网关的ip->mac为静态,在网关上绑定服务器的ip->mac为静态。通过绑定网关地址的mac为静态,只可以保证从服务器到网关(路由器)之间不会被欺骗、被插入,从网关(路由器)到服务器仍然是可以被插入或者被欺骗的,要做到in和out两路都受到保护,就需要在网关上同样地绑定服务器的mac地址为静态(这个对于大多数服务器的ISP来说,可能都不愿意做——因为合同上并没有要求要做这些,多一事不如少一事,更有管理员认为做这些配置会增加路由器的负载——貌似没有什么根据)。
现在的问题是,第一,如何让ISP给我们的服务器ip地址的mac绑定成静态,貌似有点难度,在管理不是很严格的机房,跟管理人员搞好关系应该就可以做到。或者直接找业务部门,要求他们提供这样的服务。第二,对于Windows系统,每次重启系统都要手动绑定一次,真的很不方便。有人把这些操作写成批处理加到autorun.bat里,但是似乎起不了作用。加到“开始/程序/启动”里,貌似也不行,这些都是需要管理员登录进系统才能运行的,况且将arp登录写入批处理,不知道为什么总是返回不了。我的做法是,把这个绑定操作设置成计划任务,设备成开机运行。计划任务是做为后台服务在运行的,所以用户不登录系统,这个操作依然可以完成。这个操作已经经过测试,可以正常运行:大致上,任务的命令行为:C:\windows\system32\arp.exe -s 网关ip地址 网关mac
28
四 06
什么是RSS
引用:
讨论与Blog相关的技术,不可不谈的就是RSS,这个缩写在英文中可以有几个源头,并被不同的技术团体做不同的解释。既可以是“Rich Site Summary”,或“RDF Site Summary”,也可以是“Really Simple Syndication”。为什么有这么多含义呢?这还要从RSS的一段今天也没有理清的关系说起。
今天肯定有人还记得IE 4刚刚推出来的时候有一个有趣的功能,那就是新闻频道。这个新闻频道的功能与Netscape推出的新闻频道是很相似的(当时Netscape还是市场上领先的浏览器)。为此Netscape 定义了一套描述新闻频道的语言,这就是RSS,只不过Netscape自当时起每况愈下,所以最终也没有发布一个正式的RSS规范(只发布了一个0.9版本)。而微软也在当时推出了支持自己IE的CDF(Channel Definition Format)数据规格,与RSS非常接近。微软试图用新闻频道的功能把“推”(Push)技术变成一个应用主流,并与Netscape抗衡。不过出乎预测的是,“推”技术自始至终没有找到合适的商业模型,而且伴随着其他各类网络特性的出现,也日益无法显现自身的优势。新闻频道在浏览器中的地位最终日暮西山,最后也在IE的后续版本中消失了。
新闻频道的确进入了低谷,但是RSS并没有被业界人士所抛弃。过去两年,Blog从一个专业群体开始,逐步成为了网络上最热门的新话题。而RSS成为了描述Blog主题和更新信息的最基本方法。于是RSS这项技术被著名Blogger/Geek戴夫·温那(Dave Winner)的公司UserLand所接手,继续开发新的版本,以适应新的网络应用需要。新的网络应用就是Blog,因为戴夫·温那的努力,RSS升级到了0.91版,然后达到了0.92版,随后在各种Blog工具中得到了应用,并被众多的专业新闻站点所支持。在广泛的应用过程中,众多的专业人士认识到需要组织起来,把RSS发展成为一个通用的规范,并进一步标准化。一个联合小组根据W3C新一代的语义网技术RDF对RSS进行了重新定义,发布了RSS 1.0,并把RSS定义为“RDF Site Summary”。这项工作并没有与戴夫·温那进行有效的沟通,而戴夫则坚持在自己设想的方向上进一步开发RSS的后续版本,也并不承认RSS 1.0的有效性。RSS由此开始分化形成了RSS 0.9x/2.0和RSS 1.0两个阵营,也由此引起了在专业人群中的广泛争论。
因为争论的存在,一直到今天,RSS 1.0还没有成为标准化组织的真正标准。而戴夫·温那却在2002年9月独自把RSS升级到了2.0版本,其中的定义完全是全新的模式,并没有任何RSS 1.0的影子。这引发了网络上进一步争议,究竟让一个越来越普及的数据格式成为一个开放的标准,还是被一家公司所定义和控制,成为了争议的焦点。戴夫·温那并没有为自己辩解,他的观点是RSS还需要进一步发展,需要专业人士更明确的定义,不过恐怕这种轻描淡写不能消除人们对RSS“被一家商业公司独占”的担心。
前面的铺垫对用户来说也许没有什么太大的意义,可能更多人关心如何在自己的Blog增加RSS输出,这样可以让很多新闻聚合工具(例如CNBlog刚刚推荐的NewzCrawler)很容易找到你并自动获得你在Blog中的更新内容。
它是什么:站点用来和其他站点之间共享内容的简易方式(也叫聚合内容)。 RSS使肵ML作为彼此共享内容的标准方式。
它代表什么:Really Simple Syndication (或RDF Site Summary,RDF站点摘要)
例如:一些免费的软件能够让你阅读那些RSS使能的站点,比如 NewsIsFree 和 Amphetadesk。
它有什么用处:让别人容易的发现你已经更新了你的站点,让人们很容易的追踪他们阅读的所有weblogs。
原文出处:博客中国
22
七 05
什么是GMT,什么是UTC
什么是GMT,什么是UTC
0.时标
时标意指一种将时间分配到事件的制度。现时有两类时间标准广泛被采用。一种是基于天文学,另一种则以原子振动的频率作为依据。
1.视太阳时
视太阳时是一种源于太阳所见位置的时间标准。日晷可直接显示视太阳时。
2.UT0
由于地球轨道并非圆形,其运行速度又随着地球与太阳的距离改变而出现变化,因此视太阳时欠缺均匀性。视太阳日的长度同时亦受到地球自转轴相对轨道面的倾斜度所影响。为着要纠正上述的不均匀性,天文学家计算地球非圆形轨迹与极轴倾斜对视太阳时的效应。平太阳时就是指经修订后的视太阳时。在格林尼治子午线上的平太阳时称为世界时(UT0),又叫格林尼治平时(GMT)。
3.UT1
UT1 与 UT2 是两种较 UT0 均匀的时标。随着较为精确的时钟面世,天文学家发现在不同地点量度的世界时出现差别。这种差别是由于地轴摆动而引起的。各地天文台详细测量了地轴摆动的影响后,制定了一种称为 UT1 的新时标将这种影响删除。
4.UT2
在时钟的精确度进一步改进后,又发现 UT1 具有周期性变化。这种变化是由地球自转率的季节性变动引起的。上述影响经修正后,得到一种更加均匀的时标称为 UT2。
5.国际原子时(TAI):
1967年的第13届国际度量衡会议上通过了一项决议,采纳以下定义代替秒的天文定义:一秒为铯-133原子基态两个超精细能级间跃迁辐射9,192,631,770周所持续的时间。国际原子时是根据以上秒的定义的一种国际参照时标,属国际单位制(SI)。
国际原子时标是一种连续性时标,由1958年1月1日0时0分0秒起,以日、时、分、秒计算。原子时标的准确度为每日数纳秒,而世界时的准确度则只为数毫秒。
6.协调世界时(UTC):
一种称为协调世界时的折衷时标于1972年面世。为了确保协调世界时与世界时(UT1)相差不会超过0.9秒,有需要时便会在协调世界时内加上正或负闰秒。因此协调世界时与国际原子时(TAI)之间会出现若干整数秒的差别。位于巴黎的国际地球自转事务中央局(IERS)负责决定何时加入闰秒。
20
七 05
GNU 编译器家族 GCC 内部探密
GNU 编译器家族 GCC 内部探密 探索 GCC 前端的内部结构
探索 GCC 前端的内部结构
赵蔚 (zhaoway@public1.ptt.js.cn)
Linux 和自由软件技术独立顾问
2003 年 7 月
我们在本文中说明 GCC 源码包中的例子编程语言 Treelang 的实现细节。主要目的在于辑此说明所谓 GCC 前端的编程方法。限于篇幅,本文只能略略讲一下 GCC 前端的内部结构的框架部分。本文中所涉及到的源程序均位于 GCC 源码包中的 gcc/ 目录和 gcc/treelang/ 目录下。本文的代码分析基于 GCC CVS 中的最新(2003 年六月)的开发版本。
GNU 编译器家族 GCC 介绍
作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作 GCC 的时候,还只是把它当作仅仅一个 C 程序语言的编译器;GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言,C++ 语言,Java 语言,Objective C 语言,Pascal 语言,COBOL 语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。
另一方面,说到 GCC 对于各种硬件平台的支持,概括起来就是一句话:无所不在。几乎所有有点实际用途的硬件平台,甚至包括有些不那么有实际用途的硬件平台,比如 Don Knuth 设计的 MMIX 计算机,GCC 都提供了完善的支持。
我们在这篇文章中要弄清楚的就是 GCC 是如何做到能够支持这么多种程序语言的。所谓的 GCC 的程序语言前端到底是怎么回事。如果我们要设计实现自己的编程语言的话,应该从何入手。回答这些问题的第一步,就是分析清楚 GCC 源码包中,为了说明 GCC 的程序语言前端的编写方法,而写作的 Treelang 编程语言在 GCC 中的实现细节。
如果把我们自己的程序语言的实现建立于 GCC 之上,也立刻使得我们的程序语言的实现版本可以运行在几乎所有有用的硬件平台之上。这对于程序语言的作者来说,也是一个确实的有极大诱惑力的好处。
关于代码分析
在这一小节里面我们着重说明两个问题:第一、为什么要阅读源代码;第二、代码分析应该怎么写。
阅读源代码对提高自己的编程水平是非常有帮助的。这个帮助至少体现在两个方面。第一个方面是学会大型软件项目设计的模式。这样的模式是真实可靠的第一手资料,这样学来的模式要比从书本上,用日常语言陈述的模式,更能深入到你的脑海中去。而且它的真实性和可靠性都是有保证的。并且这样的模式还非常的具体。我曾经看到计算机系的同学推荐去读亚历山大的建筑学方面的经典著作;个人以为这是走的太远了。与其去读建筑学的书,不如去分析一下成功的自由软件项目的源代码。具体的用代码说明的模式,无论如何要比虚无飘渺的美学概念,或者模棱两可的工程纪律,都要更加容易学习吧?
阅读源代码的第二个好处,是增加自己的自信心。就象学习英语,要和别人谈话,要看看别人的文章,不能只是看教科书上的简单的例子。教科书上的例子限于篇幅,不可能做到像真实、完整的英文小说那样,把一个完整的设计呈现在你的面前。只有当你硬着头皮,抛开字典,把一本英文小说生生啃下来之后,你才能有把握说:我的确能做到。类似的,只有当我们看过大型软件项目的源代码,作过修改,摸爬滚打之后,我们才能有把握的说:我也能写出来。
上面说了阅读源代码至少有这么两个好处。那么在阅读源代码的时候,我们必然要做代码分析笔记。这个代码分析笔记如何写,这就是我们关心的一个问题了。在这里,我提出一些我自己的也许不太成熟的看法,也请读者朋友们不吝指教。
我总觉得,与其作一行一行的代码注释,说明每一行代码的作用;不如设计一个故事,把代码的框架说清楚。这也是我前面提到的,所谓模式一说。因为阅读源代码,最关键的是要了解大型软件项目设计的模式,而不是要把每一次读者分析每一行代码细节的乐趣从此剥夺掉。
另一方面,代码分析的写作风格,可以是参考手册似的;也可以是航海日志似的。我个人觉得参考手册似的代码分析是比较乏味的,读起来乏味,写起来也不免乏味,虽然它可能更有用。对于一个急着要快点结束加班工作的软件工程师来说,也许参考手册更加实用。但是对于一个想要了解这一份成功的软件背后的工作奥秘的探索者来说,一个航海日志似的代码分析,也许读起来更有味道,更能让一个程序员在键盘与屏幕之间,体会到那地理大发现的激动与乐趣。
本文后面的代码分析,就是希望能写成这样的风格。可是作者笔力有限,如有不足之处,还请读者朋友们不吝指教。
Treelang 的代码框架
读者朋友们在阅读这一部分代码分析的时候,手边最好能准备上一份 GCC 3.3 的源代码。这个源代码可以从 GCC 的站点 http://gcc.gnu.org 上获得。本文作者力图做到把整个情况像说故事一样娓娓道来,但是读者朋友们如果在适当的时候能够查阅一下源代码,可能更能把问题了解的清楚透彻。
这个 treelang 语言的实现,主要有两个 C 语言文件,把整个代码框架分成两个部分。第一部分以 tree1.c 为主,带上 parse.y 这个 YACC 源程序,组成了和 GCC 前端的接口;第二部分以 treetree.c 为主,组成了和 GCC 后端的接口。
这里首先说明一下 tree1.c 这个文件。它和上级目录中的 GCC 框架文件 toplev.c 交互作用,实现 tree1 这个执行程序的主体部分。这个 tree1 就相当于 GCC 的 C 语言前端中的 cc1 执行程序,该程序是 C 语言编译器前端的主体。
我们首先试图说明从 toplev.c 到 tree1.c 的路径。这样我们就注意到 toplev.c 中这个引人注目的 lang_hooks 变量。当然,接下来就注意到在 toplev.c 同一目录下的 langhooks.c 这个文件。我们希望在其中发现一点有趣的东西。这一共是三个文件:langhooks.[ch] 和 langhooks-def.h 其中在 langhooks.h 中定义了一堆各式各样的 struct lang_hooks_for_xxx 结构,以及最后还有一个 struct lang_hooks 结构把前面的那些 for_xxx 的结构都总括了起来。这每一个结构都是若干个至少看上去像是回调函数的函数指针。看来这就是我们要寻找的东西。那么大概就是这样了,编译器前端向 GCC 主体部分注册自己的 lang_hooks 来完成各样的任务。接下来一个自然的问题就是这个注册是如何进行的;另外一个问题就是要对这些回调函数指针进行分析了。
这个 langhooks.h 文件中关于 struct lang_hooks 结构字段的注释很详细,这里我们暂时先跳过去。等到 treelang 中具体的注册回调函数出现的时候,我们根据需要再做仔细说明。在 langhooks-def.h 文件中定义了一些这个 struct lang_hooks 结构的默认值。
现在我们进入 treelang 目录下的 treetree.c 这个文件。来察看一下在 treelang 中对 struct lang_hooks 这个结构的初始化过程。这个过程不是按照我们通常所熟悉的 C 语言的 C99 标准或者是 GCC 扩展语法来进行的。而是采用了大量的 #define 和 #undef 并结合上层目录中的 langhooks-def.h 来进行。细想一下,这是理所当然的事情,因为这是在编译 C 语言编译器本身嘛。当然就不好用到 C 语言的新的东西或者是自己做的扩展的东西。
注释开始:::::
我们以初始化如下定义的 struct sample 结构为例。
struct sample { int member_int; char *member_str; void (*member_fun)(void);};
在 C99 中,初始化一个 struct 结构数据,使用下面这样的语法。
struct sample inst_c99 = { .member_int = 78, .member_str = “iloveqhq”, .member_fun = real_fun,};
在 C99 标准出现之前,GCC 定义了自己的扩展,下面的例子就是按照这个 GCC 对 C 语言的扩展,来初始化一个 struct 结构数据。
struct sample inst_gcc = { member_int: 76, member_str: “zhaoway”, member_fun: real_fun,};
在 GCC 的源代码中没有使用上面的两种办法,而是大量使用了宏定义。这个办法首先要申明一份辅助的宏定义。这些个辅助的宏定义,在一个软件项目里面,针对一个 struct 结构,只需要一份即可。
#define MEMBER_INT 0#define MEMBER_STR “”#define MEMBER_FUN NULL #define SAMPLE_INITIALIZER { \ MEMBER_INT, \ MEMBER_STR, \ MEMBER_FUN, \}
按照上面这样的办法申明了这些关于这个 struct sample 的辅助宏定义以后,在每次要初始化一个 struct sample 数据结构的时候,只需要按照如下操作即可。除了要稍微多打一些字以外,这个方法的方便程度和以上两种方法是差不多的。
#undef MEMBER_INT#define MEMBER_INT 12#undef MEMBER_STR#define MEMBER_STR “trtr”#undef MEMBER_FUN#define MEMBER_FUN real_funstruct sample inst_def = SAMPLE_INITIALIZER;
这样就也可以像 C99 标准或者 GCC 的扩展一样,按照成员变量的名称来初始化一个 struct 类型的数据结构了。不过话又说回来,在我们一般的软件项目中,还是应该沿着 C99 标准这个 C 语言的发展方向来走的。
:::::注释结束
接下来的线路很清楚,就是一个一个的分析这些个回调函数啦。
对用户源文件进行语法分析
这个 treelang 注册的这些回调函数在 GCC 主框架那里被调用的顺序,我们暂时还不想深入。拣有意思的先看看吧。首先关注的是 treelang_parse_file 这个函数。在 langhooks.h 里面关于这个回调函数所作的注释说明,是要它对用户的整个源文件进行语法分析。因为这个函数的返回值是 void 所以我们预期它是通过设置某一个全局变量来完成任务的;但是也有另外一种可能,就是它会把所有要做的事情都给做完,这样它也就自然不需要返回值了。这两种可能我们现在还不能确定。让我们往下看吧。
这个 treelang_parse_file 函数在 tree1.c 中定义,这是属于到 GCC 前端的接口。它直接就跑去调用 yyparse 这个 YACC 主函数了。这倒是简单,呵呵。可是要我们从 parse.y 文件中理出个头绪来,这个文件有超过 900 行的 YACC 代码,未免有点麻烦。最关键的是这中间数据的交流不大容易看清楚,不像回调函数指针这样显而易见。如果程序果真是通过设置一些全局变量来完成任务的话,我们的分析任务就有点棘手了。
注释开始:::::
在这里先说一下 tree 这个数据结构。这是 GCC 围绕着 C 和 C++ 语言的语法分析,用到的主要数据结构。所有其它语言的编译器前端,也都需要在语法分析阶段结束以后,为 GCC 生成相应的 tree 结构的数据。然后 GCC 的后端就可以从 tree 生成独立于平台的 RTL 数据结构,并随后生成相应平台上的机器语言代码。所以作为 GCC 的编译器前端,这里的主要工作就是从一个文本文件,也就是源代码,生成这个 tree 结构的数据,喂给编译器的后端。我们看到,前端是依赖于编程语言的;后端是依赖于机器平台的;中间的 tree 和 RTL 则独立于编程语言和机器平台。但是话虽如此说,这个 tree 和 RTL 数据结构也还是主要以 C 和 C++ 语言为考虑问题的中心。这是不可避免的事情。
:::::注释结束
好啦,没办法啦。我们这就开始从 treelang 目录下的 parse.y 一行一行的往下瞅吧。这个 Treelang 程序语言的语法很简单,我们看到哪儿,说到哪儿。
注释开始:::::
在看 GCC 的源代码的时候经常会遇到 GTY 这个东西。这是 GCC 内部的内存管理机制所需要的,在 C 语言代码上添加的一些类型信息,这些类型信息在 GCC 内部做垃圾收集的时候会用到。这个细节我们这里先忽略过去,以后讲到相关内容的时候再做说明。
:::::注释结束
在 parse.y 中的一些主要的产生式上所匹配的 C 函数,它们所做的工作大体上都是首先根据语法分析的结果,把自己定义的结构 struct prod_token_parm_item 里面的数据先给设置好;然后根据情况调用在 treetree.c 中定义的相关函数,生成 tree 结构的数据;这之后再把返回来的 tree 结构数据记录在 struct prod_token_parm_item 里面,并把整个结构的数据放到 symbol_table 这个单向链表上。这样看来,似乎这个 symbol_table 就是我们前面所要寻找的全局变量了。是不是在语法分析任务完成以后,就获得了这个全局变量;然后依赖于这个全局变量,后续任务才得以获得输入数据,继续往下执行呢?
我们来仔细看一看 tree1.c 中这个 symbol_table 变量的定义如下。
static GTY(()) struct prod_token_parm_item *symbol_table = NULL;
注意到这是被申明为 static 的变量。在 Samuel P. Harbison III 和 Guy L. Steele, Jr 所合著的 C: A Reference Manual 的英文版的第五版第八十三页上,关于 static 变量有如下说明:”On data declarations, it always signifies a defining declaration that is not exported to the linker.”换句话说,这个 static 的 symbol_table 变量,在 tree1.o 之外是看不见的。这不可能是我们所要寻找的全局变量。
可是,另一方面,除了这个变量有点像是那么一回事之外,其它的就再也没有什么有趣的变量了。这是怎么一回事呢?我们先不管它,往下看了再说吧。
那么这个 parse.y 文件大体如是啦。其它的一些具体的细节问题,牵涉到 Treelang 程序语言的具体定义,暂且不是我们的兴趣所在。粗粗的看一遍下来,这个语法分析的过程,从 GCC 的主体结构上,经由 lang_hooks 进入 treelang 部分的 yyparse 函数,这个函数按照语法定义,把编译器用户输入的 Treelang 语言的源程序分解成若干类型的小块,加以分析,生成自己定义的 struct prod_token_parm_item 结构的数据,再把这些数据一个一个串到 symbol_table 这个链表上面;这样就算完成任务了。线索从 lang_hooks 中定义的这个回调函数撤出,再度回到 GCC 的主体框架。
对了,上面还忘了说,在把用户输入的 Treelang 语言的源程序进行分解以后,在分析的过程中,按照各种类型的小块,还生成了相应的 tree 结构的数据,一起记录在各自的 struct prod_token_parm_item 结构里面,这样就一并把这个 tree 结构的数据也都放在了 symbol_table 这个链表里了。
接下来回到 GCC 的主体框架上的 toplev.c 文件。可是迷惑人的事情出现了,在函数 compile_file 对回调函数 treelang_parse_file 进行调用之后,无论是在 toplev.c 文件中,还是说在哪一个其它的回调函数里也好,似乎都并没有什么有趣的事情发生了。这让我们如何是好?看来我们只有回过头去仔细跟踪 treelang 目录下的 treetree.c 文件中的那些函数,看看它们在被 parse.y 中的产生式调用执行的时候,到底干了些什么。
语法分析的细节
根据从 parse.y 这个 YACC 文件中的产生式得来的线索,我们首先关注 treetree.c 文件中的 tree_code_create_variable 这个函数。从那个 YACC 产生式,我们估计这个函数是为一个变量申明而构造必要的 tree 数据结构。这个函数有 100 行不到的源代码。我们来仔细的看一看。这个函数使用了从 GCC 的框架结构里面来的关于 tree 数据结构的一些 API 接口。我们目前所最感兴趣的,就是这个函数在利用这些接口函数构造一个和所对应的 YACC 产生式相当的 tree 结构数据以外,还干了些什么。我们之所以关心这个”以外”,是因为目前我们最想了解的,是这个从 Treelang 语言的源程序开始,到一连串的 tree 结构数据,然后是怎么变成 RTL 结构的数据的。只有在有了这样一个概观以后,我们对 GCC 前端的编写方法才能算有了一个初步的大概的了解。
根据这样的思路,我们很快就看清楚,在这个 tree_code_create_variable 函数中,在设置好若干个局部的 tree 结构的数据以后,引人注目的在一个 if 语句的分支中调用了 rest_of_decl_compilation 这个函数。而且在这个函数被调用返回以后,似乎不再有重要的事情发生了。这个函数来自于 GCC 框架结构上的 toplev.c 文件。这样的话,根据我们前面的分析,这个函数里面应该会隐藏有我们的主要问题的答案。也就是说,在 YACC 文件 parse.y 把用户提供的 Treelang 语言的源文件肢解以后,在 treetree.c 中的相应的函数,为之生成了相应的 tree 结构数据,而在现在我们所关注的这个 rest_of_decl_compilation 函数(以及在这个 if 语句的另一个分支中出现的一系列相应的函数)中,应该会完成从 tree 结构的数据到 RTL 数据的翻译。
从另一个角度补充一点,程序的执行线索是如何从 GCC 主框架进入 parse.y 中的呢?这一段我们前面分析过了,现在再来提醒一下。这是从 GCC 的框架结构,进入到 treelang 这个 GCC 的语言前端模块注册的 lang_hooks 结构的数据,找到相应的回调函数,最终找到 parse.y 这个 YACC 程序的入口 yyparse 函数的。在 yyparse 之后,我们看到程序的主线索进入了 treelang 目录下的 treetree.c 文件中的函数。最后,我们重新又追踪到 GCC 主体部分的 toplev.c 文件中的函数。现在我们的整个图景的大轮廓就快要完全弄清楚了。
GCC 前端的全景图
终于,我们在 rest_of_decl_compilation 函数中,看到了一系列的和 RTL 相关的函数调用。稍微仔细的看了一遍之后,我们有把握得出这个结论了。我们在本文的开头部分,曾经猜想 GCC 的主体部分在要求 GCC 这个 Treelang 语言前端从用户提供的 Treelang 语言的源程序文本,经过语法分析,得出相应的 tree 结构数据以后,会把这个数据通过函数返回值传回给 GCC 的主体程序,或者设置一个全局变量,这样就算完成任务了。但是事实上,经过我们上面的分析,发现不是这么一回事。
相反的,在 Treelang 这个语言前端得到需要的 tree 结构的数据以后,继续往下的运行,这完全是 Treelang 前端必须自己负责的任务。这个 GCC 前端必须自己调用 GCC 主体部分提供的,用来从 tree 结构数据生成 RTL 结构数据的函数接口,以完成从 tree 结构数据到 RTL 结构数据的翻译过程。这样,这个 GCC 的语言前端的任务才算完成。换句话说,GCC 的这个语言前端承担的角色是非常的主动的。很明显,这样的设计提供给我们极大的灵活性。关于这一点,我们以后会逐渐看到。
小结
本文限于篇幅,只大略讲述了 GCC 前端的框架结构,给出了一个粗略的全景图。在以后的几篇文章中,我们将进一步探索 GCC 的主体部分为 GCC 前端所提供的 API 函数和数据结构。并利用这些知识,探索一下为 GCC 编写一个 Scheme 语言前端的可能性。在这一系列文章结束的时候,希望能使得读者朋友们对 GCC 以及程序语言的本质有一个更加深刻的了解。也希望 GCC 的前端的作者人数,就能和 Linux 内核模块的作者人数一样多。我们的座右铭是:每一个人都是程序员;每一个人都能加载自己编写的内核模块;每一个人都能使用自己实现的编程语言!(不要害怕,这只是一句玩笑话。呵呵。)
在技术内容以外,本文也探索了开放源码运动所需要的技术文档的一种写作模式。开放源码运动为我们带来了大量的自由软件的源程序。对于用户来说,需要文档讲述如何使用这些自由软件;对于程序员来说,则需要文档讲述如何才能理解并真正的掌握这些自由软件的源程序。这第二种文档的写作,不是一件容易的事情。作者本人在经常阅读解释自由软件的源程序的内部运作机理的文档的过程中,总是觉得这件事情应该可以有办法做的更好。本文就是作者的一个尝试。希望读者朋友们给我来信,不仅仅讨论 GCC 的技术问题,也欢迎对作者的写作方式提出批评与指教!
参考资料
Internals of the GNU Compiler Collection http://gcc.gnu.org/onlinedocs/gccint/ 这其实也就是 info gccint 的内容。这份文档是除了源代码以外最权威的资料了。不过它的可读性恐怕不是那么好。初上手阅读的时候,恐怕会非常困惑的。
The GNU Treelang Compiler 手册,这其实也就是 info treelang 的内容。这个作为例子的 Treelang 程序语言基于 Tim Josling(见下)为了阐明 GCC 前端的编写方法而发明的一个玩具编程语言。
Sreejith K Menon 编写的 GCC Frontend HOWTO http://www.tldp.org/HOWTO/GCC-Frontend-HOWTO.html 被收录在 The Linux Documentation Project 的 HOWTO 文集中。这份资料可能是可读性最强的了吧?当然,这是说除了本文之外啦。:-)
Using, Maintaining and Enhancing COBOL for the GNU Compiler Collection http://cobolforgcc.sourceforge.net/cobol_toc.html 这是由 Tim Josling 领导的 COBOL for GCC 项目的文档,其中原先由 Joachim Nadler 所编写的第十四章,后来由 Tim Josling 从德文翻译成英文;这一章讲述了 GCC 前端的编写方法。
Using and Porting GNU Fortran 手册 http://gcc.gnu.org/onlinedocs/g77/ 中关于 Front End 的一章也讲述了我们感兴趣的内容。
自由大百科全书 Wikipedia 中关于 GCC 编译器家族的条目 http://www.wikipedia.org/wiki/GNU_Compiler_Collection 对 GCC 有个概括介绍。关于 GCC 内的 RTL 数据结构的条目 http://www.wikipedia.org/wiki/Register_Transfer_Language 以及关于 GCC 的前端使用的 Tree 数据结构的条目 http://www.wikipedia.org/wiki/GCC_Abstract_Syntax_Tree 也都值得一看。
用 Doxygen 文档生成工具制作的 GCC Source Documentation http://www.nondot.org/gcc/ 有兴趣的话也可以看一看。
在阅读大型的 C 语言项目的源代码的时候,手头有一本好的、全的 C 语言参考手册也是很重要的。
关于 C 语言的一本比较好的书是 Samuel P. Harbison III 和 Guy L. Steele, Jr. 合著的 C: A Reference Manual 第五版。这本书的英文影印版最近在国内出版了。作者之一 Guy L. Steele, Jr. 是 Scheme 编程语言的发明人之一,也是 Java 语言规范的作者之一,更是 ACM 的 Grace Murray Hopper 奖 1988 年的获得者。
