﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客网-weitom1982-随笔分类-计算机基础知识</title><link>http://www.cnitblog.com/weitom1982/category/1320.html</link><description>向各位技术前辈学习,学习再学习.</description><language>zh-cn</language><lastBuildDate>Sat, 29 Sep 2007 09:07:28 GMT</lastBuildDate><pubDate>Sat, 29 Sep 2007 09:07:28 GMT</pubDate><ttl>60</ttl><item><title>WinCVS操作手册</title><link>http://www.cnitblog.com/weitom1982/archive/2007/09/27/34090.html</link><dc:creator>高山流水</dc:creator><author>高山流水</author><pubDate>Thu, 27 Sep 2007 06:11:00 GMT</pubDate><guid>http://www.cnitblog.com/weitom1982/archive/2007/09/27/34090.html</guid><wfw:comment>http://www.cnitblog.com/weitom1982/comments/34090.html</wfw:comment><comments>http://www.cnitblog.com/weitom1982/archive/2007/09/27/34090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/weitom1982/comments/commentRss/34090.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/weitom1982/services/trackbacks/34090.html</trackback:ping><description><![CDATA[<div align=center><strong><font size=6>WinCVS操作手册</font></strong></div>
<div>&nbsp;</div>
<div style="MARGIN-RIGHT: 1.25pt"><strong><span style="FONT-SIZE: 12pt">撰稿：paladin.lin<span>&nbsp;&nbsp;&nbsp;&nbsp; 2003</span>年11月5日</span></strong></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 25.55pt; TEXT-INDENT: -25.55pt"><strong><font size=5><span style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%">第一章：&nbsp;</span>概述</font></strong></div>
<div style="TEXT-INDENT: 21pt">CVS是目前比较流行与优秀的版本管理与控制工具，是用来管理其它日常文档（如word工作文档之类）的一个强有力的工具。</div>
<div style="TEXT-INDENT: 21pt">WinCVS是CVS的一个客户端软件，它运行在Windows上，采用图形化方式登陆CVS服务器和CVS相关的操作与管理，不要学习复杂的cvs命令。企业内部都采用Linux/Unix做服务器，用Windows做客户端，所以WinCVS与CVS服务器是目前应用最广泛的版本控制与管理的组合。</div>
<div style="TEXT-INDENT: 21pt">本文主要介绍WinCVS的日常操作， CVS服务器的配置将在另外的文章中介绍，本文所有操作是基于CVS服务配置正确、数据仓库已初始化的基础上，</div>
<div style="MARGIN-LEFT: 25.55pt; TEXT-INDENT: -25.55pt"><strong><font size=5><span style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%">第二章：&nbsp;</span>术语</font></strong></div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -33pt; TEXT-ALIGN: left" align=left><strong><span>1、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong>Repository</strong>-------仓库<span>:</span> CVS服务器的根目录。模块（<span>Module）的集合</span> </div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -33pt; TEXT-ALIGN: left" align=left><strong><span>2、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong>Module</strong>------------模块<span>:，CVS服务器根目录下的</span>第一级子目录。通常用于存放一个项目的所有文件</div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -33pt; TEXT-ALIGN: left" align=left><strong><span>3、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong>Checkout</strong>----------检出<span>:</span> 通常指将仓库中的一整个模块首次导出到本地。</div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -33pt; TEXT-ALIGN: left" align=left><strong><span>4、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong>Import</strong>------------导入<span>:</span>通常指通过提交整个目录结构并创建一个新的模块。</div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -33pt; TEXT-ALIGN: left" align=left><strong><span>5、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong>Release</strong>-------发行版本<span>:</span>整个产品的版本</div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -33pt; TEXT-ALIGN: left" align=left><strong><span>6、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong>Revision</strong>--------修订版<span>:</span>单个文件的版本</div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -33pt; TEXT-ALIGN: left" align=left><strong><span>7、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong>Tag</strong>---------------标签<span>:</span>在一个开发的特定期对一个文件集给定的符号名</div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -33pt; TEXT-ALIGN: left" align=left><strong><span>8、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong>Update</strong>------------更新<span>:</span>从模块中下载其他人的修改过的文件。更新本地的拷贝。</div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -33pt; TEXT-ALIGN: left" align=left><strong><span>9、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong>Commit</strong>------------提交<span>:</span>将自己修改过的文件提交到模块中。</div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 25.55pt; TEXT-INDENT: -25.55pt"><strong><font size=5><span style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%">第三章：&nbsp;</span>WinCVS初始化配置</font></strong></div>
<div style="MARGIN-LEFT: 2cm; TEXT-INDENT: -43.1pt"><strong><span style="FONT-SIZE: 12pt">第一步：<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">安装</span><span style="FONT-SIZE: 14pt">Wincvs</span></div>
<div style="MARGIN-LEFT: 63pt">执行setup.exe安装,然后在一步步的确认就ok了.安装完毕后运行wincvs:</div>
<div style="MARGIN-LEFT: 9pt" align=center><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/e4c85d1f58984de7b2e47eb041b296de.jpg"></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 2cm; TEXT-INDENT: -43.1pt"><strong><span style="FONT-SIZE: 12pt">第二步：<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">配置</span><span style="FONT-SIZE: 14pt">WinCVS</span><span style="FONT-SIZE: 14pt">参数</span></div>
<div style="MARGIN-LEFT: 9pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/df82d77543ad4a26899a7de7871941c4.png"></div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#216;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Preferences -&gt; General :</strong><strong>普通参数设置</strong></div>
<div style="MARGIN-LEFT: 9pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/dc41654e211f4249b45e6a48f5ef98a0.png"></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span>1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Authentication :<span>&nbsp;&nbsp;&nbsp; </span></strong>验证方式,CVS默认采用<strong>pserver</strong>。</div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span>2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Path:<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong>CVS服务器的路径,就是<strong>Repository(</strong>仓库<strong>)</strong><strong>。</strong></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span>3.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Host address:</strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CVS</span>服务器的IP地址或者域名。</div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span>4.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>User name:<span>&nbsp;&nbsp;&nbsp; </span></strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>用户名。</div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span>5.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>CVSROOT:</strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CVSROOT,</span>由上面4项生成的字符串，用于连接服务器</div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><span>6.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&nbsp;</div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#216;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Preferences -&gt; Globals :</strong><strong>全局参数设置</strong></div>
<div style="MARGIN-LEFT: 21pt"><strong>&nbsp;</strong></div>
<div style="MARGIN-LEFT: 21pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/07b60a3a0253427eb153994177330e78.png"></div>
<div><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><strong><span>1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong>checkout read-only</strong><strong>： &nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong>检出只读，wincvs</strong><strong>默认导出文件为只读状态。去掉该选项。</strong></div>
<div style="MARGIN-LEFT: 39pt; TEXT-INDENT: -18pt"><strong><span>2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><strong>Prune</strong><strong>（remove</strong><strong>）empty directories&nbsp;</strong><strong>剪除（删除）空目录，去掉该选项。</strong></div>
<div><strong>&nbsp;</strong></div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#216;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Preferences -&gt; WinCVS : WinCVS</strong><strong>参数设置</strong></div>
<div style="MARGIN-LEFT: 33pt"><strong><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/5e9a2ecb24c2408f9ba87799f7df7020.png"></strong></div>
<div><strong>&nbsp;</strong></div>
<div style="MARGIN-LEFT: 2cm; TEXT-INDENT: -43.1pt"><strong><span style="FONT-SIZE: 12pt">第三步：<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">登陆</span></div>
<div style="MARGIN-LEFT: 13.6pt">&nbsp;</div>
<div style="MARGIN-LEFT: 42pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/c352e89afc4d488c93395f04aaf8cde2.png"></div>
<div style="MARGIN-LEFT: 42pt">&nbsp;</div>
<div style="MARGIN-LEFT: 42pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/2490c59c0a54495ca13b407650211c0f.png"></div>
<div style="MARGIN-LEFT: 42pt">&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/69317db4d1e443d3a4f7e8dfe34a8a71.png"></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 2cm; TEXT-INDENT: -43.1pt"><strong><span style="FONT-SIZE: 12pt">第四步：<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">导入模块</span></div>
<div style="MARGIN-LEFT: 13.6pt">&nbsp;</div>
<div style="MARGIN-LEFT: 13.6pt">&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/fc3fa8f36f7344d4944c4f85bdf80043.png"></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#216;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>选择需要导入的目录</strong></div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/35ce43e45a7e4055ac5b5c646cd4317d.png"></div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#216;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>整理导入的文件类型（Entry State</strong><strong>是OK</strong><strong>标记就无需修改）</strong></div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/f710105370a047c0ba8d0ae8b5e21d3f.png"></div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#216;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>修改选中的文件类型</strong></div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/b319edda0450410d9c88cf899b0cfe28.png"></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#216;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>导入设置</strong></div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/efb7881c5f9242c7811de5ac11e468bb.png"></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/5e0adf2028434bebac277067aff31e90.png"></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 2cm; TEXT-INDENT: -43.1pt"><strong><span style="FONT-SIZE: 12pt">第五步：<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">导出模块</span></div>
<div>cmd：</div>
<div>1 cvs checkout -P Documents/sipsir</div>
<div>该命令会在本地创建Documents</div>
<div>cvs client tool：</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/6a8cd34755be41bebcb6522903026425.png"></div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#216;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>导出设置</strong></div>
<div style="MARGIN-LEFT: 33pt">&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/5f7570b8918b4e3593ea6201c9559627.png"></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#216;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>模块成功导出</strong></div>
<div style="MARGIN-LEFT: 33pt">&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/baf8ee8cc483423a88dfd1bbf11f1bb4.png"></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 25.55pt; TEXT-INDENT: -25.55pt"><strong><font size=5><span style="FONT-SIZE: 14pt; LINE-HEIGHT: 173%">第四章：&nbsp;</span>WinCVS日常操作</font></strong></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 22.7pt; TEXT-INDENT: -8.5pt"><strong><span style="FONT-SIZE: 14pt">一、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">修改文件，并上传到服务器</span></div>
<div style="MARGIN-LEFT: 84pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#178;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>准备修改文件</strong></div>
<div style="MARGIN-LEFT: 9pt" align=center><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/4062b79eddf34eeea754efb194319de7.png"></div>
<div style="MARGIN-LEFT: 9pt" align=center>&nbsp;</div>
<div style="MARGIN-LEFT: 84pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#178;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>修改文件</strong></div>
<div style="MARGIN-LEFT: 63pt"><strong>&nbsp;</strong></div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/920d8c52e3b3427e9c7060df1e9be949.png"></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 84pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#178;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>上传的修改文件</strong></div>
<div style="MARGIN-LEFT: 33pt"><strong><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/fdc465d8f9fa41128433a5f07c465327.png"></strong></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/c5ac4df381e84969a651e4b223f5451e.png"></div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/8e854dddc4df408982725e96adaa887a.png"></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 22.7pt; TEXT-INDENT: -8.5pt"><strong><span style="FONT-SIZE: 14pt">二、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">下载服务器的文件，替换本地文件</span></div>
<div>假设服务器上&#8220;测试wincvs.doc&#8221;的word文件已经是1.2本,下载到本地来</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/2179beec8c5c432991fefd18e2222a8a.png"></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/23529a57eeaf47b0a4ab478f712b032c.png"></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/9c2239894589438ebeb1097df829a753.png"></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 22.7pt; TEXT-INDENT: -8.5pt"><strong><span style="FONT-SIZE: 14pt">三、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">修改了一个文件</span><span style="FONT-SIZE: 14pt">,</span><span style="FONT-SIZE: 14pt">结果发现修改错了，需要重新下载服务器的文件。</span></div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/0ea39633e4604261930cf583968ace67.png"></div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/709218c1978940c4934b2b5a27c0745c.png"></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 22.7pt; TEXT-INDENT: -8.5pt"><strong><span style="FONT-SIZE: 14pt">四、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">添加一个文件或一个目录。</span></div>
<div>cmd:</div>
<div>添加一个文件或目录</div>
<div>1 添加：<span style="FONT-SIZE: 10pt">cvs add test.txt</span></div>
<div><span style="FONT-SIZE: 10pt">2 </span><span style="FONT-SIZE: 10pt">提交：</span><span style="FONT-SIZE: 10pt">cvs commit -m "no message" test.txt</span></div>
<div><span style="FONT-SIZE: 10pt">添加目录及目录下所有文件</span><span style="FONT-SIZE: 10pt">,</span><span style="FONT-SIZE: 10pt">如</span><span style="FONT-SIZE: 10pt">D:/cvs/sipsir</span></div>
<div><span style="FONT-SIZE: 10pt">1 cd D:/cvs</span></div>
<div><span style="FONT-SIZE: 10pt">2 cvs add sipsir</span></div>
<div><span style="FONT-SIZE: 10pt">3 cd sipsir</span></div>
<div><span style="FONT-SIZE: 10pt">4 cvs add *&nbsp;&nbsp; (</span><span style="FONT-SIZE: 10pt">会把目录下所有文件和目录都添加了</span><span style="FONT-SIZE: 10pt">)</span></div>
<div><span style="FONT-SIZE: 10pt">5 cvs commit &#8211;m &#8220;&#8221;</span></div>
<div><span style="FONT-SIZE: 10pt">cvs client tool</span></div>
<div style="MARGIN-LEFT: 63pt; TEXT-INDENT: -36pt"><span style="FONT-SIZE: 14pt">&#178;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>打开需要放置文件的目录</strong></div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/f979b08fd5ba494996343ce6738d5845.png"></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 54pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#178;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>新建立一个文件或目录</strong></div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/132e183dd78f40ee84f7baf7a23bb27e.png"></div>
<div style="MARGIN-LEFT: 105pt">&nbsp;</div>
<div style="MARGIN-LEFT: 105pt">&nbsp;</div>
<div style="MARGIN-LEFT: 27pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#178;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>上传目录（如果文件中有子目录或文件，没有递归上传，需要在操作一遍）</strong></div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/6fdf9b5e8c2c4e8192471f5ef77d09af.png"></div>
<div style="MARGIN-LEFT: 27pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#178;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>上传文件</strong></div>
<div><strong><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/9d5ff183c8d34aefa9f98b7df2f2564c.png"></strong></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 84pt; TEXT-INDENT: -21pt"><span style="FONT-SIZE: 14pt">&#178;<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 12pt">文件只是标记添加成功，还需要执行上传操作（具体操作查看</span><strong>&#8220;上传的修改文件&#8221;</strong><span style="FONT-SIZE: 12pt">）</span></div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/405bc48092314433abe0d69aaa3194c1.png"></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 22.7pt; TEXT-INDENT: -8.5pt"><strong><span style="FONT-SIZE: 14pt">五、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">如何取回以前的某个版本</span></div>
<div><span style="FONT-SIZE: 14pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/c7d4b542ace44a73abeba8159cb1e2a0.png"></span></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/6c0d6a7b464a4e33823462f03db4e6b6.png"></div>
<div>&nbsp;</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/c363293b2a6749339cc7b1ed90b0b4d4.png"></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 22.7pt; TEXT-INDENT: -8.5pt"><strong><span style="FONT-SIZE: 14pt">六、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">删除分支</span><span style="FONT-SIZE: 14pt">/</span><span style="FONT-SIZE: 14pt">标签，取得最新的版本</span></div>
<div><span style="FONT-SIZE: 14pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/977628e215334a14b7dc6109a85c742b.png"></span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 14pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/b73a587ee21842129cca57fc820b6584.png"></span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 14pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/2ebbcf34c02b4a779c6630006a584db5.png"></span></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 22.7pt; TEXT-INDENT: -8.5pt"><strong><span style="FONT-SIZE: 14pt">七、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">固定版本：经过一段时间修改，各个文件的版本不一致，而且文档管理到了一个阶段，需要固定版本。</span></div>
<div><span style="FONT-SIZE: 14pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/ccaa5d157dfc41e68b2f01f77af15328.png"></span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 14pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/2eccac5205dc4b1590e9076887ee23ba.png"></span></div>
<div>&nbsp;</div>
<div><span style="FONT-SIZE: 14pt"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/0fbfce3d42bf4adfb39fa767c951edfa.png"></span></div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 22.7pt; TEXT-INDENT: -8.5pt"><strong><span style="FONT-SIZE: 14pt">八、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">删除</span><span style="FONT-SIZE: 14pt">cvs</span><span style="FONT-SIZE: 14pt">服务器上的一个文件。</span></div>
<div><span style="FONT-SIZE: 10pt">cmd</span><span style="FONT-SIZE: 10pt">：</span></div>
<div><span style="FONT-SIZE: 10pt">1 &nbsp;cvs remove -f test.txt</span></div>
<div>2 &nbsp;<span style="FONT-SIZE: 10pt">cvs commit -m "no message"</span></div>
<div><span style="FONT-SIZE: 10pt">cvs client tool:</span></div>
<div><span style="FONT-SIZE: 10pt">1 </span><span style="FONT-SIZE: 10pt">选中</span><span style="FONT-SIZE: 10pt">test.txt</span><span style="FONT-SIZE: 10pt">文件</span></div>
<div><span style="FONT-SIZE: 10pt">&nbsp; <img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/f86b902082264bfcb712bd9d0df7ece2.png"></span></div>
<div><span style="FONT-SIZE: 10pt">2 </span><span style="FONT-SIZE: 10pt">删除文件</span></div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/e51ae48025fe4a3eb7187abadcbf8f66.png"></div>
<div>3 提交</div>
<div><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/sipsir/7e9573f3826a4401bf6e15fb5e9133b8.png"></div>
<div style="MARGIN-LEFT: 22.7pt; TEXT-INDENT: -8.5pt"><strong><span style="FONT-SIZE: 14pt">九、<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></strong><span style="FONT-SIZE: 14pt">删除</span><span style="FONT-SIZE: 14pt">cvs</span><span style="FONT-SIZE: 14pt">服务器上的一个目录。</span></div>
<div><span style="FONT-SIZE: 10pt">假设要删除</span><span style="FONT-SIZE: 10pt"> %cvs_home%\sipsir</span><span style="FONT-SIZE: 10pt">目录</span><span style="FONT-SIZE: 10pt">,</span> 需要先删除目录中的所以文件，使该目录成为一个空目录，然后运行cvs update -P让CVS从仓库中清除空目录。</div>
<div><span style="FONT-SIZE: 10pt">cmd</span><span style="FONT-SIZE: 10pt">：</span></div>
<div><span style="FONT-SIZE: 10pt">1 cd %cvs_home%</span></div>
<div><span style="FONT-SIZE: 10pt">2 </span>cvs update &#8211;P</div>
<div>3 cvs update</div>
<img src ="http://www.cnitblog.com/weitom1982/aggbug/34090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/weitom1982/" target="_blank">高山流水</a> 2007-09-27 14:11 <a href="http://www.cnitblog.com/weitom1982/archive/2007/09/27/34090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WinCVS与CVSNT简明使用手则 </title><link>http://www.cnitblog.com/weitom1982/archive/2007/09/27/34089.html</link><dc:creator>高山流水</dc:creator><author>高山流水</author><pubDate>Thu, 27 Sep 2007 05:50:00 GMT</pubDate><guid>http://www.cnitblog.com/weitom1982/archive/2007/09/27/34089.html</guid><wfw:comment>http://www.cnitblog.com/weitom1982/comments/34089.html</wfw:comment><comments>http://www.cnitblog.com/weitom1982/archive/2007/09/27/34089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/weitom1982/comments/commentRss/34089.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/weitom1982/services/trackbacks/34089.html</trackback:ping><description><![CDATA[<div class=posttitle><a class=singleposttitle id=viewpost.ascx_TitleUrl href="http://blog.sunmast.com/sunmast/articles/563.aspx">WinCVS与CVSNT简明使用手则</a> </div>
<p><span class=14><strong>1、前言：</strong></span><br><br>CVS是版本控制的利器，目前在Linux和Windows下都有不同版本；但是国内大多数应用介绍都是基于Linux等开放源代码的开放性软件组织，而且讲解的也不系统，让人摸不着头脑；Windows下的CVS使用介绍更是了了无几。 <br>本文是针对Windows的LAN环境下使用CVS的经验介绍，一步一步的向您介绍如何配置和使用CVS的服务器端和客户端。同时，本文只使用到了CVS当中最基本的东西，还有很多更为高级的东西，本文暂不涉及。下面是本文的另一个连接映射，欢迎大家讨论使用，共同进步。 <br>文章连接http://www.kuihua.net/book/list.asp?id=66 <br>论坛连接http://www.kuihua.net/bbs/dispbbs.asp?boardID=1&amp;;RootID=670&amp;ID=670 </p>
<p><strong><span class=14>2、安装版本：</span></strong><br><br><span class=14>2.1、服务器端(CVSNT)</span> </p>
<p>1. 本文使用的是CVSNT-2.0.4，这是一个比较稳定的版本，不要使用最新的CVSNT-2.1.1，本人在使用中发现有比较严重的Bug。 <br>2. 下载连接http://www.cvsnt.org 目前，它提供2.0.6和2.1.1版本的下载。 <br>3. 上面连接还提供源代码，有兴趣的朋友还可以下载下来仔细研究：）。 <br>4. 有心的朋友，仔细观察就会发现http://www.cvsnt.org 并没有提供任何客户端的下载，那是因为CVS.exe既可以用于服务器端又可以用于客户端，WinCVS是为了客户端使用的方便而定制的外壳。（关于这一点，本人未得到任何证实，只是本人在使用过程中的一种体会，欢迎大家讨论。） </p>
<p class=14>2.2、客户端(WinCVS) </p>
<p>1. 本文使用的是WinCVS-1.3b13，这应该是一个最新版本：），本人在使用过程中并没有发现有任何严重的Bug。 <br>2. 下载连接http://sourceforge.net/projects/cvsgui/ <br>3. 此网站还提供丰富的CVS文档和相关源代码，以及多个OS下面的相关文档和代码；有收藏癖的朋友有福了：）。 <br>4. WinCVS-1.3b13 使用的CVSNT的版本是CVSNT-2.0.2，在与服务器端的CVSNT-2.0.4 版本配合使用时，未发现任何不兼容或冲突现象。 <br>5. 在本人的系统中用cvs version命令显示的结果如下： <br>Client: Concurrent Versions System (CVSNT) 2.0.2 (client/server) <br>Server: Concurrent Versions System (CVSNT) 2.0.4 (client/server) </p>
<p class=14><strong>3、服务器端(CVSNT)的安装与配置：</strong> </p>
<p class=14>3.1、服务器端机器和环境配置： </p>
<p>1. 操作系统：Windows 2000 Professional SP2中文版 <br>2. 机器名称：Server <br>3. 机器地址：192.168.0.6 (内部IP) <br>4. 网络环境：100兆交换局域网 <br>5. 硬盘分区格式：FAT32与NTFS都可以。 <br>6. 准备2个CVSNT的工作目录： <br>F:\KHRoot (存放自己源代码的根目录) <br>F:\KHTemp (存放CVS出错信息的目录) <br>7. 本机上存在有的用户列表：（由NT或本机的使用者创建） <br>Administrator (系统管理员) <br>Jackey (普通用户) <br>Goury (普通用户) <br>Riolee (普通用户) </p>
<p class=14>3.2、安装CVSNT： </p>
<p>1. 下载CVSNT-2.0.4；使用administrator登陆到Server机器上。 <br>2. 双击自解压的exe文件，选择Full Install，其它按照默认方式安装；安装完毕后可以在服务控制器中发现多了2个服务：cvsnt与cvslocking <br>3. 发送Service Control Panel到桌面，形成快捷方式。 <br>4. 安装程序会自动将CVS安装路径，设置到系统的Path环境变量当中，因此使用者可以在控制台(cmd)中任意位置执行cvs.exe，这一点对下面的配置很重要！！ </p>
<p class=14>3.3、配置CVSNT服务器： </p>
<p>1. 双击Service Control Panel快捷方式，在Service Status页面，确认2个服务正常和稳定运行。 <br>2. 选择Repository页面，点按Add按钮，选择已经准备好的F:\KHRoot这个目录，确认，OK，Yes，这时会在F:\KHRoot下面建立CVSRoot目录，这是CVS默认的管理目录（默认模块）。如果报错，那是系统Path路径未设置正确。 <br>3. 选择Advanced页面，勾上Use local users for pserver ...，（Why? I don&#8217;t know!J）,在Temporary栏选择已经准备好的F:\KHTemp，确认，OK。 <br>4. 点按【应用】按钮，确认，退出，OK，搞定！！ </p>
<p><span class=14>3.4、小结：</span><br><br>1. 至此，CVSNT服务器端基本配置完毕，下面进行WinCVS的使用和管理。 <br>2. 由于CVS支持远程管理，也就是客户端与服务器集成的特性，因此，我们将添加用户、权限控制、模块维护等所有的管理工作都放到远端(WinCVS)进行管理，服务器端这时可以Ctrl+Atl+Del进入锁定状态了，下面的所有工作都交给远端的WinCVS来进行管理。 </p>
<p><span class=14><strong>4 客户端(WinCVS)的安装与配置： </strong></span></p>
<p><span class=14>4.1 客户端机器和环境配置：</span><br><br>1. 操作系统：Windows 2000 Professional SP2中文版 <br>2. 机器名称：YCW2000 <br>3. 机器地址：192.168.0.2 (内部IP) <br>4. 网络环境：100兆交换局域网，可以直接访问到Server <br>5. 硬盘分区格式：FAT32与NTFS都可以。 </p>
<p class=14>4.2 安装WinCVS： </p>
<p>1. 下载WinCVS 1.3b13，全部按照默认安装就可以了。 <br>2. 启动WinCVS，开始使用。特别注意：以下的所有操作都是在YCW2000(192.168.0.2)这台机器上远程完成的，此时的Server(192.168.0.6)主机已经进入了锁定状态。 </p>
<p class=14><strong>5 管理员使用WinCVS进行远程管理： </strong></p>
<p class=14>5.1 配置WinCVS成管理员状态： </p>
<p>1. 准备管理员工作目录：(在YCW2000机器上) <br>E:\CVSClient\Admin (管理员工作目录) <br>E:\CVSTemp (WinCVS临时目录) <br>2. 第一次启动WinCVS时会自动弹出Preferences配置页面，也可以通过Admin=&gt;Preference菜单进入；第一次使用时需要配置如下的3个页面： <br>General页面设置： <br>注：按照图示方式输入即可，需要注意的是Path部分的格式是Unix路径格式，它指的是CVSNT端设置的工作根目录。 <br>CVS页面设置： 注：Home路径是设置密码等文件的存放位置，必须指定，否则在登陆时，WinCVS也要弹出设置框。这个Home路径需要Python.exe这个外挂程序才有效。这里选择已经准备好的路径：E\CVSTemp <br>WinCVS页面设置： <br>注：此页面设置WinCVS的外挂编辑程序，通常使用UltraEdit比较方便。 <br>3. 设置管理员的工作路径：可以点按图标 ，或View=&gt;Browse Location=&gt;Change&#8230;菜单进行设置，选择已经准备好的路径：E:\CVSClient\Admin，确认，OK，这时此目录将出现在WinCVS的左边导航栏【Workspace】内。 <br>4. 至此，WinCVS就被配置成了远程的管理员使用状态，下面进行一般管理员需要的基本操作演练。演练的内容为：Administrator需要管理Jackey，Goury，Riolee三个用户，分别为这3个用户建立工作目录，每个人只能访问自己的工作目录。同时，只有Administrator能够进行权限分配，其它人没有任何管理权限。 </p>
<p class=14>5.2 管理员进行管理演练： </p>
<p>1. 登陆远程CVSNT： <br>　　◇ 选择Admin=&gt;Login菜单，默认设置，OK。 <br>　　◇ 弹出密码输入框，确认，OK。注意观察输出框【OutPut】的返回结果。 <br>2. Checkout默认模块：（CVSRoot管理模块） <br>　　◇ 在左边导航栏【Workspace】内，选择【Admin】点按右键，选择【Checkout <br>　　modules&#8230;】，在【Checkout settings】中输入CVSRoot，确定，OK。如下图： <br>　　◇ 如果成功的话，会在【Admin】栏下增加一个【CVSRoot】目录。表示您已经将【<br>　 CVSRoot】这个管理模块下载到本地了。 </p>
<p><span class=14>3. CVS中目录权限介绍：</span><br><br>◇ 系统支持的目录权限列表： <br>r (读取权限) <br>w (写入权限) <br>c (创建和删除权限) <br>n (没有任何权限) <br>◇ 默认情况下，任何用户都拥有任何目录的所有权限。 <br>◇ 任何情况下只有目录的拥有者和Administrator才有权力更改目录的使用权限。下面将会介绍如何修改目录权限和目录的拥有者。 </p>
<p class=14>4. 修改CVSRoot的权限：只让Administrator拥有rcw三种全部权限。 </p>
<p>◇ 选中刚刚下载的【CVSRoot】模块，【Ctrl+L】或Admin=&gt;Command Line&#8230;，弹出Command Line Settings对话框，直接执行CVS命令。 <br>◇ 取消所有用户的默认权限：cvs chacl default:n 回车，OK，完成。 <br>◇ 设置Administrator拥有所有权限：cvs chacl administrator:rcw 回车，OK，完成。 <br>◇ 更改【CVSRoot】的拥有者：cvs chown administrator 回车，OK，完成。 <br>◇ 查看【CVSRoot】的权限状态：cvs lsacl 回车，OK，在【Output】中显示： <br>Owner: administrator <br>default:n <br>administrator:rwc <br>◇【CVSRoot】的权限配置完毕。 </p>
<p class=14>5. 编写代码库中的模块文件，便于多用户下载方便。 </p>
<p>l 需要自己编写的模块文件格式如下：(实现基本功能) <br>【模块一的描述】【n个空格或参数】【相对目录路径一(DirA)】 <br>【模块二的描述】【n个空格或参数】【相对目录路径二(DirB)】 <br>&#8230;&#8230; <br>【模块X的描述】【n个空格或参数】【相对目录路径X(DirX)】 <br>◇【描述信息】与【相对路径】在字面上不一致时，需要使用-a参数。 <br>◇ 【相对路径】指的是CVS会自动带上根路径，这里是F:\KHRoot，所以上面例子的完整路径为：F:\KHRoot\DirA <br>◇ 了解了模块文件结构，现在来实际操作一把：双击【CVSRoot】模块下的modules文件，用UltraEdit打开进行编辑。 <br>◇ 为Jackey，Goury，Riolee三个用户分配工作目录和完成其它模块描述。 <br>CVSRoot CVSRoot <br>Jackey工作目录 -a Jackey <br>Goury工作目录 -a Goury <br>Riolee工作目录 -a Riolee <br>◇ 编辑完毕，存盘。回到WinCVS，选中modules这个文件【Ctlr+M】或右键选择【Commit selection&#8230;】，默认设置，【确认】，OK，完成上传。 </p>
<p class=14>6 . 为三个用户分别上传工作目录： </p>
<p>◇ 在YCW2000机器上的E:\CVSClient\Admin分别建立三个目录分别名为：Jackey，Goury，Riolee，作为临时交换目录。 <br>◇ 在新创建的每个目录中用UltraEdit或拷贝一个Readme.txt作为引子文件！！：） <br>◇ 然后，回到WinCVS，在【Workspace】栏的【Admin】目录下形成如下的目录结构： <br>◇ 分别选中Goury，Jackey，Riolee，右键，点按【Import Module】，选择【Continue】，其它全部使用默认值，【确定】，OK，完成上传工作。 <br>◇ 仔细观察【Output】窗口，确认都成功上传了。 <br>◇ 转移到系统的Explore程序中，删除E:\CVSClient\Admin目录下的Jackey，Goury，Riolee三个目录。然后回到WinCVS当中。(一定要删除！！！：) <br>◇ 至此，就完成了工作目录的上传工作。 </p>
<p class=14>7. 【Checkout】下载3个用户的工作目录到【Admin】目录下： </p>
<p>◇ 在【Workspace】栏选择【Admin】目录，右键，点按【Checkout Module&#8230;】,如下图： <br>◇ 选择【&#8230;】，得到CVSNT上最新的模块配置情况，弹出如下的信息框： <br>◇ 这个结构图就是刚才在modules当中编写的模块文件格式信息。选择【Jackey工作目录】，下载到YCW2000机器的E:\CVSClient\Admin目录下。 <br>◇ 按照以上操作，依次分别下载【Goury工作目录】和【Riolee工作目录】。形成如下状态： </p>
<p><br><span class=14>8. 为三个用户分别设置各自目录的访问权限。（只有自己才能访问自己的工作目录）</span> </p>
<p>◇ 选中【Goury】目录，【Ctrl+L】或Admin=&gt;Command Line&#8230;，弹出Command Line Settings对话框，直接执行CVS命令。 <br>◇ 取消所有用户的默认权限：cvs chacl default:n 回车，OK，完成。 <br>◇ 设置Goury拥有所有权限：cvs chacl goury:rcw 回车，OK，完成。 <br>◇ 查看【CVSRoot】的权限状态：cvs lsacl 回车，OK，在【Output】中显示： <br>Owner: administrator <br>default:n <br>goury:rwc <br>◇ 按照以上的方法依次分别设置【Jackey】与【Riolee】的工作目录访问权限。 <br>◇ 至此，完成了3个用户的目录权限分配。注意，虽然Administrator也没有权力再次【Checkout】那3个用户的工作目录，但是它是这些目录的拥有者又是Administrator，因此，只有它才有权力更改这些目录的访问权限。 </p>
<p><span class=15>9. CVSNT系统中的用户管理原则：</span><br><br>◇ CVSNT的用户与本机(这里是Server机器)上的NT用户是相关联的，即CVSNT用的全是本机上存在的已有用户，因此在默认情况下可以不用设置任何用户名，只要使用本机上已经存在的用户名就可以用WinCVS进行登陆。 <br>◇ 只有用Administrator身份登陆到CVSNT系统中，才有权力进行新用户的创建和删除。 <br>◇ 使用CVS创建的新用户，必须与服务器端机器上的NT用户相绑定，才能生效；因此，这个新用户实际上是绑定它的NT用户的一个替身，在CVS系统中称为&#8220;别名&#8221;。 <br>◇ 一个NT用户可以有多个&#8216;替身&#8217;或&#8216;别名&#8217;，充当多个CVS用户。 </p>
<p class=14>10. 用WinCVS进行新用户的添加和删除。(确保使用Administrator登陆) </p>
<p>◇ 【Ctrl+L】或Admin=&gt;Command Line&#8230;，弹出Command Line Settings对话框，直接执行CVS命令。 <br>◇ 添加新用户【Killer】：cvs passwd -a Killer 回车，设置密码，OK，完成。 <br>◇ 绑定【Killer】到【Jackey】：cvs passwd -r Jackey Killer 回车，设置密码，OK，完成。 <br>◇ 两次输入的密码可以不同，但以第二次输入的密码为最终密码。 <br>◇ 删除用户【Killer】：cvs passwd -X Killer 回车，OK，完成。<br>◇ 其它特殊的功能查看passwd命令的帮助。 <br><br><span class=14>11.使用完毕后，一定要【Logout】，因为WinCVS退出时并不会自动注销自己在远端的会话；这样做是为了防止其它人接着打开WinCVS，不用登陆就可以完成你能进行的所有操作了。</span></p>
<span class=14>
<p class=14><strong>6 WinCVS中常见的特殊操作： </strong></p>
<p class=14>6.1 如何删除下载的文件或目录： </p>
<p>1. 选中下载的某个或多个文件，执行【Remove】命令。 <br>2. 再次选中这些文件，执行【Commit】命令就完成了删除文件的操作。 <br>3. 本质上CVS是不会删除任何文件和目录的，即使是执行了以上操作，删除了某些文件，远端CVS实际执行的是将提交删除的文件放到了一个叫【Attic】的目录下，因此，这些被删除的文件是可以通过一定的方法恢复的。 </p>
<p class=14>6.2 如何恢复已经删除的文件或目录： </p>
<p>1. 在执行了【Remove】命令之后恢复文件。 <br>◇ 【Ctrl+L】直接输入命令cvs add xxxxx，或执行【Add Selection】界面操作。 <br>◇ 这样就可以直接恢复还未提交的删除文件。 <br>2. 在执行了【Commit】命令之后恢复文件。 <br>◇ 只能用【Ctrl+L】直接输入命令cvs add xxxxx，这时会得到一个空的文件。 <br>◇ 选中这个空文件，执行【Update】操作，得到这个文件的实体。 <br>◇ 再次选中这个文件，执行【Commit】操作，得到这个文件最新版本。 <br>3. 由于CVS系统中本质上不会删除任何目录，因此，谈不上对目录的恢复，但是CVS系统默认情况下是要在用户本机上（如：YCW2000）要删除空目录，因此，可以用如下方法得到已被删除的空目录：cvs checkout -p xxx，也可以在Admin=&gt;Preference的【Globals】页面进行设置。 <br>4. 可见，CVS系统能够保证：只要上传到服务器的文件，无论你怎么在远程进行如何的操作，正常的或非正常的操作，都可以用Administrator登陆上去，通过以上的方法找到丢失的文件。除非用户进入到远端服务器，将文件手动删除，那就没办法了：） </p>
<p><span class=14>6.3 如何得到以前版本的文件：</span><br><br>1. 有时我们需要得到以前版本的文件，而WinCVS默认方式只传递最新的版本。 <br>2. 选中某个文件，【Ctrl+G】或右键，点按【Graph selection&#8230;】，使用默认设置，就可以得到该文件所以版本的图形结构描述。 <br>3. 选中一个版本，右键，点按【Retrieve revision】，就可以得到相应的老版本文件。当然也可以得到最新版本的文件：） </p>
<p><span class=14>6.4 有时WinCVS会变得异常缓慢，怎么办？</span><br><br>1. 确认安装了WinCVS的机器上没有安装CVSNT服务器端，因为它们使用的版本有可能不一致。 <br>2. 只安装了WinCVS，但以前安装过其它版本的WinCVS，怎么办？ <br>3. 先卸载所有的WinCVS系统，删除安装目录下的残留文件。 <br>4. 打开注册表编辑器，全程查找cvs关键字，找到一个删除一个，一直到找不到为止！！：） <br>5. 重新安装WinCVS，这个问题基本上就可以解决了，我就是这样解决，不晓得你那里如何？：） </p>
<p><span class=14><strong>7 其它说明：</strong></span><br><br>1. 本文的重点在介绍如何让使用者搭建CVSNT+WinCVS这个系统，因此重点介绍了管理员的常用操作，至于一般用户使用到的操作，相对比较简单和单一，使用WinCVS的次数多了，很快就会熟悉它了。 <br>2. 这篇文档只是窥探了CVS的一点皮毛而已，CVS当中还有很多高级的用法，以及上百个命令，还有很多新鲜的管理源代码的方法，比如：tag，branch等模式；因此，热烈欢迎大家积极探索，不断共享，不断进步。。。。。。。。 <br>3. 另外，cvs.html这个帮助，里面的信息也很丰富，但是，很多地方写得不够清楚，需要不断猜测和实践才能知道怎么回事，本文的很多经验都是看这个帮助，如此这般，采用这个笨办法得到的。。。。。。 <br>4. 最后，祝愿看到此文的人，得到的帮助、提高等好处大于或等于浪费的时间、反而退步等坏处！！</p>
</span>
<img src ="http://www.cnitblog.com/weitom1982/aggbug/34089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/weitom1982/" target="_blank">高山流水</a> 2007-09-27 13:50 <a href="http://www.cnitblog.com/weitom1982/archive/2007/09/27/34089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中病毒后不能/无法显示隐藏文件怎么办</title><link>http://www.cnitblog.com/weitom1982/archive/2007/06/18/28672.html</link><dc:creator>高山流水</dc:creator><author>高山流水</author><pubDate>Mon, 18 Jun 2007 06:58:00 GMT</pubDate><guid>http://www.cnitblog.com/weitom1982/archive/2007/06/18/28672.html</guid><wfw:comment>http://www.cnitblog.com/weitom1982/comments/28672.html</wfw:comment><comments>http://www.cnitblog.com/weitom1982/archive/2007/06/18/28672.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/weitom1982/comments/commentRss/28672.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/weitom1982/services/trackbacks/28672.html</trackback:ping><description><![CDATA[<p>有多种病毒会把一些重要文件隐藏起来,下面看看如何解决中病毒后<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">不能</strong>/无法<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">显示隐藏文件</strong>的问题,象落雪病毒就会引起这种现象，<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">不能</strong>/无法<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">显示隐藏文件</strong>是因为病毒修改了注册表的某些键值,这时我们可以采取下面的方法来<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">显示隐藏文件</strong>：</p>
<p>第一种解决<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">不能</strong>/无法<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">显示隐藏文件</strong>的方法： 把下面内容复制到记事本，保存为 1.reg文件于任何地方，然后双击就搞定了。<br>&nbsp;<br>REGEDIT4</p>
<p>[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Advanced\Folder\Hidden]<br>"Text"="隐藏文件"<br>"Type"="group"<br>"Bitmap"="C:\\WINDOWS\\SYSTEM\\SHDOC401.DLL,4"<br>"HelpID"="update.hlp#51131"</p>
<p>[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Advanced\Folder\Hidden\SHOWALL]<br>"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"<br>"Text"="显示所有文件"<br>"Type"="radio"<br>"CheckedValue"=dword:00000000<br>"ValueName"="Hidden"<br>"DefaultValue"=dword:00000000<br>"HKeyRoot"=dword:80000001<br>"HelpID"="update.hlp#51105"</p>
<p>[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Advanced\Folder\Hidden\NOHIDDEN]<br>"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"<br>"Text"="不<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">显示隐藏文件</strong>"<br>"Type"="radio"<br>"CheckedValue"=dword:00000000<br>"ValueName"="Hidden"<br>"DefaultValue"=dword:00000000<br>"HKeyRoot"=dword:80000001<br>"HelpID"="update.hlp#51104"</p>
<p>[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Advanced\Folder\Hidden\NOHIDORSYS]<br>"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"<br>"Text"="不<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">显示隐藏文件</strong>或系统文件"<br>"Type"="radio"<br>"CheckedValue"=dword:00000000<br>"ValueName"="Hidden"<br>"DefaultValue"=dword:00000000<br>"HKeyRoot"=dword:80000001<br>"HelpID"="update.hlp#51103"<br>[/code]<br><strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">显示隐藏文件</strong>:<br>[code]<br>REGEDIT4</p>
<p>[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Advanced\Folder\Hidden]<br>"Text"="隐藏文件"<br>"Type"="group"<br>"Bitmap"="C:\\WINDOWS\\SYSTEM\\SHDOC401.DLL,4"<br>"HelpID"="update.hlp#51131"</p>
<p>[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Advanced\Folder\Hidden\SHOWALL]<br>"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"<br>"Text"="显示所有文件"<br>"Type"="radio"<br>"CheckedValue"=dword:00000001<br>"ValueName"="Hidden"<br>"DefaultValue"=dword:00000000<br>"HKeyRoot"=dword:80000001<br>"HelpID"="update.hlp#51105"</p>
<p>[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Advanced\Folder\Hidden\NOHIDDEN]<br>"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"<br>"Text"="不<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">显示隐藏文件</strong>"<br>"Type"="radio"<br>"CheckedValue"=dword:00000002<br>"ValueName"="Hidden"<br>"DefaultValue"=dword:00000000<br>"HKeyRoot"=dword:80000001<br>"HelpID"="update.hlp#51104"</p>
<p>[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\explorer\Advanced\Folder\Hidden\NOHIDORSYS]<br>"RegPath"="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"<br>"Text"="不<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">显示隐藏文件</strong>或系统文件"<br>"Type"="radio"<br>"CheckedValue"=dword:00000000<br>"ValueName"="Hidden"<br>"DefaultValue"=dword:00000000<br>"HKeyRoot"=dword:80000001<br>"HelpID"="update.hlp#51103"</p>
<p><br><br>我们还可以用下面的方法解决<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">不能</strong>/无法<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">显示隐藏文件</strong>的问题,具体如下:<br>第二种方法：<br>&nbsp;有时候系统中病毒以后(例如sxs.exe和lsass(落雪病毒)),杀毒软件无法杀毒,或</p>
<p>者没有杀毒软件.这时就需要手动杀毒.这时往往需要删除病毒文件,病毒文件为了</p>
<p>保护自己,总是把自己隐藏起来.把文件属性设置成隐藏,一般的病毒我们通过修改</p>
<p>菜单:工具--文件夹选项--查看--<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">显示隐藏文件</strong> 即可.但是很多病毒通过修改注册</p>
<p>表使我们这步操作失效,还是无法看到隐藏文件,下面的操作就是教我们如何通过</p>
<p>修改注册表让隐藏的文件原形毕露。</p>
<p>首先要显示出被隐藏的系统文件</p>
<p>运行——regedit</p>
<p>HKEY_LOCAL_MACHINE\Software\Microsoft\windows\CurrentVersion\explorer\A</p>
<p>dvanced\Folder\Hidden\SHOWALL，将CheckedValue键值修改为1</p>
<p>但可能依然没有用，隐藏文件还是没有显示，这是因为病毒在修改注册表达到隐</p>
<p>藏文件目的之后，把本来有效的DWORD值CheckedValue删除掉，新建了一个无效的</p>
<p>字符串值CheckedValue，并且把键值改为0！</p>
<p>方法：删除此CheckedValue键值，单击右键 新建——Dword值——命名为</p>
<p>CheckedValue，然后修改它的键值为1，这样就可以选择&#8220;显示所有隐藏文件&#8221;和</p>
<p>&#8220;显示系统文件&#8221;。&nbsp;</p>
<img src ="http://www.cnitblog.com/weitom1982/aggbug/28672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/weitom1982/" target="_blank">高山流水</a> 2007-06-18 14:58 <a href="http://www.cnitblog.com/weitom1982/archive/2007/06/18/28672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows xp 进程查询</title><link>http://www.cnitblog.com/weitom1982/archive/2007/06/18/28669.html</link><dc:creator>高山流水</dc:creator><author>高山流水</author><pubDate>Mon, 18 Jun 2007 06:17:00 GMT</pubDate><guid>http://www.cnitblog.com/weitom1982/archive/2007/06/18/28669.html</guid><wfw:comment>http://www.cnitblog.com/weitom1982/comments/28669.html</wfw:comment><comments>http://www.cnitblog.com/weitom1982/archive/2007/06/18/28669.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/weitom1982/comments/commentRss/28669.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/weitom1982/services/trackbacks/28669.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 什么是系统进程？它能做什么？                        　　进程是程序在计算机上的一次执行活动。当你运行一个程序，你就启动了一个进程。显然，程序是死的(静态的)，进程是活的(动态的)。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程，它们就是处于运行状态下的操作系统本身；用户进程就是所有由你启动的进程。进程是操作系统进行资源分配的单位。　...&nbsp;&nbsp;<a href='http://www.cnitblog.com/weitom1982/archive/2007/06/18/28669.html'>阅读全文</a><img src ="http://www.cnitblog.com/weitom1982/aggbug/28669.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/weitom1982/" target="_blank">高山流水</a> 2007-06-18 14:17 <a href="http://www.cnitblog.com/weitom1982/archive/2007/06/18/28669.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编译原理学习导论 </title><link>http://www.cnitblog.com/weitom1982/archive/2007/01/23/22238.html</link><dc:creator>高山流水</dc:creator><author>高山流水</author><pubDate>Tue, 23 Jan 2007 05:08:00 GMT</pubDate><guid>http://www.cnitblog.com/weitom1982/archive/2007/01/23/22238.html</guid><wfw:comment>http://www.cnitblog.com/weitom1982/comments/22238.html</wfw:comment><comments>http://www.cnitblog.com/weitom1982/archive/2007/01/23/22238.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/weitom1982/comments/commentRss/22238.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/weitom1982/services/trackbacks/22238.html</trackback:ping><description><![CDATA[
		<h2> </h2>
		<p>大学课程为什么要开设编译原理呢？这门课程关注的是编译器方面的产生原理和技术问题，似乎和计算机的基础领域不沾边，可是编译原理却一直作为大学本科的必修课程，同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已，当然由于这个问题十分复杂，其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的，不过讲的基础算法，换句话说讲的是算法导论，而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪50年代，编译器的编写一直被认为是十分困难的事情，第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时，诞生了许多跟编译相关的理论和技术，而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决著名的哥德巴赫猜想一样，虽然没有最终解决问题，但是其间诞生不少名著的相关数论。</p>
		<p>推荐参考书</p>
		<p>虽然编译理论发展到今天，已经有了比较成熟的部分，但是作为一个大学生来说，要自己写出一个像Turboc C,Java那样的编译器来说还是太难了。不仅写编译器困难，学习编译原理这门课程也比较困难。</p>
		<p>正是因为编译原理学习相对困难，那么就要求有好的教师和好的教材。教师方面不是我们能自己更改的，而在教材方面我们却可以按自己的意愿来阅读。我下面推荐几本好的编译原理的教材。我推荐的书籍都是国外的经典教材，因为在国内的教材中，确实还没发现什么让人满意的。</p>
		<p>第一本书的原名叫《Compilers Principles,Techniques,and Tools》,另外一个响亮的名字就是龙书。原因是这本书的封面上有条红色的龙，也因为獗臼樵诒嘁朐?砘?×煊蛉肥堤?忻???所以很多国外的学者都直接取名为龙书。最近机械工业出版社已经出版了此书的中文版，名字就叫《编译原理》。该书出的比较早，大概是在85或86年编写完成的，作者之一还是著名的贝尔实验室的科学家。里面讲解的核心编译原理至今都没有变过，所以一直到今天，它的价值都非凡。这本书最大的特点就是一开始就通过一个实际的小例子，把编译原理的大致内容罗列出来，让很多编译原理的初学者很快心里有了个底,也知道为什么会有这些理论，怎么运用这些理论。而这一点是我感觉国内的教材缺乏的东西，所以国内的教材都不是写给愿意自学的读者，总之让人看了半天，却不知道里面的东西有什么用。</p>
		<p>第二本书的原名叫《Modern Compiler Design》,中文名字叫做《现代编译程序设计》。该书由人民邮电出版社所出。此书比较关注的是编译原理的实践，书中给出了不少的实际程序代码，还有很多实际的编译技术问题等等。此书另外一个特点就是其“现代”而字。在传统的编译原理教材中，你是不可能看到如同Java中的“垃圾回收”等算法的。因为Java这样的解释执行语言是在近几年才流行起来的东西。如果你想深入学习编译原理的理论知识，那么你肯定得看前面那本龙书，如果你想自己动手做一个先进的编译器，那么你得看这本《现代编译程序设计》。</p>
		<p>第三本书就是很多国内的编译原理学者都推荐的那本《编译原理及实践》。或许是这本书引入国内比较早吧，我记得我是在高中就买了这本书，不过也是在前段时间才把整本书看完。此书作为入门教程也的确是个不错的选择。书中给出的编译原理讲解也相当细致，虽然不如前面的龙书那么深入，但是很多地方都是点到为止，作为大学本科教学已经是十分深入了。该书的特点就是注重实践，不过感觉还不如前面那本《现代编译程序设计》的实践味道更重。此书的重点还是在原理上的实践，而非前面那本那样的技术实践。《编译原理及实践》在讲解编译原理的各个部分的同时，也在逐步实践一个现代的编译器Tiny C.等你把整本书看完，差不多自己也可以写一个Tiny C了。作者还对Lex和Yacc这两个常用的编译相关的工具进行了很详细的说明，这一点也是很难在国内的教材中看到的。</p>
		<p>推荐了这三本教材，都有英文版和中文版的。很多英文好的同学只喜欢看原版的书，不我的感觉是这三本书的翻译都很不错，没有必要特别去买英文版的。理解理论的实质比理解表面的文字更为重要。</p>
		<p>编译原理的实质</p>
		<p>前面已经说过，学习编译原理其实也就是学习算法而已，没什么特别的。只不过这些算法的产生已经形成了一套理论。下面我来看看编译原理里面到底有什么高深的理论吧。</p>
		<p>几乎每本编译原理的教材都是分成词法分析，语法分析（LL算法，递归下降算法，LR算法），语义分析，运行时环境，中间代码，代码生成，代码优化这些部分。其实现在很多编译原理的教材都是按照85,86出版的那本龙书来安排教学内容的，所以那本龙书的内容格式几乎成了现在编译原理教材的定式，包括国内的教材也是如此。一般来说，大学里面的本科教学是不可能把上面的所有部分都认真讲完的，而是比较偏重于前面几个部分。像代码优化那部分东西，就像个无底洞一样，如果要认真讲，就是单独开一个学期的课也不可能讲得清楚。所以，一般对于本科生，对词法分析和语法分析掌握要求就相对要高一点了。</p>
		<p>词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧，很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候，重点把正则表达式和自动机原理加了进来，然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显，就是要让词法分析从程序上升到理论的地步。</p>
		<p>语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法，LL自顶向下算法和LR自底向上算法。LL算法还好说，到了LR算法的时候，困难就来了。很多自学编译原理的都是遇到LR算法的理解成问题后就放弃了自学。其实这些东西都是只要大家理解就可以了，又不是像词法分析那样非得自己写出来才算真正的会。像LR算法的语法分析器，一般都是用工具Yacc来生成，实践中完全没有比较自己来实现。对于LL算法中特殊的递归下降算法，因为其实践十分简单，那么就应该要求每个学生都能自己写。当然，现在也有不少好的LL算法的语法分析器，不过要是换在非C平台，比如Java,Delphi,你不能运用YACC工具了，那么你就只有自己来写语法分析器。</p>
		<p>等学到词法分析和语法分析时候，你可能会出现这样的疑问：“词法分析和语法分析到底有什么？”就从编译器的角度来讲，编译器需要把程序员写的源程序转换成一种方便处理的数据结构（抽象语法树或语法树）,那么这个转换的过程就是通过词法分析和语法分析的。其实词法分析并非一开始就被列入编译器的必备部分，只是我们为了简化语法分析的过程，就把词法分析这种繁琐的工作单独提取出来，就成了现在的词法分析部分。除了编译器部分，在其它地方，词法分析和语法分析也是有用的。比如我们在DOS,Unix,Linux下输入命令的时候，程序如何分析你输入的命令形式，这也是简单的应用。总之，这两部分的工作就是把不“规则”的文本信息转换成一种比较好分析好处理的数据结构。那么为什么编译原理的教程都最终把要分析的源分析转换成“树”这种数据结构呢？数据结构中有Stack, Line,List…这么多数据结构，各自都有各自的特点。但是Tree这种结构有很强的递归性，也就是说我们可以把Tree的任何结点Node提取出来后，它依旧是一颗完整的Tree。这一点符合我们现在编译原理分析的形式语言，比如我们在函数里面使用函树，循环中使用循环，条件中使用条件等等，那么就可以很直观地表示在Tree这种数据结构上。同样，我们在执行形式语言的程序的时候也是如此的递归性。在编译原理后面的代码生成的部分，就会介绍一种堆栈式的中间代码，我们可以根据分析出来的抽象语法树，很容易，很机械地运用递归遍历抽象语法树就可以生成这种指令代码。而这种代码其实也被广泛运用在其它的解释型语言中。像现在流行的Java,.NET，其底层的字节码bytecode,可以说就是这中基于堆栈的指令代码的。</p>
		<p>关于语义分析，语法制导翻译，类型检查等等部分，其实都是一种完善前面得到的抽象语法树的过程。比如说，我们写C语言程序的时候，都知道，如果把一个浮点数直接赋值给一个整数，就会出现类型不匹配，那么C语言的编译器是怎么知道的呢？就是通过这一步的类型检查。像C++语言这中支持多态函数的语言，这部分要处理的问题就更多更复杂了。大部编译原理的教材在这部分都是讲解一些比较好的处理策略而已。因为新的问题总是在发生，旧的办法不见得足够解决。</p>
		<p>本来说，作为一个编译器，起作用的部分就是用户输入的源程序到最终的代码生成。但是在讲解最终代码生成的时候，又不得不讲解机器运行环境等内容。因为如果你不知道机器是怎么执行最终代码的，那么你当然无法知道如何生成合适的最终代码。这部分内容我自我感觉其意义甚至超过了编译原理本身。因为它会把一个计算机的程序的运行过程都通通排在你面前，你将来可能不会从事编译器的开发工作，但是只要是和计算机软件开发相关的领域,都会涉及到程序的执行过程。运行时环境的讲解会让你更清楚一个计算机程序是怎么存储，怎么装载，怎么执行的。关于部分的内容，我强烈建议大家看看龙书上的讲解，作者从最基本的存储组织，存储分配策略，非局部名字的访问，参数传递，符号表到动态存储分配(malloc,new)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情，但是我们却少去探求其内部是如何完成。</p>
		<p>关于中间代码生成，代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去，学生听了也只是作为了解，不知道如何运用。不过这部分内容的东西如果要认真讲，单独开一学期的课程都讲不完。在《编译原理及实践》的书上，对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码，十分通俗易懂，让人看了后，很容易模仿，自己下来后就可以写自己的代码生成。当然，对于其它代码生成技术，代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术，其实另外还有本叫做《Advance Compiler Desgin and Implement》,那本书现在由机械工业出版社引进的，十分厚重，而且是英文原版。不过这本书我没有把它列为推荐书给大家，毕竟能把龙书的内容搞清楚，在中国已经就算很不错的高手了，到那个时候再看这本《Advance Compiler Desgin and Implement》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分，就是算是实践过程中，相信大家也不太运用得到。毕竟，自己做的编译器能正确生成执行代码已经很不错了，还谈什么优化呢？</p>
		<p>关于实践</p>
		<p>编译原理的课程毕竟还只是讲解原理的课程，不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术，而原理的课关注讲解其基本理论。但是计算机科学本身就是一门实践性很强的课程，如果能够学以致用，那才叫真正的学会。李阳在讲解疯狂英语的时候就说到，只要当你会实际中运用一个单词一个词组的时候你才能叫学会了这个单词或者词组，而不是只是知道了它的拼写和意思。其实任何学习都是一样的，如果缺少了实践的结合，你不能算学会。</p>
		<p>编译原理的课程主要就是讲解编译器产生的理论和原理，那么很简单，自己写个编译器就是最好的实践过程了。不过你得小心，编译系统可能是所有软件系统中最复杂的系统之一,不然为什么大学里面还会把编译器的编写开成一门叫做编译原理的课程来讲？我很佩服那些学了操作系统原理就开始自己写操作系统，学了编译原理就开始自己写编译器的人们，确实，在中国，敢这么做的学生太少了。且不管你这样做能不能做成功，至少有了这个尝试，会让你的程序设计，系统规划安排的功底增进不少。我下面给出一些关于实践过程中可能会遇到的困难，希望能够在你陷入困境的前帮你一把。</p>
		<p>1. Lex和Yacc. 这两工具是作为词法分析很语法分析的工具。如果你自己写一个编译器，我十分不建议你连词法分析这种事情都亲手来写。Lex和Yacc应该是作为每本编译原理的教材的必备内容，可是在国内的教材中缺很少看到。这两个工具是Unix系统下的小东西，如果你要在Windows中运用，那么你最好去下在cygwin这个软件。它是个在Windows下模拟Unix的东东，里面就包含了flex.exe和bison.exe(yacc)这两个工具.这两个工具使用起来还挺麻烦的(其实unix 下的很多十分有用的工具都是这样), 不过在《编译原理与实践》这本书上对于这两个工具的讲解十分详细,还列举了不少实际的例子。</p>
		<p>2. 做解释型语言比做生成机器代码的编译器简单。虽然说，做解释型的编译器，像Java那样的，你还得自己去写解释器，不过这样你就不必去查找机器代码的资料了。如果你做生成的最终机器代码编译器可能会遇到问题还有就是寄存器为基础的代码生成方法。前面说过，如果你生成的是以堆栈为基础的代码，那么其代码生成过程十分简单，需要考虑的东西也不多，如果你考虑最终的机器代码生成的话，你必须考虑机器的寄存器如何分配等麻烦的问题。</p>
		<p>3. 考虑用别人已经生成的语法文件，尽量不要自己动手写词法文件和语法文件.以前一个朋友曾经说过,写出一个好的程序语言的语法定义,就几乎完成了一个编译器的一半.确实是这样,语法文件的编写是个很难的事情.现在网上到处都可以找到比如C语言,C++,Java, Tiny C,Minus C等语言的词法文件和语法文件,你完全可以自己下下来来用.</p>
		<p>在《编译原理及实践》的书中，作者给出了一个Tiny C的全部代码.我自我感觉作者的这个编译器做得很不错,相对于其它php,perl等语言的源代码来说,简单得多,容易看懂,而且很清晰地展现了一个完成的编译系统的实现过程.其源代码可以在作者的网站上下载</p>
<img src ="http://www.cnitblog.com/weitom1982/aggbug/22238.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/weitom1982/" target="_blank">高山流水</a> 2007-01-23 13:08 <a href="http://www.cnitblog.com/weitom1982/archive/2007/01/23/22238.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>how to write a os </title><link>http://www.cnitblog.com/weitom1982/archive/2007/01/23/22237.html</link><dc:creator>高山流水</dc:creator><author>高山流水</author><pubDate>Tue, 23 Jan 2007 05:07:00 GMT</pubDate><guid>http://www.cnitblog.com/weitom1982/archive/2007/01/23/22237.html</guid><wfw:comment>http://www.cnitblog.com/weitom1982/comments/22237.html</wfw:comment><comments>http://www.cnitblog.com/weitom1982/archive/2007/01/23/22237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/weitom1982/comments/commentRss/22237.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/weitom1982/services/trackbacks/22237.html</trackback:ping><description><![CDATA[
		<h2>QUOTE<br />作者：伊梅 本文选自：开放系统世界——赛迪网 2002年10月10日</h2>
		<p>
				<br />自由软件社区是一个充满自由和梦想的地方，在10余年的时间里它创造了一个又一个奇迹。然而，这些奇迹的创造者不只是Stallman，也不只是Linus Torvalds，而是活跃在世界各地的不计其数的开发人员。 </p>
		<p>在使用各种功能强大的自由软件时，我总会对其开发者充满崇敬之情，期盼有朝一日自己也能成为他们中的一员。很多对自由社区充满向往之情的人，虽然也想努力融身于其中，但又不知该怎么做。那么，就请与我们一起从编写一个简单的操作系统开始吧！ </p>
		<p>
				<br />我们要做的事情</p>
		<p>
				<br />有人可能担心自己既没有学过计算机原理，也没有学过操作系统原理，更不懂汇编语言，对C语言也一知半解，能写操作系统吗？答案是没问题。我将带大家一步一步完成自己的操作系统。当然如果学一学上述内容再好不过。 </p>
		<p>首先要明确处理器(也就是CPU)控制着计算机。对PC而言，启动的时候，CPU都处在实模式状态，相当于只是一个Intel 8086处理器。也就是说，即使你现在拥有一个奔腾处理器，它的功能也只能是8086级别。从这一点上来讲，可以使用一些软件把处理器转换到著名的保护模式。只有这样，我们才可以充分利用处理器的强大功能。 </p>
		<p>编写操作系统开始是对BIOS控制，取出存储在ROM里的程序。BIOS是用来执行POST(Power On Self Test，自检)的。自检是检查计算机的完整性(比如外设是否工作正常、键盘是否连接等)。这一切完成以后，你就会听到PC喇叭发出一声清脆的响声。如果一切正常，BIOS就会选择一个启动设备，并且读取该设备的第一扇区(即启动扇区)，然后控制过程就会转移到指定位置。启动设备可能是一个软盘、光盘、硬盘，或者其它所选择的设备。在此我们把软盘作为启动设备。如果我们已经在软盘的启动扇区里写了一些代码，这时它就被执行。因此，我们的目的很明确，就是往软盘的启动扇区写一些程序。 </p>
		<p>首先使用8086汇编来写一个小程序，然后将其拷贝至软盘的启动扇区。为了实现拷贝，要写一个C程序。最后，使用软盘启动计算机。 </p>
		<p>
				<br />需要的工具</p>
		<p>
				<br />● as86：这是一个汇编程序，它负责把写的代码转换成目标文件。 </p>
		<p>● ld86：这是一个连接器，as86产生的目标代码由它来转换成真正的机器语言。机器语言是8086能够解读的形式。 </p>
		<p>● GCC：著名的C编程器。因为我们需要写一个C程序将自己的OS转移到软盘中。 </p>
		<p>● 一张空软盘：它用于存储编写的操作系统，也是启动设备。 </p>
		<p>● 一台装有Linux的计算机：这台机器可以很旧，386、486都可以。 </p>
		<p>在大部分标准Linux发行版中都会带有as86和ld86。在我使用的Red Hat 7.3中就包含有这两个工具，并且在默认的情况下，它已经安装在机器里。如果使用的Linux没有这两个工具，可以从网上下载(<a href="http://www.cix.co.uk/~mayday/">http://www.cix.co.uk/~mayday/</a>)，这两个工具都包含在一个名为bin86的软件包中。此外，有关的文档也可以在网上获得(<a href="http://www.linux.org/docs/ldp/howto/Assembly-HOWTO/as86.html">www.linux.org/docs/ldp/howto/Assembly-HOWTO/as86.html</a>)。 </p>
		<p>
				<br />开始工作</p>
		<p>
				<br />使用一个你喜欢的编辑器输入以下内容： </p>
		<p>entry start<br />start:<br />      mov ax,#0xb800<br />      mov es,ax<br />      seg es<br />      mov [0],#0x41<br />      seg es<br />      mov [1],#0x1f<br />loop1: jmp loop1</p>
		<p> </p>
		<p>这是as86可以读懂的一段汇编程序。第一个句子指明了程序的入口点，声明整个过程从start处开始。第二行指明了start的位置，说明整个程序要从start处开始执行。0xb800是显存的开始地址。#表明其后是一个立即数。执行语句： </p>
		<p>mov ax,#oxb800</p>
		<p> </p>
		<p>ax寄存器的值就变为0xb800，这就是显存的地址。下面再将这个值移至es寄存器，es是附加段寄存器。请记住8086有一个分段的体系结构。它的各段寄存器为代码段、数据段、堆栈段和附加段，对应的寄存器名称分别为cs、ds、ss和es。事实上，我们把显存地址送入了附加段，因此，任何送入附加段的东西都会被送到显存中。 </p>
		<p>要在屏幕上显示字符，就需要向显存中写两个字节。前一个是所要显示字符的ASCⅡ值，第二个字节表示该字符的属性。属性包括字符的前景色、背景色及是否闪烁等等。seg es指明下一个将要执行的指令是指向es段的。所以，我们把值0x41(在ASCⅡ中表示的字符是A)送到显存的第一个字节中。接下来要把字符的属性送到下一个字节当中。在此输入的是0x1f，该属性指的是在蓝色背景下显示白色的字符。因此，如果执行这个程序，就可以在屏幕上得到显示在蓝底上的一个白色的A。接着是一个循环。因为在执行完显示字符的任务后，要么让程序结束，要么使用一个循环使其永远运行下去。把该文件命名为boot.s，然后存盘。 </p>
		<p>此处显存的概念说得不是很清楚，有必要进一步解释一下。假设屏幕由80列×25行组成，那么第一行就需要160字节，其中一个字节用于表示字符，另外一个字节用于表示字符的属性。如果要在第三行显示某一字符的话，就要跳过显存的第0和1字节(它们是用于显示第1列的)，第2和3字节(它们是用于显示第2列的)，然后把需要显示字符的ASCⅡ码值入第4字节，把字符的属性写入第5字节。 </p>
		<p>
				<br />把程序写至启动扇区</p>
		<p>
				<br />下面写一个C程序，把我的操作系统写入软盘第一扇区。程序内容如下： </p>
		<p>#include  /* unistd.h 需要这个文件 */<br />#include     /* 包含有read和write函数 */<br />#include <br />int main()<br />{<br />  char boot_buf[512];<br />   int floppy_desc, file_desc;<br />  file_desc = open("./boot", O_RDONLY);<br />  read(file_desc, boot_buf, 510);<br />  close(file_desc);<br />  boot_buf[510] = 0x55;<br />  boot_buf[511] = 0xaa;<br />  floppy_desc = open("/dev/fd0", O_RDWR);<br />  lseek(floppy_desc, 0, SEEK_CUR);<br />  write(floppy_desc, boot_buf, 512);<br />  close(floppy_desc);<br />}</p>
		<p> </p>
		<p>首先，以只读模式打开boot文件，然后在打开文件时把文件描述符复制到file_desc变量中。从文件中读取510个字符，或者读取直到文件结束。在本例中由于文件很小，所以是读取至文件结束。然后关闭文件。 </p>
		<p>最后4行代码打开软盘驱动设备(一般来说是/dev/fd0)。使用lseek找到文件开始处，然后从缓冲中向软盘写512个字节。 </p>
		<p>在read、write、open和lseek的帮助页中，可以看到与函数所有有关的参数及其使用方法。程序中有两行比较难懂： </p>
		<p>boot_buf[510] = 0x55;<br />boot_buf[511] = 0xaa;</p>
		<p> </p>
		<p>该信息是用于BIOS的，如果它识别出该设备是一个可启动的设备，那么在第510和511的位置，该值就应该是0x55和0xaa。程序会把文件boot读至名为boot_buf的缓冲中。它要求改变第510和第511字节，然后把boot_buf写至软盘之上。如果执行代码，软盘上的前512字节就包含了启动代码。最后，把文件存为write.c。 </p>
		<p>
				<br />编译运行</p>
		<p>
				<br />使用下面的命令把文件变为可执行文件： </p>
		<p>as86 boot.s -o boot.o<br />ld86 -d boot.o -o boot<br />cc write.c -o write</p>
		<p> </p>
		<p>首先将boot.s文件编译成目标文件boot.o，然后将该文件连接成最终的boot文件。最后C程序编译成可执行的write文件。 </p>
		<p>插入一个空白软盘，运行以下程序： </p>
		<p>./write</p>
		<p> </p>
		<p>重新启动电脑，进行BIOS的界面设置，并且把软盘设为第一个启动的设备。然后插入软盘，电脑从软盘上启动。 </p>
		<p>启动完成后，在屏幕上可以看到一个字母A(蓝底白字)，启动速度很快，几乎是在瞬间完成。这就意味着系统已经从我们制作的软盘上启动了，并且执行了刚才写入启动扇区的程序。现在，它正处在一个无限循环的状态。所以，如果想进入Linux，必需拿掉软盘，并且重启机器。 </p>
		<p>至此，这个操作系统就算完成了，虽然它没有实现什么功能，但是它已经可以启动机器了<br />上一期，我讲述了如何在软盘的启动扇区写一些代码，然后再从软盘启动的过程。制作好一个启动扇区，在切换到保护模式之前，我们还应该知道如何使用BIOS中断。BIOS中断是一些由BIOS提供的、为了使操作系统的创建更容易的低级程序。在本文中，我们将学习处理BIOS的中断。 </p>
		<p>
				<br />为什么要用BIOS</p>
		<p>
				<br />BIOS会把启动扇区拷贝至RAM中，并且执行这些代码。除此之外，BIOS还要做很多其它的事情。当一个操作系统刚开始启动时，系统中并没有显卡驱动、软盘驱动等任何驱动程序。因此，启动扇区中不可能包含任何一个驱动程序，我们要采取其它的途径。这个时候，BIOS就可以帮助我们了。BIOS中包含有各种可以使用的程序，包括检测安装的设备、控制打印机、计算内存大小等用于各种目的的程序。这些程序就是所说的BIOS中断。 </p>
		<p>
				<br />如何调用BIOS中断</p>
		<p>
				<br />在一般的程序设计语言中，函数的调用是一件非常容易的事情。比如在C语言中，如果有一个名为display的程序，它带有两个参数，其中参数noofchar表示显示的字符数，参数attr表示显示字符的属性。那么要调用它，只需给出程序的名称即可。对于中断的调用，我们使用的是汇编语言中的int指令。 </p>
		<p>比如，在C语言中要显示一些东西时，使用的指令如下所示： </p>
		<p>display(nofchar，attr)；</p>
		<p>
				<br />而使用BIOS时，要实现相同功能使用的指令如下： </p>
		<p>int 0x10</p>
		<p>
				<br />如何传递参数</p>
		<p>
				<br />在调用BIOS中断之前，我们需要先往寄存器中送一些特定的值。假设要使用BIOS的中断13h，该中断的功能是把数据从软盘传送至内存之中。在调用该中断之前，要先指定拷贝数据的段地址，指定驱动器号、磁道号、扇区号，以及要传送的扇区数等等。然后，就要往相应的寄存器送入相应的值。在进行下面的步骤前，读者有必要对这一点有比较明确地认识。 </p>
		<p>此外，一个比较重要的事实是同一个中断往往可以实现各种不同的功能。中断所实现的确切功能取决于所选择的功能号，功能号一般都存在ah寄存器之中。比如中断13h可以用于读磁盘、写磁盘等功能，如果把3送入ah寄存器中，那么中断选择的功能就是写磁盘；如果把2送入ah寄存器中，选择的功能则是读磁盘等。 </p>
		<p>
				<br />我们要做的事情</p>
		<p>
				<br />这次我们的源代码由两个汇编语言程序和一个C程序组成。第一个汇编文件是引导扇区的代码。在引导扇区中，我们写的代码是要把软盘中第二扇区拷贝至内存段的0x500处(地址是0x5000，即偏移地址为0)。这时我们需要使用BIOS的中断13h。这时启动扇区的代码就会把控制权转移至0x500处。在第二个汇编文件中，代码会使用BIOS中断10h在屏幕上显示一个信息。C程序实现的功能则是把可执行的文件1拷贝至启动扇区，把可执行的文件2拷贝至软盘的第二扇区。 </p>
		<p>
				<br />启动扇区代码</p>
		<p>
				<br />使用中断13h，启动扇区把软盘第二扇区里的内容加载至内存的0x5000处(段地址为0x500)。下面的代码是用于实现这一目的的代码，将其保存至文件sbect.s中。 </p>
		<p>LOC1=0x500<br />entry start<br />start:<br />mov ax,#LOC1<br />mov es,ax<br />mov bx,#0 <br />mov dl,#0 <br />mov dh,#0 <br />mov ch,#0 <br />mov cl,#2 <br />mov al,#1 <br />mov ah,#2 <br />int 0x13<br />jmpi 0,#LOC1</p>
		<p>
				<br />上面代码第一行类似于一个宏。接下去的两行则是把值0x500加载至es寄存器中，这是软盘上第二扇区代码将拷贝到的地方(第一扇区是启动扇区)。这时，把段内的偏移设为0。 </p>
		<p>接下来把驱动器号送入dl寄存器中，其中磁头号送入dl寄存器中，磁道号送入ch寄存器中，扇区号送入cl寄存器中，扇区数送入al寄存器之中。我们想要实现的功能是把扇区2、磁道号为0、驱动器号为0的内容送至段地址0x500处。所有这些参数都和1.44MB的软盘相对应。 </p>
		<p>把2送入ah寄存器中，是选择了由中断13h提供的相应功能，即实现从软驱转移数据的功能。 </p>
		<p>最后调用中断13h，并且转至偏移为0的段地址0x500处。 </p>
		<p>
				<br />第二个扇区的代码</p>
		<p>
				<br />第二个扇区中的代码如下所示(把这些代码保存至文件sbect2.s之中)： </p>
		<p>entry start<br />start:<br />mov ah,#0x03 <br />xor bh,bh<br />int 0x10</p>
		<p>mov cx,#26 <br />mov bx,#0x0007 <br />mov bp,#mymsg<br />mov ax,#0x1301 <br />int 0x10</p>
		<p>loop1: jmp loop1<br />mymsg:<br />.byte 13,10<br />.ascii “Operating System is Loading......”</p>
		<p>
				<br />上面代码将被加载至段地址为0x500处，并且被执行。在这段代码中，使用了中断10h来获取目前的光标位置，然后显示信息。 </p>
		<p>从第3行到第5行用于得到目前光标的位置，在此中断10h选用的是功能3。然后，清除了bh寄存器的内容，并把字符串送至ch寄存器中。在bx中，我们送入了页码及显示的属性。此处，我们想要在黑背景上显示白色的字符。然后，把要显示字符的地址送到bp之中，信息由两个字节组成，其值分别为13的10，它们分别对应回车和LF(换行)的ASCⅡ值。接下来是一个由29个字符组成的串；在下面实现的功能是输出字符串然后移动光标；最后是调用中断，然后进入循环。 </p>
		<p>
				<br />C程序代码</p>
		<p>
				<br />C程序的源代码如下所示，将其存储为write.c文件。 </p>
		<p>#include &lt;sys/types.h&gt; /* unistd.h needs this */<br />#include &lt;unistd.h&gt; /* contains read/write */<br />#include &lt;fcntl.h&gt;<br />int main()<br />{<br />char boot_buf[512];<br />int floppy_desc, file_desc;<br />file_desc = open(“./bsect”, O_RDONLY);<br />read(file_desc, boot_buf, 510);<br />close(file_desc);<br />boot_buf[510] = 0x55;<br />boot_buf[511] = 0xaa;<br />floppy_desc = open(“/dev/fd0”, O_RDWR);<br />lseek(floppy_desc, 0, SEEK_SET);<br />write(floppy_desc, boot_buf, 512);<br />file_desc = open(“./sect2”, O_RDONLY);<br />read(file_desc, boot_buf, 512);<br />close(file_desc);<br />lseek(floppy_desc, 512, SEEK_SET);<br />write(floppy_desc, boot_buf, 512);<br />close(floppy_desc);<br />}</p>
		<p>
				<br />在上一期中，我曾经介绍过如何操作能启动的软盘。现在这一个过程稍微有点不同，首先把由bsect.s编译出来的可执行文件bsect拷贝至软盘的启动扇区。然后再把由sect2.s产生的可执行文件sect2拷贝至软盘的第二个扇区。 </p>
		<p>把上述文件置于同一目录之下，然后分别对其进行编译，方法如下所示： </p>
		<p>as86 bsect.s -o bsect.o<br />ld86 -d bsect.o -o bsect</p>
		<p>
				<br />对sect2.s文件重复以上的操作，得出可执行文件sect2。编译write.c，插入软盘后执行write文件，命令如下所示： </p>
		<p>cc write.c -o write<br />./write</p>
		<p>
				<br />下一步我们要做的事情</p>
		<p>
				<br />从软盘启动以后，可以看到显示出来的字符串。这是使用了BIOS中断来完成的。下一期要做的事情是在这个操作系统中实现实模式向保护模式的转换。</p>
		<p> </p>
		<p>
				<br />--------------------------------------------------------------------------------<br />htldm 回复于：2002-12-17 15:22:55 <br />现在，这个操作系统已经越来越接近当年Linus Torvalds的那个具有“历史意义”的Linux内核了。因此，要马上把这个系统切换到保护模式之下。 </p>
		<p>什么是保护模式</p>
		<p>自从1969年推出第一个微处理器以来，Intel处理器就在不断地更新换代，从8086、8088、80286，到80386、80486、奔腾、奔腾Ⅱ、奔腾4等，其体系结构也在不断变化。80386以后，提供了一些新的功能，弥补了8086的一些缺陷。这其中包括内存保护、多任务及使用640KB以上的内存等，并仍然保持和8086家族的兼容性。也就是说80386仍然具备了8086和80286的所有功能，但是在功能上有了很大的增强。早期的处理器是工作在实模式之下的，80286以后引入了保护模式，而在80386以后保护模式又进行了很大的改进。在80386中，保护模式为程序员提供了更好的保护，提供了更多的内存。事实上，保护模式的目的不是为了保护程序，而是要保护程序以外的所有程序（包括操作系统）。 </p>
		<p>简言之，保护模式是处理器的一种最自然的模式。在这种模式下，处理器的所有指令及体系结构的所有特色都是可用的，并且能够达到最高的性能。 </p>
		<p>保护模式和实模式</p>
		<p>从表面上看，保护模式和实模式并没有太大的区别，二者都使用了内存段、中断和设备驱动来处理硬件，但二者有很多不同之处。我们知道，在实模式中内存被划分成段，每个段的大小为64KB，而这样的段地址可以用16位来表示。内存段的处理是通过和段寄存器相关联的内部机制来处理的，这些段寄存器（CS、DS、SS和ES）的内容形成了物理地址的一部分。具体来说，最终的物理地址是由16位的段地址和16位的段内偏移地址组成的。用公式表示为： </p>
		<p>物理地址=左移4位的段地址+偏移地址。 </p>
		<p>在保护模式下，段是通过一系列被称之为“描述符表”的表所定义的。段寄存器存储的是指向这些表的指针。用于定义内存段的表有两种：全局描述符表(GDT)和局部描述符表(LDT)。GDT是一个段描述符数组，其中包含所有应用程序都可以使用的基本描述符。在实模式中，段长是固定的(为64KB)，而在保护模式中，段长是可变的，其最大可达4GB。LDT也是段描述符的一个数组。与GDT不同，LDT是一个段，其中存放的是局部的、不需要全局共享的段描述符。每一个操作系统都必须定义一个GDT，而每一个正在运行的任务都会有一个相应的LDT。每一个描述符的长度是8个字节，格式如图3所示。当段寄存器被加载的时候，段基地址就会从相应的表入口获得。描述符的内容会被存储在一个程序员不可见的影像寄存器(shadow register)之中，以便下一次同一个段可以使用该信息而不用每次都到表中提取。物理地址由16位或者32位的偏移加上影像寄存器中的基址组成。实模式和保护模式的不同可以从图1和图2中很清楚地看出来。</p>
		<p>
				<br />图1 实模式的寻址</p>
		<p>
				<br />图2 保护模式下的寻址</p>
		<p>
				<br />图3 段描述俯的格式</p>
		<p>此外，还有一个中断描述符表(IDT)。这些中断描述符会告诉处理器到那里可以找到中断处理程序。和实模式一样，每一个中断都有一个入口，但是这些入口的格式却完全不同。因为在切换到保护模式的过程中没有使用到IDT，所以在此就不多做介绍了。 </p>
		<p>进入保护模式</p>
		<p>80386有4个32位控制寄存器，名字分别为CR0、CR1、CR2和CR3。CR1是保留在未来处理器中使用的，在80386中没有定义。CR0包含系统的控制标志，用于控制处理器的操作模式和状态。CR2和CR3是用于控制分页机制的。在此，我们关注的是CR0寄存器的PE位控制，它负责实模式和保护模式之间的切换。当PE=1时，说明处理器运行于保护模式之下，其采用的段机制和前面所述的相应内容对应。如果PE=0，那么处理器就工作在实模式之下。 </p>
		<p>切换到保护模式，实际就是把PE位置为1。为了把系统切换到保护模式，还要做一些其它的事情。程序必须要对系统的段寄存器和控制寄存器进行初始化。把PE位置1后，还要执行跳转指令。过程简述如下： </p>
		<p>1.创建GDT表; </p>
		<p>2.通过置PE位为1进入保护模式; </p>
		<p>3.执行跳转以清除在实模式下读取的任何指令。 </p>
		<p>下面使用代码来实现这个切换过程。 </p>
		<p>需要的东西</p>
		<p>◆ 一张空白软盘 </p>
		<p>◆ NASM编译器 </p>
		<p>下面是整个程序的源代码： </p>
		<p>org 0x07c00; 起始地址是0000:7c00 <br />jmp short begin_boot ; 跳过其它的数据，跳转到引导程序的开始处<br />bootmesg db "Our OS boot sector loading ......"<br />pm_mesg db "Switching to protected mode ...."<br />dw 512 ; 每一扇区的字节数<br />db 1 ; 每一簇的扇区数<br />dw 1 ; 保留的扇区号<br />db 2<br />dw 0x00e0 <br />dw 0x0b40 <br />db 0x0f0 <br />dw 9 <br />dw 18 <br />dw 2 ; 读写扇区号<br />dw 0 ; 隐藏扇区号<br />print_mesg :<br />mov ah,0x13 ; 使用中断10h的功能13，在屏幕上写一个字符串<br />mov al,0x00 ; 决定调用函数后光标所处的位置<br />mov bx,0x0007 ; 设置显示属性<br />mov cx,0x20 ; 在此字符串长度为32 <br />mov dx,0x0000 ; 光标的起始行和列<br />int 0x10 ; 调用BIOS的中断10h<br />ret ; 返回调用程序<br />get_key :<br />mov ah,0x00 <br />int 0x16 ; Get_key使用中断16h的功能0，读取下一个字符<br />ret<br />clrscr :<br />mov ax,0x0600 ; 使用中断10h的功能6，实现卷屏，如果al=0则清屏<br />mov cx,0x0000 ; 清屏<br />mov dx,0x174f ; 卷屏至23，79<br />mov bh,0 ; 使用颜色0来填充<br />int 0x10 ; 调用10h中断<br />ret<br />begin_boot :<br />call clrscr ; 先清屏<br />mov bp,bootmesg ; 提供串地址<br />call print_mesg ; 输出信息<br />call get_key ; 等待用户按下任一键<br />bits 16<br />call clrscr ; 清屏<br />mov ax,0xb800 ; 使gs指向显示内存<br />mov gs,ax ; 在实模式下显示一个棕色的A<br />mov word [gs:0],0x641 ; 显示<br />call get_key ; 调用Get_key等待用户按下任一键<br />mov bp,pm_mesg ; 设置串指针<br />call print_mesg ; 调用print_mesg子程序<br />call get_key ; 等待按键<br />call clrscr ; 清屏<br />cli ; 关中断<br />lgdt[gdtr] ; 加载GDT <br />mov eax,cr0 <br />or al,0x01 ; 设置保护模式位<br />mov cr0,eax ; 将更改后的字送至控制寄存器中<br />jmp codesel:go_pm<br />bits 32<br />go_pm : <br />mov ax,datasel <br />mov ds,ax ; 初始化ds和es，使其指向数据段<br />mov es,ax <br />mov ax,videosel ; 初始化gs，使其指向显示内存<br />mov gs,ax <br />mov word [gs:0],0x741 ; 在保护模式下显示一个白色的字符A<br />spin : jmp spin ; 循环<br />bits 16<br />gdtr :<br />dw gdt_end-gdt-1 ; gdt的长度<br />dd gdt ; gdt的物理地址<br />gdt<br />nullsel equ $-gdt ; $指向当前位置，所以nullsel = 0h<br />gdt0 ; 空描述符<br />dd 0 <br />dd 0 ; 所有的段描述符都是64位的<br />codesel equ $-gdt ; 这是8h也就是gdt的第二个描述符<br />code_gdt <br />dw 0x0ffff ; 段描述符的界限是4Gb<br />dw 0x0000 <br />db 0x00 <br />db 0x09a <br />db 0x0cf <br />db 0x00 <br />datasel equ $-gdt <br />data_gdt <br />dw 0x0ffff <br />dw 0x0000 <br />db 0x00 <br />db 0x092<br />db 0x0cf<br />db 0x00<br />videosel equ $-gdt <br />dw 3999 <br />dw 0x8000 ; 基址是0xb8000<br />db 0x0b<br />db 0x92 <br />db 0x00 <br />db 0x00<br />gdt_end<br />times 510-($-$$) db 0 <br />dw 0x0aa55</p>
		<p>
				<br />把上面的代码存在一个名为abc.asm的文件之中，使用命令nasm abc.asm，将得出一个名为abc的文件。然后插入软盘，输入命令：dd if=abc of=/dev/fd0。该命令将把文件abc写入到软盘的第一扇区之中。然后重新启动系统，就会看到如下的信息： </p>
		<p>*Our os booting................ <br />* A (棕色) <br />* Switching to protected mode.... <br />* A (白色)</p>
		<p>
				<br />对代码的解释</p>
		<p>上面给出了所有的代码，下面我对上述代码做一些解释。 </p>
		<p>◆ 使用的函数 </p>
		<p>下面是代码中一些函数的说明： </p>
		<p>print_mesg 该子程序使用了BIOS中断10h的功能13h，即向屏幕写一字符串。属性控制是通过向一些寄存器中送入不同的值来实现的。中断10h是用于各种字符串操作，我们把子功能号13h送到ah中，用于指明要打印一个字符串。al寄存器中的0说明了光标返回的起始位置，0表示调用函数后光标返回到下一行的行首。如果al为1则表示光标位于最后一个字符处。 </p>
		<p>显存被分成了几页，在同一时刻只能显示其中的一页。bh指明的是页号；bl则指明要显示字符的颜色；cx指明要显示字符串的长度；dx指明光标的位置(即起始的行和列)。所有相关寄存器初始化完成以后，就可以调用BIOS中断10h了。 </p>
		<p>get_key 使用中断16h的子功能00h，从屏幕得到下一个字符。 </p>
		<p>clrscr 该函数使用了中断10h的另外一个子功能06h，用于输出开始前清屏。初始化时给al中送入0。寄存器cx和dx指明要清屏的屏幕范围，在本例中是整个屏幕。寄存器bh指明屏幕填充的颜色，在本例中是黑色。 </p>
		<p>◆ 其它内容 </p>
		<p>程序一开始是一条短跳转指令，跳到begin_boot处。在实模式下，在此打印一个棕色的“A”，并且设置一个GDT。切换到保护模式，并且打印一个白色的“A”。这两种模式使用的都是自己的寻址方法。 </p>
		<p>在实模式下，使用段寄存器gs指示显存位置，我们使用的是CGA显卡(默认基址是0xb8000)。在代码中是不是漏了一个0呢？没有，因为实模式下会提供一个附加的0。这种方式也被80386继承下来了。A的ASCⅡ是0x41，0x06指明了需要一个棕色的字符。该显示会一直持续直至按下任意键。下面要在屏幕上显示一句话，告诉使用者下面马上要进入保护模式了。 </p>
		<p>启动到保护模式，在进行切换时不希望此时有中断的影响，故要关闭所有的中断(使用cli来实现)。然后对GDT初始化。在整个切换过程中，对4个描述符进行了初始化。这些描述符对代码段(code_gdt)、数据和堆栈段(data_gdt)，以及为了访问显存而对显示段进行初始化。此外，还会对一个空描述符进行初始化。 </p>
		<p>GDT的基址要加载至GDTR系统寄存器之中。gdtr段的第一个字加载的是GDT的大小，在下一个双字中则加载的是基址。然后，lgdt指令把把gdt段加载至GDTR寄存器中。现在已经做好了切换到保护模式前的所有准备。最后一件事情就是把CR0寄存器的PE位置1。不过，即使这样还没有处于保护模式状态之下。 </p>
		<p>设置了PE位以后，还需要通过执行JMP指令来清除处理器指令预取队列。在80386中，使用指令前总是先将其从内存中取出，并且进行解码和寻址。然而，当进入保护模式以后，预取指令信息(它还处于实地址模式)就无效了。使用JMP指令的目的就是强迫处理器放弃无效的信息。 </p>
		<p>现在，已经在保护模式下了。那么，如何检测是在保护模式状态之下呢？让我们来看一看屏幕上这个白色的字母A。在这里，使用了数据段选择符(datase1)对数据段和附加段进行了初始化，使用显示段选择符(videose1)对gs进行了初始化。告示的字符“A”其ASCⅡ值和属性位于[gs:0000]处，也就是b8000:0000处。循环语句使得该字符一直在屏幕上显示，直至重新启动系统。 </p>
		<p>下一步要做的事</p>
		<p>现在，这个操作系统已经工作在保护模式下了，但是实际上它并不实现什么具体的功能。你可以在这个基础上为它增加各种操作系统所具有的功能。我们自己动手写操作系统到此也就告一段落。 <br /></p>
<img src ="http://www.cnitblog.com/weitom1982/aggbug/22237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/weitom1982/" target="_blank">高山流水</a> 2007-01-23 13:07 <a href="http://www.cnitblog.com/weitom1982/archive/2007/01/23/22237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>嵌入式测试的文字</title><link>http://www.cnitblog.com/weitom1982/archive/2006/07/24/14102.html</link><dc:creator>高山流水</dc:creator><author>高山流水</author><pubDate>Mon, 24 Jul 2006 03:34:00 GMT</pubDate><guid>http://www.cnitblog.com/weitom1982/archive/2006/07/24/14102.html</guid><wfw:comment>http://www.cnitblog.com/weitom1982/comments/14102.html</wfw:comment><comments>http://www.cnitblog.com/weitom1982/archive/2006/07/24/14102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/weitom1982/comments/commentRss/14102.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/weitom1982/services/trackbacks/14102.html</trackback:ping><description><![CDATA[嵌入式软件测试的困难之一就是如何获取测试产生的数据, 大多数的软件测试工具在测试软件的时候都要提供测试脚本,如果进行覆盖率分析就要对代码插装, 测试可执行程序在目标环境下运行时就会有数据产生,这些数据就是产生测试报告的重要输入条件, 所以要顺利实现嵌入式软件测试, 首先需要解决的就是如何把测试数据上载会主机.<br />经过我们实际摸索发现, 大概我们可以把数据的上载分为3 种方式:<br />1. 实际的物理通道<br />2. 开发工具IDE的虚拟IO功能<br />3. 读取内存区数据<br />下面我们对这几种方式做一些简单的介绍:<br />实际的物理通道<br />这种方式就是目标机和主机之间具备物理的通信方式, 比如以太网, 串口,并口, USB等, 这几种方式, 在测试的时候我们可以直接使用这种通信程序, 和主机通信, 实现测试数据上载, 一般情况下,测试工具的库中IO函数使用fprintf(), 那么在这种方式下,就需要修改测试工具的库, 假设以太网的发数据的函数是Netsend(), 那么我们需要定制fprintf, 使它调用Netsend(), 这样就可以实现数据上传了. 这种方式最方便但是要求系统必须已经具备这种通信方式和通信软件, 一般适用于系统级的测试.<br />开发工具虚拟IO<br />开发嵌入式软件一般需要支持交叉开发方式的开发工具, 大多数这种开发工具具备编译,下载,调试的功能, 测试时也可以借助开发工具来下载测试程序, 需要注意的是, 有些高级的开发工具IDE, 具备虚拟IO功能, 给测试带来了很大的方便, 比如说: Tornado, TI CCS,<br />在Tornado的shell中运行测试程序时, 可以把printf的内容打印到消息窗口中, CCS可以支持fprintf,直接在主机上生成测试数据文件, 用户在使用这些工具的时候, 就像在主机上测试一样, 完全可以理由开发工具赋予的模拟IO功能.<br />读取内存数据<br />假设目标系统既没有物理通信方式, 开发工具也没有虚拟IO功能, 我们还可以采用读取内存数据的方式, 我们可以开辟一块足够大的缓存, 修改测试工具的库, 把输出的数据写入buffer中, 在测试过程中或者测试执行后, 使用开发工具读取内存的功能把缓存中的数据读取出来,在主机上保存成文件,这种方式需要系统有足够的内存资源, 但是适用性很广,因为几乎所有的开发调试工具都具备这样的功能. <br />总之嵌入式软件测试很复杂, 需要根据实际情况采取不同的策略. 本文只是单独就数据读取的问题做了一些讨论. <br /><img src ="http://www.cnitblog.com/weitom1982/aggbug/14102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/weitom1982/" target="_blank">高山流水</a> 2006-07-24 11:34 <a href="http://www.cnitblog.com/weitom1982/archive/2006/07/24/14102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>相对最完整的软件测试工具手册 </title><link>http://www.cnitblog.com/weitom1982/archive/2006/07/24/14100.html</link><dc:creator>高山流水</dc:creator><author>高山流水</author><pubDate>Mon, 24 Jul 2006 03:21:00 GMT</pubDate><guid>http://www.cnitblog.com/weitom1982/archive/2006/07/24/14100.html</guid><wfw:comment>http://www.cnitblog.com/weitom1982/comments/14100.html</wfw:comment><comments>http://www.cnitblog.com/weitom1982/archive/2006/07/24/14100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/weitom1982/comments/commentRss/14100.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/weitom1982/services/trackbacks/14100.html</trackback:ping><description><![CDATA[
		<div class="posthead">
				<h2>
						<span id="_ctl3_lblPermalink">
								<span>
										<font size="2">1、 从测试功能上分<br />（1） 单元测试<br />针对不同语言，如JUNIT<br />（2） 功级测试<br />E—Test：功能强大，由于不是采用POST URL的方式回放脚本，所以可以支持多内码的测试数据（当然要程序支持），基本上可以应付大部分的WEB SITE。<br />MI公司的WINRUNNER<br />COMPUWARE的QARUN<br />RATIONAL的SQA ROBOT<br />（3） 压力测试<br />MI公司的WINLOAD<br />COMPUWARE的QALOAD<br />RATIONAL的SQA LOAD<br />（4） 负载测试<br />LOADRUNNER<br />RATIONAL VISUAL QUANTIFY<br />（5） WEB<a href="http://www.testage.net/AutoTest/">测试工具</a><br />MI公司的ASTRA系列<br />RSW公司的E—TEST SUITE等<br />（6） WEB系统<a href="http://www.testage.net/AutoTest/">测试工具</a><br />WORKBENCH<br />WEB APPLICATION STRESS TOOL（WAS）<br />（7） 数据库<a href="http://www.testage.net/AutoTest/">测试工具</a><br />TESTBYTES<br />（8） 回归<a href="http://www.testage.net/AutoTest/">测试工具</a><br />RATIONAL TEAM TEST<br />WINRUNNER<br />（9） 嵌入式<a href="http://www.testage.net/AutoTest/">测试工具</a><br />ATTOLTESTWARE。是ATTOLTESTWARE公司的自动生成测试代码的<a href="http://www.testage.net/">软件测试</a>工具，特别适用于嵌入式实时应用软件单元和通信系统测试。<br />CODETEST是AppliedMicrosystemsCorp.公司的产品,是广泛应用的嵌入式软件在线<a href="http://www.testage.net/AutoTest/">测试工具</a>。<br />GammaRay。GammaRay系列产品主要包括软件逻辑分析仪GammaProfiler、可靠性评测工具GammaRET等。<br />LogiScope是TeleLogic公司的工具套件，用于代码分析、<a href="http://www.testage.net/">软件测试</a>、覆盖测试。<br />LynxInsure++是LynxREAL-TIMESYSTEMS公司的产品，基于LynxOS的应用代码检测与分析<a href="http://www.testage.net/AutoTest/">测试工具</a>。<br />MessageMaster是ElviorLtd.公司的产品，测试嵌入式软件系统工具，向环境提供基于消息的接口。<br />VectorCast是VectorSoftware.Inc公司的产品。由6个集成的部件组成，自动生成测试代码，为主机和嵌入式环境构造可执行的测试架构。<br />（10） 系统性能<a href="http://www.testage.net/AutoTest/">测试工具</a><br />Rational Performance<br />（11） 页面链接测试<br />Link Sleuth<br />（12） 测试流程管理工具<br />Test Plan Control<br />（13） 测试管理工具<br />TestDirector<br />Rational公司的Test Manager<br />Compuware公司的QADirector<br />TestExpert：是Silicon Valley Networks公司产品的测试管理工具，能管理整个测试过程，从测试计划、测试例程、测试执行到测试报告。<br />（14） 缺陷跟踪工具<br />TrackRecord等<br />（15） 其他<a href="http://www.testage.net/AutoTest/">测试工具</a>包<br />TestVectorGenerationSystem是T—VECTechnologies公司的产品。提供自动模型分析、测试生成、测试覆盖分析和测试执行的完整工具包，具有方便的用户接口和完备的文档支持。<br />TestQuestPro是TestQuest公司的非插入码式的自动操纵<a href="http://www.testage.net/AutoTest/">测试工具</a>，提供一种高效的自动检测目标系统，获取其输出性能的测试方法。<br />TestWorks是SoftwareResearch.Inc公司的一整套<a href="http://www.testage.net/">软件测试</a>工具，既可单独使用，也可捆绑销售使用。<br />2、 从测试的方法上分：<br />（1） 白盒<a href="http://www.testage.net/AutoTest/">测试工具</a><br />白盒测试工主要有：Numega、PuRe、软件纠错工具（Rational Purify）。<br />内存资源泄漏检查：<br />Numega中的BounceChecher<br />Rational的 Purify等<br />代码覆盖率检查：<br />Numega的TrueCoverage<br />Rational的PureCoverage<br />TeleLogic公司的LogiScope<br />Macabe公司的Macabe<br />代码性能检查：<br />Numega的TrueTime<br />Rational的Quantify等<br />代码静态度量分析度量检查工具：LogiScope和Macabe等<br />黑盒<a href="http://www.testage.net/AutoTest/">测试工具</a>主要有：QACenter、SQATeamTest、Rational Visual Visual Test。<br />QACenter：QACenter帮助所有测试人员创建一个快速、可重用的测试过程。这些<a href="http://www.testage.net/AutoTest/">测试工具</a>自动帮助管理测试过程、快速分析和调试程序，包括针对回归、强度、单元、并发、集成、移植，容量和负载建立测试用例，自动执行测试和产生文档结果。QACenter主要包括以下几个模块：<br />QARun：应用的功能<a href="http://www.testage.net/AutoTest/">测试工具</a>。<br />QALoad：强负载下应用的性能<a href="http://www.testage.net/AutoTest/">测试工具</a>。<br />QADirector：测试的组织设计和创建以及管理工具。<br />TrackRecord：集成的缺陷跟踪管理工具。<br />EcoTools：高层次的性能监测工具。<br /><br /><br />3、部分具体<a href="http://www.testage.net/AutoTest/">测试工具</a>的介绍<br />（1）、性能优化工具EcoScope<br />EcoScope 是一套定位于应用（即服务提供者本身）及其所依赖的所有网络计算资源的解决方案。EcoScope可以提供应用视图，并标出应用是如何与基础架构相关联的。这种视图是其他网络管理工具所不能提供的。EcoScope能解决在大型企业复杂环境下分析与测量应用性能的难题。通过提供应用的性能级别及其支撑架构的信息，EcoScope能帮助IT部门就如何提高应用性能提出多方面的决策方案。<br />EcoScope的应用主要表现在以下几个方面：<br />确保成功部署新应用<br />维护性能的服务水平<br />加速问题检测与纠正的高级功能<br />定制视图有助于高效地分析数据<br />（2）、数据库测试数据自动生成工具——TestBytes<br />在数据库开发的过程中，为了测试应用程序对数据库的访问，应当在数据库中生成测试用例数据，我们可能会发现当数据库中只有少量数据时，程序可能没有问题，但是当真正投入到运用中产生了大量数据时就出现问题了，这往往是因为程序的编写没有达到，所以一定及早地通过在数据库中生成大量数据来帮助开发人员完善这部分功能和性能。<br />TestBytes是一个用于自动生成测试数据的强大易用的工具，通过简单的点击式操作，就可以确定需要生成的数据类型（包括特殊字符的定制），并通过与数据库的连接来自动生成数百万行正确的测试数据，可以极大地提高数据库开发人员、QA测试人员、数据仓库开发人员、应用开发人员的工作效率。<br />（3）、PC—LINT<br />PC—LINT 主要进行更严格的语法检查功能，还完成相当程度的语义检查功能。可以这样认为：PC—LINT是一个更加智能、更加严格的编译器。PC—LINT在实现语法和某些语义规则检查时，是通过参数配置完成的，它的选项就有数百个之多，因此，在使用PC—LINT过程中，了解选项的含义也很重要。<br />（4）、TCL<br />TCL是Tool Command Language的缩写，它是一种很流行的脚本解释器，尤其在测试领域，它的最大特点是可移植性好，接口简单，方便，可以很容易地嵌入到软件中，作为自己的解释器使用。<br />TCL提供两种接口：编程接口和用户接口。编程接口是通过LIB或DLL形式提供的，提供了一些函数（命令）供调用，包括：分配一个解释器指针（对象）；初始化解释器（指针）；注册扩展函数等。用户接口很简单，即编写的脚本，脚本里面包含对扩展命令的调用。<br />（5）VB<a href="http://www.testage.net/AutoTest/">测试工具</a>：VB Watch<br />（6）Java 程序的<a href="http://www.testage.net/AutoTest/">测试工具</a><br />1）Bean—Test<br />2）EJBQuickTest<br />3）JStyle<br />4）JTest<br />5）HttpUnit<br />6）JUnit<br />（7）、覆盖测试<br />C—Cover<br />C—Cover是一个<a href="http://www.testage.net/AutoTest/">测试工具</a>软件，用来找出没有被测到的代码，并报告测试的覆盖率。C—Cover<br />只支持C/C++的代码覆盖率分析，其它语言不支持。但不受OS的限制。<br /></font>
										<font size="3">===============================================<br /><font size="2">单元测试方面：（对开发人员比较有用） J-Unit工具。<br />  功能测试方面：E-test是个不错的选择，功能很强大，由于不是采用Post URL的方式回放脚本，所以可以支持多内码的测试数据（当然要程序支持）。基本上可以应付大部分的Web Site。<br />  如果只是利用脚本回放代替手工劳动，或者做对页面响应数的性能测试，Microsoft Web Application Stress Tool是个不错的选择。<br />   另外，在性能测试方面，PureLoad也是一个不错的工具，完全用Java写成，可以测试各种C/S程序，如SMTP Server等。这两个工具都是使用Post URL的方法测试Web Application的。对大量使用JavaScript的页面不太适合。当然，如果程序在Unix，linux下面运行的话，可以直接编写Shell 脚本程序，更加方便。<br />  另外，还有很多专门的工具，比如说Linkbot是专门作页面链接测试的。<br />  另外，测试流程管理工具也有不少，个人用过也一直在用的是Test Plan Control，短小精悍，不错。   至于WinRunner和LoadRunner之类，因为没有License，所以都没怎么用过，惭愧。不过我看过一篇英国人评价英国测试市场上最流行的五个软件的文章。WinRunner得分最高。<br />  <a href="http://www.testage.net/AutoTest/">测试工具</a>从测试的方法上可以分为两种：白盒测试和黑盒测试   白盒<a href="http://www.testage.net/AutoTest/">测试工具</a>主要有：<br />  内存资源泄漏检查：Numega中的bouncechecker,Rational的Purify等<br />   代码覆盖率检查：Numega中的truecoverage,Rational的Purecoverage，Telelogic公司的 logiscope, Macabe公司的Macabe等   代码性能检查：Numega中的truetime,Rational的Quantify等<br />  代码静态度量分析质量检查工具：logiscope和Macabe等<br />  黑盒<a href="http://www.testage.net/AutoTest/">测试工具</a>主要有：   客户端功能测试：MI公司的winrunner,compuware的qarun,Rational的SQA robot等等<br />  服务器端压力性能测试： MI公司的winload,compuware的qaload,Rational的SQA load等等<br />  Web<a href="http://www.testage.net/AutoTest/">测试工具</a>：MI公司的Astra系列，rsw公司的e-test suite等等<br />  测试管理工具：rational的test manager,compuware的qadirector等等，此外还有缺陷跟踪工具 trackrecord等。<br />  数据库<a href="http://www.testage.net/AutoTest/">测试工具</a>:TestBytes<br />  黑盒<a href="http://www.testage.net/AutoTest/">测试工具</a>：QACenter、SQATeamTest，Rational Viaual Test。<br />  回归<a href="http://www.testage.net/AutoTest/">测试工具</a>：Rational TeamTest，WinRunner（MI公司）<br />  WEB系统<a href="http://www.testage.net/AutoTest/">测试工具</a>：TEST，Workberch，Web Appication Stress Tool（WAS）<br />  白盒<a href="http://www.testage.net/AutoTest/">测试工具</a>：Numega 、PuRe、软件纠错工具（Rational Purity）。<br />  嵌入式<a href="http://www.testage.net/AutoTest/">测试工具</a>：Logiscope（静态<a href="http://www.testage.net/AutoTest/">测试工具</a>）、CodeTest。<br />  系统负荷<a href="http://www.testage.net/AutoTest/">测试工具</a>：RationalPerformance<br />  涵盖<a href="http://www.testage.net/AutoTest/">测试工具</a>范围评估工具<br />  软件性能<a href="http://www.testage.net/AutoTest/">测试工具</a>：LoadRunner（MI产品）、Rational Visual Qantify<br />  测试管理工具：TestDirector（MI产品支持整个生命周期中测试流程管理）</font></font>
								</span>
						</span>
				</h2>
		</div>
<img src ="http://www.cnitblog.com/weitom1982/aggbug/14100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/weitom1982/" target="_blank">高山流水</a> 2006-07-24 11:21 <a href="http://www.cnitblog.com/weitom1982/archive/2006/07/24/14100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注册表被破坏的现象 </title><link>http://www.cnitblog.com/weitom1982/archive/2006/05/08/10215.html</link><dc:creator>高山流水</dc:creator><author>高山流水</author><pubDate>Mon, 08 May 2006 09:15:00 GMT</pubDate><guid>http://www.cnitblog.com/weitom1982/archive/2006/05/08/10215.html</guid><wfw:comment>http://www.cnitblog.com/weitom1982/comments/10215.html</wfw:comment><comments>http://www.cnitblog.com/weitom1982/archive/2006/05/08/10215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/weitom1982/comments/commentRss/10215.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/weitom1982/services/trackbacks/10215.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="585" border="0">
				<tbody>
						<tr>
								<th class="f24">
										<h1> </h1>
								</th>
						</tr>
						<tr>
								<td>
										<hr size="1" bgcolor="#d9d9d9" />
								</td>
						</tr>
						<tr>
								<td align="middle" height="20">
								</td>
						</tr>
						<tr>
								<td height="15">
										<p align="center">
										</p>
								</td>
						</tr>
						<tr>
								<td class="l17" align="right">
								</td>
						</tr>
						<tr>
								<td class="f14" id="zoom">一、注册表遭到破坏后，可能会出现以下现象：<br />·无法启动系统<br />·无法运行或正常运行合法的应用程序<br />·找不到启动系统或运行应用程序所需的文件<br />·没有访问应用程序的权限<br />·不能正确安装或调入驱动程序<br />·不能进行网络连接<br />·注册表条目有误<br />二、注册 
<table cellspacing="0" cellpadding="0" align="left"><tbody><tr><td></td></tr></tbody></table>表被破坏的原因<br />通常注册表被破坏的原因可以归纳为以下四类。<br />1、应用程序错误<br />通常用户需要经常在Windows操作系统中添加或删除各种应用程序。而在实际使用过程中，很少有完全没有错误的应用程序，那些看似很微小的错误，可能会导致非常严重的后果。同时，当计算机中安装了大量软件后，有可能出现彼此间的冲突。此外，一些做Beta测试的软件，自身也没有定型，还存在许多错误，可能会对注册表造成影响。这些应用程序在注册表中添加了错误的内容。错误的数据文件和应用程序间的关联，是破坏注册表的一个潜在原因。<br />2、驱动程序不兼容<br />由于PC机的体系结构是一个开放性的体系结构，当驱动程序和其他程序协同工作的时候，就会发生不兼容的现象。又或者某些驱动程序是16位的，在安装到32位的Windows 9x操作系统后，也会出现不兼容的现象。<br />3、硬件问题<br />除了非正常断电外，比如硬盘、内存或其他硬件的质量不过关，都会造成数据读写错误或因过度超频等状况使机器的稳定性下降，以及病毒等对BIOS程序或CMOS存储器造成破坏等，都可能导致注册表的破坏。<br />4、误操作<br />注册表中的数据众多、内容复杂，不太熟悉注册表的用户在手工修改注册表时，很可能会破坏注册表中的内容。用户可能在无意间将某个重要的键值删除或双击了某个注册表文件将其导入了注册表，这些操作都极易破坏整个系统。<br />这个问题，用户可以尝试将系统对双击注册表文件的响应，由默认的“合并”该为“编辑”，以避免用户的误操作，提供系统安全性。具体的操作步骤如下。<br />步骤<br />(1)打开任意一个浏览器窗口，选择【查看】菜单下的【文件夹选项】选项，打开“文件夹选项”对话框，再打开“文件类型”选项卡。<br />(2)选中“注册表项目”，单击【编辑】按钮，随即系统将弹出“编辑文件类型”对话框，选中“编辑”并单击【设为默认值】按钮。<br />(3)单击【关闭】按钮即可。<br />这样，再单击.reg的注册表文件时，它的默认行就会变成编辑状态，与Windows界面的其他部分保持了一致。<br />三、注册表的还原及恢复<br />如果在注册表被破坏前进行了备份，则修改注册表就会比较方便，否则就要借助于一些专用工具了。通常，要恢复注册表，应从最简单的方法做起。这里，将从易到难逐一给大家介绍。 <br />1、重新启动系统<br />这是最简单的处理方法。由于Windows注册表中的许多信息都保存在内存中，并且每次启动系统时，注册表都会把硬盘中的信息调入内存，所以用户可以通过重新将硬盘中的数据调入内存的方式来修正各种错误。在启动Windows时出现错误信息时，单击【确定】按钮，则Windows将首先恢复注册表，然后进入启动过程，若注册表的错误较轻，可能机器启动后系统就会恢复如初了。<br />虽然并不是所有情况下都适用这种方法，但在做复杂的处理之前可以试一试。<br />2、使用安全模式启动<br />若在启动Windows系统时遇到注册表错误，可以尝试在安全模式下启动。具体做法是在启动时，单击【F5】键，此时系统会自动修复注册表问题。若在安全模式下启动成功，就可以在正常模式下启动Windows系统了。<br />3、简单拷贝法还原<br />对Windows95来讲，可以利用自身提供的备份文件，进行简单的拷贝，覆盖现有的注册表文件。具体的操作步骤与备份的过程类似。这里就不再做过多的解释了。<br />4、Windows98自动备份的还原<br />若可以进入Windows，哪怕只是在安全模式下，只要Win Zip等支持CAB压缩格式的软件选择最近的或前几天的备份压缩包文件，将其中的4个文件解压出来，重新启动计算机到DOS下，利用这些文件覆盖相应的文件即可。 <br />若无法进入Windows，可以尝试在DOS下利用Windows自带的Extract.exe文件打开该压缩文件，恢复替换原注册表文件即可，命令为“extract/Y Sysbackup\rb00?.cab”（其中？为0～4）。<br />5、Windows2000备份的还原<br />用户可以在启动Windows2000时使用备份的注册表来恢复，具体的操作步骤如下。<br />步骤<br />(1)在任务栏上单击【开始】按钮，然后单击【关闭系统】选项。<br />(2)单击【重新启动】之后，单击【确定】按钮。<br />(3)当屏幕出现“正在启动Windows2000”提示后，单击【F8】键。<br />(4)使用箭头键，选中“最后一次正确配置”，然后按回车键确认，系统将启动Windows2000。<br />操作执行完毕，注册表被还原到上一次成功启动计算机时的状态。<br />6、利用导入法完全还原<br />可以在Windows或DOS下，利用导出的注册表文件还原系统。通常，为了保险起见，用户最好在安全模式下或直接在DOS下操作。<br />在Windows下恢复注册表时，在注册表编辑器中，单击【注册表】菜单中的【引入注册表文件】选项，在出现的对话框中选中所需恢复的备份文件，再单击【打开】按钮即可将注册表备份还原到Windows系统中了。<br />7、利用导入法部分还原<br />部分还原是指利用以前备份的注册表文件或其他注册表文件来覆盖现有的主键，也就是“还原项”。具体的操作步骤如下。<br />步骤<br />(1)在Regedit32注册表编辑器中，将光标移至要还原的主键上。<br />(2)选择【注册表】菜单下的【还原】命令，并在“还原项”对话框中选择要还原的注册表文件。<br />(3)单击【打开】按钮，确认覆盖现有的主键后，即可还原该项到当前选定的项上。<br />8、利用加载配置单元还原<br />“加载配置单元”和“卸载配置单元”这两个命令仅