﻿<?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>C++博客-inwind</title><link>http://www.cppblog.com/inwind/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2026 05:36:54 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2026 05:36:54 GMT</pubDate><ttl>60</ttl><item><title>记录分手</title><link>http://www.cppblog.com/inwind/archive/2006/04/09/5201.html</link><dc:creator>inwind</dc:creator><author>inwind</author><pubDate>Sun, 09 Apr 2006 09:43:00 GMT</pubDate><guid>http://www.cppblog.com/inwind/archive/2006/04/09/5201.html</guid><wfw:comment>http://www.cppblog.com/inwind/comments/5201.html</wfw:comment><comments>http://www.cppblog.com/inwind/archive/2006/04/09/5201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/inwind/comments/commentRss/5201.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/inwind/services/trackbacks/5201.html</trackback:ping><description><![CDATA[分手，是由短信开始！<br /><br />06.04.01   14：52<br />   宝贝，我亲爱的宝贝，请你去爱别人，好吗？你是我一生最好的朋友，是我的亲人，可是不再有恋人的感觉了。<br /><br />06.04.02   16：05<br />修不好算了，也不要紧，钱不重要，下次攒钱买个好些的<br /><br />06.04.02   18：16<br />不开通网络，电脑对我没有用的，你先拿去用吧，哪天来拿说一声就好。<br /><br />06.04.02   19：26<br />你知道，这两年来我们之间一直有些人，我不是好女人，但是为了你我都结束了。只是我现在忽然有了年龄压力<br /><br />06.04.02   19：42<br />不是的，单纯的年龄小些的女孩子更适合你，而我需要各方面都制得住我的，请相信我是理智的<br /><br />06.04.02   19：55<br />对我来说，没什么是长久的<br /><br />06.04.02   20：14<br />这件事你不要告诉别人，我不希望公司里有干扰。公司里你还是我名义上的男友。<br /><br />06.04.02   20：41<br />我们把最美好的岁月都给了彼此，没有什么可遗憾的了。<br /><br />06.04.02   21：07<br />你永远是我最好最可信赖的朋友，我会在北京待几年，因为还喜欢这份工作。但将来应该会去上海的。<br /><br />06.04.03   21：33<br />我会的。谢谢你！我牵挂你如同你牵挂我，家里都是白酒味，呵呵。<br /><br />06.04.03   21：45<br />不一定离婚，但是很可能出轨/不要去追究了，从功利或者世俗的角度看，我们不适合过一声，我作的很，而你适合好女孩子。<br /><br />06.04.03   22：10<br />这次你比我想象的坚强，也许我们习惯了彼此看作孩子吧。我还梦想着有天能用学生的方式去蝥源，不知道是否永远变成一个梦想。我们都是完美主义者，而世界永远是不完美的，不说了，干活，你也好好看书，我们都好好生活：）<br /><br />06.04.09   11：51<br />我们之间近两年有一些小插曲，你也知道我因为害怕伤害你，最终都放弃了，可是恋爱太久，确实没有激情了，也不想平淡过下去。<br /><br />06.04.09   11：54<br />你对我太好，我却不知足，反而觉得有压力，对我而言保留一个人的空间很重要，即使一个人住，一个人打扫，不用迁就别人的感觉很自由。<br /><br />06.04.09   16：02<br />我遇到一个和自己很象的人，彼此都看得透，但是都不说，类似的人可能不是个好选择，也不会长久，但是这次我不想再背着你，脚踏两条船会有负疚感<br /><br />06.04.09   16：29<br />你不明白，我却了解自己，我实在是太爱玩了，根本不能用理智控制自己，不论什么结果，将来出什么乱子都是自找的。但是，不该一再对不起你。这样我再没有心理负担了。<br /><br />06.04.09   22：05<br />我知道，你是少有的好男人，但是我更看重情商，你明白吗？你的成熟度已经比我落后，以后也不可能赶上，因为你我环境不同，而且我也在成长。<br /><br />06.04.09   22：12<br />谢谢你一直以来的宽容和爱护，你是我一辈子的亲人和朋友，我依旧牵挂你的点点滴滴，只有这次，我必须负你，其他能为你做的，我绝不犹豫<br /><br />06.04.09   22：26<br />别计较这些了，好吗？我很可能是错的，是幼稚的，但是我既然已经做了决定，请尊重我，后果我也会自己承担<br /><br />06.04.06   22：36<br />恩，我知道，这次经历会让我们都更成熟，我很喜欢你这样，结束吧，这段恋爱的结束，也许是新的开始，我对你的感情，早就是亲情了。<br /><br />06.04.09   22：51<br />谢谢你，亲爱的，谢谢你的努力！但这是我最后一次说爱你了，对了，我给你带了两袋奶酪，不知道你会不会喜欢，我睡了，再见<br /><img src ="http://www.cppblog.com/inwind/aggbug/5201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/inwind/" target="_blank">inwind</a> 2006-04-09 17:43 <a href="http://www.cppblog.com/inwind/archive/2006/04/09/5201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>空心 ,和心痛</title><link>http://www.cppblog.com/inwind/archive/2006/04/03/4920.html</link><dc:creator>inwind</dc:creator><author>inwind</author><pubDate>Mon, 03 Apr 2006 00:13:00 GMT</pubDate><guid>http://www.cppblog.com/inwind/archive/2006/04/03/4920.html</guid><wfw:comment>http://www.cppblog.com/inwind/comments/4920.html</wfw:comment><comments>http://www.cppblog.com/inwind/archive/2006/04/03/4920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/inwind/comments/commentRss/4920.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/inwind/services/trackbacks/4920.html</trackback:ping><description><![CDATA[
		<div>比干问菜农，空心菜无心是菜，人如果无心了呢？</div>
		<div> </div>
		<div>终于明白中国古人为什么用心痛，伤心，揪心这些词了。</div>
		<div> </div>
		<div>思考的是大脑，可是，痛得是心，挥之不去的，痛彻心菲的</div>
<img src ="http://www.cppblog.com/inwind/aggbug/4920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/inwind/" target="_blank">inwind</a> 2006-04-03 08:13 <a href="http://www.cppblog.com/inwind/archive/2006/04/03/4920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几个教训</title><link>http://www.cppblog.com/inwind/archive/2006/03/21/4406.html</link><dc:creator>inwind</dc:creator><author>inwind</author><pubDate>Tue, 21 Mar 2006 04:02:00 GMT</pubDate><guid>http://www.cppblog.com/inwind/archive/2006/03/21/4406.html</guid><wfw:comment>http://www.cppblog.com/inwind/comments/4406.html</wfw:comment><comments>http://www.cppblog.com/inwind/archive/2006/03/21/4406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/inwind/comments/commentRss/4406.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/inwind/services/trackbacks/4406.html</trackback:ping><description><![CDATA[1. 数据结构不必强求功能复杂，够用就行，太复杂的数据结构难于控制，并且消耗资源。<br />2. 注意内存的分配＆回收，设计实现时一定要清楚所使用内存的生存周期，出生点＆死亡点<br />3. 初始化，所有使用的变量一定要初始化，一点点的开销，可以节省大量的时间<br />4. 算法的修炼有欠火候<img src ="http://www.cppblog.com/inwind/aggbug/4406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/inwind/" target="_blank">inwind</a> 2006-03-21 12:02 <a href="http://www.cppblog.com/inwind/archive/2006/03/21/4406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>uClinux系统简介</title><link>http://www.cppblog.com/inwind/archive/2006/02/10/3159.html</link><dc:creator>inwind</dc:creator><author>inwind</author><pubDate>Fri, 10 Feb 2006 01:52:00 GMT</pubDate><guid>http://www.cppblog.com/inwind/archive/2006/02/10/3159.html</guid><wfw:comment>http://www.cppblog.com/inwind/comments/3159.html</wfw:comment><comments>http://www.cppblog.com/inwind/archive/2006/02/10/3159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/inwind/comments/commentRss/3159.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/inwind/services/trackbacks/3159.html</trackback:ping><description><![CDATA[<P>项目主页: <A href="http://www.uclinux.org/" target=_blank>http://www.uclinux.org/</A> <BR><BR><STRONG>简介</STRONG><BR>Linux是一种很受欢迎的操作系统，它与UNIX系统兼容，开放源代码。它原本被设计为桌面系统，现在广泛应用于服务器领域。而更大的影响在于它正逐渐的应用于嵌入式设备。uClinux正是在这种氛围下产生的。在uClinux这个英文单词中u表示Micro，小的意思，C表示Control，控制的意思，所以uClinux就是Micro-Control-Linux，字面上的理解就是"针对微控制领域而设计的Linux系统"。<BR><BR><B>uClinux小型化的做法</B><BR><BR><B>标准Linux可能采用的小型化方法</B><BR>1. 重新编译内核<BR>Linux内核采用模块化的设计，即很多功能块可以独立的加上或卸下，开发人员在设计内核时把这些内核模块作为可选的选项，可以在编译系统内核时指定。因此一种较通用的做法是对Linux内核重新编译，在编译时仔细的选择嵌入式设备所需要的功能支持模块，同时删除不需要的功能。通过对内核的重新配置，可以使系统运行所需要的内核显著减小，从而缩减资源使用量。<BR>2. 制作root文件系统映象<BR>Linux系统在启动时必须加载根（root）文件系统，因此剪裁系统同时包括root file system的剪裁。在x86系统下，Linux可以在Dos下，使用Loadlin文件加载启动，<BR><B>uClinux采用的小型化方法</B><BR>1．uClinux的内核加载方式<BR>uClinux的内核有两种可选的运行方式：可以在flash上直接运行，也可以加载到内存中运行。这种做法可以减少内存需要。<BR>Flash运行方式：把内核的可执行映象烧写到flash上，系统启动时从flash的某个地址开始逐句执行。这种方法实际上是很多嵌入式系统采用的方法。<BR>内核加载方式：把内核的压缩文件存放在flash上，系统启动时读取压缩文件在内存里解压，然后开始执行，这种方式相对复杂一些，但是运行速度可能更快（ram的存取速率要比flash高）。同时这也是标准Linux系统采用的启动方式。<BR>2．uClinux的根（root）文件系统<BR>uClinux系统采用romfs文件系统，这种文件系统相对于一般的ext2文件系统要求更少的空间。空间的节约来自于两个方面，首先内核支持 romfs文件系统比支持ext2文件系统需要更少的代码，其次romfs文件系统相对简单，在建立文件系统超级块（superblock）需要更少的存储空间。Romfs文件系统不支持动态擦写保存，对于系统需要动态保存的数据采用虚拟ram盘的方法进行处理（ram盘将采用ext2文件系统）。<BR>3．uClinux的应用程序库<BR>uClinux小型化的另一个做法是重写了应用程序库，相对于越来越大且越来越全的glibc库，uClibc对libc做了精简。<BR>uClinux对用户程序采用静态连接的形式，这种做法会使应用程序变大，但是基于内存管理的问题，不得不这样做（这将在下文对uClinux内存管理展开分析时进行说明），同时这种做法也更接近于通常嵌入式系统的做法。<BR><BR><B>uClinux的开发环境</B><BR><BR><B>GNU开发套件</B><BR>Gnu开发套件作为通用的Linux开放套件，包括一系列的开发调试工具。主要组件：<BR>Gcc： 编译器，可以做成交叉编译的形式，即在宿主机上开发编译目标上可运行的二进制文件。<BR>Binutils：一些辅助工具，包括objdump（可以反编译二进制文件），as（汇编编译器），ld（连接器）等等。<BR>Gdb：调试器，可使用多种交叉调试方式，gdb-bdm（背景调试工具），gdbserver（使用以太网络调试）。<BR>uClinux的打印终端<BR>通常情况下，uClinux的默认终端是串口，内核在启动时所有的信息都打印到串口终端（使用printk函数打印），同时也可以通过串口终端与系统交互。<BR>uClinux在启动时启动了telnetd（远程登录服务），操作者可以远程登录上系统，从而控制系统的运行。至于是否允许远程登录可以通过烧写romfs文件系统时有用户决定是否启动远程登录服务。<BR><B>交叉编译调试工具</B><BR>支持一种新的处理器，必须具备一些编译，汇编工具，使用这些工具可以形成可运行于这种处理器的二进制文件。对于内核使用的编译工具同应用程序使用的有所不同。在解释不同点之前，需要对gcc连接做一些说明： <BR>.ld（link description）文件：ld文件是指出连接时内存映象格式的文件。<BR>crt0.S：应用程序编译连接时需要的启动文件，主要是初始化应用程序栈。<BR>pic：position independence code ，与位置无关的二进制格式文件，在程序段中必须包括reloc段，从而使的代码加载时可以进行重新定位。<BR>内核编译连接时，使用ucsimm.ld文件，形成可执行文件映象，所形成的代码段既可以使用间接寻址方式（即使用reloc段进行寻址），也可以使用绝对寻址方式。这样可以给编译器更多的优化空间。因为内核可能使用绝对寻址，所以内核加载到的内存地址空间必须与ld文件中给定的内存空间完全相同。 <BR>应用程序的连接与内核连接方式不同。应用程序由内核加载（可执行文件加载器将在后面讨论），由于应用程序的ld文件给出的内存空间与应用程序实际被加载的内存位置可能不同，这样在应用程序加载的过程中需要一个重新地位的过程，即对reloc段进行修正，使得程序进行间接寻址时不至于出错。（这个问题在 i386等高级处理器上方法有所不同，本文将在后面进一步分析）。<BR>由上述讨论，至少需要两套编译连接工具。在讨论过uClinux的内存管理后本文将给出整个系统的工作流程以及系统在flash和ram中的空间分布。<BR><B>可执行文件格式</B><BR>先对一些名词作一些说明： <BR>coff（common object file format）：一种通用的对象文件格式<BR>elf（excutive linked file）：一种为Linux系统所采用的通用文件格式，支持动态连接<BR>flat：elf格式有很大的文件头，flat文件对文件头和一些段信息做了简化<BR>uClinux系统使用flat可执行文件格式，gcc的编译器不能直接形成这种文件格式，但是可以形成coff或elf格式的可执行文件，这两种文件需要coff2flt或elf2flt工具进行格式转化，形成flat文件。<BR>当用户执行一个应用时，内核的执行文件加载器将对flat文件进行进一步处理，主要是对reloc段进行修正（可执行文件加载器的详见fs/binfmt_flat.c）。以下对reloc段进一步讨论。<BR>需要reloc段的根本原因是，程序在连接时连接器所假定的程序运行空间与实际程序加载到的内存空间不同。假如有这样一条指令：<BR>jsr app_start;<BR>这一条指令采用直接寻址，跳转到app_start地址处执行，连接程序将在编译完成是计算出app_start的实际地址（设若实际地址为 0x10000），这个实际地址是根据ld文件计算出来（因为连接器假定该程序将被加载到由ld文件指明的内存空间）。但实际上由于内存分配的关系，操作系统在加载时无法保证程序将按ld文件加载。这时如果程序仍然跳转到绝对地址0x10000处执行，通常情况这是不正确的。一个解决办法是增加一个存储空间，用于存储app_start的实际地址，设若使用变量addr表示这个存储空间。则以上这句程序将改为：<BR>movl addr, a0;<BR>jsr (a0);<BR>增加的变量addr将在数据段中占用一个4字节的空间，连接器将app_start的绝对地址存储到该变量。在可执行文件加载时，可执行文件加载器根据程序将要加载的内存空间计算出app_start在内存中的实际位置，写入addr变量。系统在实际处理是不需要知道这个变量的确切存储位置（也不可能知道），系统只要对整个reloc段进行处理就可以了（reloc段有标识，系统可以读出来）。处理很简单只需要对reloc段中存储的值统一加上一个偏置（如果加载的空间比预想的要靠前，实际上是减去一个偏移量）。偏置由实际的物理地址起始值同ld文件指定的地址起始值相减计算出。<BR>这种reloc的方式部分是由uClinux的内存分配问题引起的，这一点将在uClinux内存管理分析时说明。<BR><B>针对实时性的解决方案</B><BR>uClinux本身并没有关注实时问题，它并不是为了Linux的实时性而提出的。另外有一种Linux--Rt-linux关注实时问题。Rt- linux执行管理器把普通Linux的内核当成一个任务运行，同时还管理了实时进程。而非实时进程则交给普通Linux内核处理。这种方法已经应用于很多的操作系统用于增强操作系统的实时性，包括一些商用版UNIX系统，Windows NT等等。这种方法优点之一是实现简单，且实时性能容易检验。优点之二是由于非实时进程运行于标准Linux系统，同其它Linux商用版本之间保持了很大的兼容性。优点之三是可以支持硬实时时钟的应用。uClinux可以使用Rt-linux的patch，从而增强uClinux的实时性，使得 uClinux可以应用于工业控制、进程控制等一些实时要求较高的应用。<BR></P>
<P><B>uClinux的内存管理</B><BR>应该说uClinux同标准Linux的最大区别就在于内存管理，同时也由于uClinux的内存管理引发了一些标准Linux所不会出现的问题。本文将把uClinux内存管理同标准Linux的那内存管理部分进行比较分析。<BR>标准Linux使用的虚拟存储器技术<BR>标准Linux使用虚拟存储器技术，这种技术用于提供比计算机系统中实际使用的物理内存大得多的内存空间。使用者将感觉到好像程序可以使用非常大的内存空间，从而使得编程人员在写程序时不用考虑计算机中的物理内存的实际容量。</P>
<P>为了支持虚拟存储管理器的管理，Linux系统采用分页（paging）的方式来载入进程。所谓分页既是把实际的存储器分割为相同大小的段，例如每个段1024个字节，这样1024个字节大小的段便称为一个页面（page）。 <BR>虚拟存储器由存储器管理机制及一个大容量的快速硬盘存储器支持。它的实现基于局部性原理，当一个程序在运行之前，没有必要全部装入内存，而是仅将那些当前要运行的那些部分页面或段装入内存运行（copy-on-write），其余暂时留在硬盘上程序运行时如果它所要访问的页（段）已存在，则程序继续运行，如果发现不存在的页（段），操作系统将产生一个页错误（page fault），这个错误导致操作系统把需要运行的部分加载到内存中。必要时操作系统还可以把不需要的内存页（段）交换到磁盘上。利用这样的方式管理存储器，便可把一个进程所需要用到的存储器以化整为零的方式，视需求分批载入，而核心程序则凭借属于每个页面的页码来完成寻址各个存储器区段的工作。<BR>标准Linux是针对有内存管理单元的处理器设计的。在这种处理器上，虚拟地址被送到内存管理单元（MMU），把虚拟地址映射为物理地址。<BR>通过赋予每个任务不同的虚拟--物理地址转换映射，支持不同任务之间的保护。地址转换函数在每一个任务中定义，在一个任务中的虚拟地址空间映射到物理内存的一个部分，而另一个任务的虚拟地址空间映射到物理存储器中的另外区域。计算机的存储管理单元（MMU）一般有一组寄存器来标识当前运行的进程的转换表。在当前进程将CPU放弃给另一个进程时（一次上下文切换），内核通过指向新进程地址转换表的指针加载这些寄存器。MMU寄存器是有特权的，只能在内核态才能访问。这就保证了一个进程只能访问自己用户空间内的地址，而不会访问和修改其它进程的空间。当可执行文件被加载时，加载器根据缺省的ld文件，把程序加载到虚拟内存的一个空间，因为这个原因实际上很多程序的虚拟地址空间是相同的，但是由于转换函数不同，所以实际所处的内存区域也不同。而对于多进程管理当处理器进行进程切换并执行一个新任务时，一个重要部分就是为新任务切换任务转换表。我们可以看到Linux系统的内存管理至少实现了以下功能：<BR>运行比内存还要大的程序。理想情况下应该可以运行任意大小的程序<BR>◇可以运行只加载了部分的程序，缩短了程序启动的时间<BR>◇可以使多个程序同时驻留在内存中提高CPU的利用率<BR>◇可以运行重定位程序。即程序可以方于内存中的任何一处，而且可以在执行过程中移动。<BR>◇写机器无关的代码。程序不必事先约定机器的配置情况。<BR>◇减轻程序员分配和管理内存资源的负担。<BR>◇可以进行共享--例如，如果两个进程运行同一个程序，它们应该可以共享程序代码的同一个副本。<BR>◇提供内存保护，进程不能以非授权方式访问或修改页面，内核保护单个进程的数据和代码以防止其它进程修改它们。否则，用户程序可能会偶然（或恶意）的破坏内核或其它用户程序。 <BR>虚存系统并不是没有代价的。内存管理需要地址转换表和其他一些数据结构，留给程序的内存减少了。地址转换增加了每一条指令的执行时间，而对于有额外内存操作的指令会更严重。当进程访问不在内存的页面时，系统发生失效。系统处理该失效，并将页面加载到内存中，这需要极耗时间的磁盘I/O操作。总之内存管理活动占用了相当一部分cpu时间（在较忙的系统中大约占10％）。<BR>uClinux针对NOMMU的特殊处理<BR>对于uClinux来说，其设计针对没有MMU的处理器，即uClinux不能使用处理器的虚拟内存管理技术（应该说这种不带有MMU的处理器在嵌入式设备中相当普偏）。uClinux仍然采用存储器的分页管理，系统在启动时把实际存储器进行分页。在加载应用程序时程序分页加载。但是由于没有MMU管理，所以实际上uClinux采用实存储器管理策略（real memeory management）。这一点影响了系统工作的很多方面。<BR>uClinux系统对于内存的访问是直接的，（它对地址的访问不需要经过MMU，而是直接送到地址线上输出），所有程序中访问的地址都是实际的物理地址。操作系统对内存空间没有保护（这实际上是很多嵌入式系统的特点），各个进程实际上共享一个运行空间（没有独立的地址转换表）。 <BR>一个进程在执行前，系统必须为进程分配足够的连续地址空间，然后全部载入主存储器的连续空间中。与之相对应的是标准Linux系统在分配内存时没有必要保证实际物理存储空间是连续的，而只要保证虚存地址空间连续就可以了。另外一个方面程序加载地址与预期（ld文件中指出的）通常都不相同，这样 relocation过程就是必须的。此外磁盘交换空间也是无法使用的，系统执行时如果缺少内存将无法通过磁盘交换来得到改善。<BR>uClinux对内存的管理减少同时就给开发人员提出了更高的要求。如果从易用性这一点来说，uClinux的内存管理是一种倒退，退回了到了UNIX早期或是Dos系统时代。开发人员不得不参与系统的内存管理。从编译内核开始，开发人员必须告诉系统这块开发板到底拥有多少的内存（假如你欺骗了系统，那将在后面运行程序时受到惩罚），从而系统将在启动的初始化阶段对内存进行分页，并且标记已使用的和未使用的内存。系统将在运行应用时使用这些分页内存。<BR>由于应用程序加载时必须分配连续的地址空间，而针对不同硬件平台的可一次成块（连续地址）分配内存大小限制是不同（目前针对ez328处理器的 uClinux是128k，而针对coldfire处理器的系统内存则无此限制），所以开发人员在开发应用程序时必须考虑内存的分配情况并关注应用程序需要运行空间的大小。另外由于采用实存储器管理策略，用户程序同内核以及其它用户程序在一个地址空间，程序开发时要保证不侵犯其它程序的地址空间，以使得程序不至于破坏系统的正常工作，或导致其它程序的运行异常。<BR>从内存的访问角度来看，开发人员的权利增大了（开发人员在编程时可以访问任意的地址空间），但与此同时系统的安全性也大为下降。此外，系统对多进程的管理将有很大的变化，这一点将在uClinux的多进程管理中说明。<BR>虽然uClinux的内存管理与标准Linux系统相比功能相差很多，但应该说这是嵌入式设备的选择。在嵌入式设备中，由于成本等敏感因素的影响，普偏的采用不带有MMU的处理器，这决定了系统没有足够的硬件支持实现虚拟存储管理技术。从嵌入式设备实现的功能来看，嵌入式设备通常在某一特定的环境下运行，只要实现特定的功能，其功能相对简单，内存管理的要求完全可以由开发人员考虑。<BR>标准Linux系统的进程、线程<BR>进程：进程是一个运行程序并为其提供执行环境的实体，它包括一个地址空间和至少一个控制点，进程在这个地址空间上执行单一指令序列。进程地址空间包括可以访问或引用的内存单元的集合，进程控制点通过一个一般称为程序计数器（program counter,PC）的硬件寄存器控制和跟踪进程指令序列。<BR>fork：由于进程为执行程序的环境，因此在执行程序前必须先建立这个能"跑"程序的环境。Linux系统提供系统调用拷贝现行进程的内容，以产生新的进程，调用fork的进程称为父进程；而所产生的新进程则称为子进程。子进程会承袭父进程的一切特性，但是它有自己的数据段，也就是说，尽管子进程改变了所属的变量，却不会影响到父进程的变量值。<BR>父进程和子进程共享一个程序段，但是各自拥有自己的堆栈、数据段、用户空间以及进程控制块。换言之，两个进程执行的程序代码是一样的，但是各有各的程序计数器与自己的私人数据。 <BR>当内核收到fork请求时，它会先查核三件事：首先检查存储器是不是足够；其次是进程表是否仍有空缺；最后则是看看用户是否建立了太多的子进程。如果上述说三个条件满足，那么操作系统会给子进程一个进程识别码，并且设定cpu时间，接着设定与父进程共享的段，同时将父进程的inode拷贝一份给子进程运用，最终子进程会返回数值0以表示它是子进程，至于父进程，它可能等待子进程的执行结束，或与子进程各做个的。<BR>exec系统调用：该系统调用提供一个进程去执行另一个进程的能力，exec系统调用是采用覆盖旧有进程存储器内容的方式，所以原来程序的堆栈、数据段与程序段都会被修改，只有用户区维持不变。<BR>vfork系统调用：由于在使用fork时，内核会将父进程拷贝一份给子进程，但是这样的做法相当浪费时间，因为大多数的情形都是程序在调用fork后就立即调用exec，这样刚拷贝来的进程区域又立即被新的数据覆盖掉。因此Linux系统提供一个系统调用vfork，vfork假定系统在调用完成 vfork后会马上执行exec，因此vfork不拷贝父进程的页面，只是初始化私有的数据结构与准备足够的分页表。这样实际在vfork调用完成后父子进程事实上共享同一块存储器（在子进程调用exec或是exit之前），因此子进程可以更改父进程的数据及堆栈信息，因此vfork系统调用完成后，父进程进入睡眠，直到子进程执行exec。当子进程执行exec时，由于exec要使用被执行程序的数据，代码覆盖子进程的存储区域，这样将产生写保护错误（do_wp_page）（这个时候子进程写的实际上是父进程的存储区域），<BR>这个错误导致内核为子进程重新分配存储空间。当子进程正确开始执行后，将唤醒父进程，使得父进程继续往后执行。<BR>uClinux的多进程处理<BR>uClinux没有mmu管理存储器，在实现多个进程时（fork调用生成子进程）需要实现数据保护。<BR>uClinux的fork和vfork：uClinux的fork等于vfork。实际上uClinux的多进程管理通过vfork来实现。这意味着 uClinux系统fork调用完程后，要么子进程代替父进程执行（此时父进程已经sleep）直到子进程调用exit退出，要么调用exec执行一个新的进程，这个时候将产生可执行文件的加载，即使这个进程只是父进程的拷贝，这个过程也不能避免。当子进程执行exit或exec后，子进程使用 wakeup把父进程唤醒，父进程继续往下执行。<BR>uClinux的这种多进程实现机制同它的内存管理紧密相关。uClinux针对nommu处理器开发，所以被迫使用一种flat方式的内存管理模式，启动新的应用程序时系统必须为应用程序分配存储空间，并立即把应用程序加载到内存。缺少了MMU的内存重映射机制，uClinux必须在可执行文件加载阶段对可执行文件reloc处理，使得程序执行时能够直接使用物理内存。</P><img src ="http://www.cppblog.com/inwind/aggbug/3159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/inwind/" target="_blank">inwind</a> 2006-02-10 09:52 <a href="http://www.cppblog.com/inwind/archive/2006/02/10/3159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>McAfee IntruShield 2600系统测试报告</title><link>http://www.cppblog.com/inwind/archive/2006/02/09/3150.html</link><dc:creator>inwind</dc:creator><author>inwind</author><pubDate>Thu, 09 Feb 2006 08:50:00 GMT</pubDate><guid>http://www.cppblog.com/inwind/archive/2006/02/09/3150.html</guid><wfw:comment>http://www.cppblog.com/inwind/comments/3150.html</wfw:comment><comments>http://www.cppblog.com/inwind/archive/2006/02/09/3150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/inwind/comments/commentRss/3150.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/inwind/services/trackbacks/3150.html</trackback:ping><description><![CDATA[<SPAN class=top11>
<P>传统的入侵检测系统（IDS）只能被动地给管理员提供检测报告，最终还必须通过人工来解决问题。虽然大部分IDS产品能够在攻击发生后与防火墙进行互动，但是这种互动只能够对持续的低层次攻击产生很好的阻止作用，在容易受到深层次攻击的场合，用户还是希望采用能够对攻击行为进行实时阻断的产品，来提高信息系统的安全级别，因此入侵防护系统McAfee IntruShield应运而生。</P>
<P><STRONG>体验部署和配置</STRONG></P>
<P>IntruShield 2600有别于基于通用平台的产品，它采用NP（network processor）和ASIC(专用集成电路)混合的架构设计。因为需要实现实时阻断，所以IntruShield 2600在进行协议重组的过程中需要比传统IDS更强的处理能力。通用的硬件平台在多端口的配置的情况下很难满足实时阻断的需求。NP加ASIC这种结构在高端的3层交换机和防火墙中被大量采用，能够实现非常高的转发率,可以帮助入侵防护设备进行实时阻断。 </P>
<P><STRONG>灵活多样的配置方式</STRONG></P>
<P>这款产品配置了8个端口，在SPAN （Switched Port Analysis）模式工作时，全部可以用作检测端口，即如果用户只需要传统的IDS功能，这款产品完全可以充当一个8口的IDS,不过在部署时需要考虑到吞吐量。IntruShield 2600的拿手好戏在于对入侵和非法的数据包进行阻断，这是在In-line的模式下实现的，这个模式是把IPS作为一个以太网的桥接器，透明地连接到已有的网络中，而不需要改动原有网络的配置，对于一个复杂的网络来说，这种设计可以减轻调试安装设备对原有网络的影响。在这种模式下，必须成对地配置端口。因此在只使用全部100M铜缆口时，这款产品几乎可以达到100%的利用率，而在使用千兆光口时，这款产品就只能处理60%左右的网络流量，对于一个正常设计的网络来说，60%已经是很高的突发流量了。 </P>
<P><STRONG>即插即用的快速部署</STRONG></P>
<P>这款产品的软件和硬件的配合程度是非常高的。虽然各个管理服务器上都需要安装多个服务程序，但是McAfee通过把这些服务打包，整合成安装向导提供给了用户。我们只需要点击几次“下一步”，并且设置好管理端口的IP地址，就能够完成安装。通过RS-232配置好控制网络接口的IP地址后，我们就可以采用浏览器对设备进行管理了。 </P>
<P>整个管理配置界面完全是由动态网页和Java Applet组成，既能在管理服务器本机上进行管理，还可以在任意能够访问管理服务器的计算机上通过浏览器进行管理和配置。这样可以把警告信息汇总到单个管理服务器上，然后在其他节点上进行分析或者报告。 </P>
<P><STRONG>高性能的安全屏障、</STRONG><STRONG>检测率测试</STRONG> </P>
<P>我们选择了Blade测试工具进行模拟攻击测试，选取50种典型攻击样例。通过模拟攻击和被攻击的环境，把IntruShield 2600设置为阻断模式，通过比较发出的攻击和从控制台上观察到的报警信息来确定设备检测的正确性。Blade是目前可以模拟攻击类型最多的安全测试工具。我们选择的攻击样例也是按照最近比较盛行、危害比较大以及容易发生的原则来进行的。 </P>
<P>测试结果非常令人振奋。在测试中，所有的攻击都没有被漏报。但是，在这样的测试中，我们并不能确定攻击是否真的被阻断了，于是我们进行了下面的测试。<BR><BR><STRONG>阻断能力测试</STRONG></P>
<P></P>
<P>我们找来了一个针对Windows NetBIOS缺陷的攻击工具，这个缺陷存在于Windows 2000 SP3（包括SP3）以下的版本中。在没有打开IntruShield 2600阻断功能的情况下，仅打了SP2补丁的目标主机直接蓝屏，在进行内存转存以后自动启动，而在开启IntruShield 2600阻断功能后再次发起攻击，目标主机就会安然无恙，并且两次攻击在管理服务器上都有详细的报告，这说明IntruShield 2600的阻断能力非常出色。</P>
<P>大家可能已经发现了，我们所采用的攻击类型并不是简单的畸形IP包攻击，而是在防火墙看来正确连接的情况下进行的高层次的操作，这些操作大多是利用系统或者应用本身的缺陷，制造异常操作来导致其无法正常工作，尤其是一些七层攻击，如果只采用IDS和防火墙互动的方法来阻止攻击，很可能让攻击得逞，因此需要在攻击进行中立即阻断。在阻断模式下，IntruShield 2600除了要重组协议进行判断外，还需要放行正确的数据，因此面临着严峻的性能考验。 </P>
<P><STRONG>吞吐能力测试</STRONG></P>
<P>为了考验NP/ASIC架构的性能，我们创建了一个稳定的背景流，然后模拟攻击。通过观察在处于标称吞吐量边缘的IntruShield 2600对攻击的报告情况来确定这款产品的实际吞吐性能。 </P>
<P>我们采用思博伦通信的Avalanche和Reflector，制造了一个约等于600Mbps的HTTP流量，然后依然沿用功能验证中的攻击检测方法对 IntruShield 2600进行了测试。在标称的600Mbps吞吐量下，IntruShield 2600居然能一个不漏地检测到攻击，这一测试结果一方面肯定了这种基于NP和ASIC混合平台的优势，另一方面，也说明了这款产品在标称的吞吐量下，还保留了一部分处理能力，用于应付突发的流量对系统正常运作带来的影响。 </P>
<P><STRONG>测试总结</STRONG></P>
<P>由于采用了NP/ASIC架构，在进行大数据量的协议分析时，这款产品表现出了非常强的吞吐性能，使得阻断攻击这一独特的功能没有受到任何影响。因为这款产品主要聚焦在4到7层的攻击类型，在测试中，我们并没有看到太多基于一些3层以下的入侵检测和阻断手段。不过，在后来我们采用Nessus端口扫描工具进行变形逃逸测试时，发现这款产品对于SynScan等扫描入侵手段能够进行检测，但是需要配合防火墙来更彻底地杜绝这类攻击。由此证实了我们的推断，单一的 SynScan或者Flood攻击对于系统是没有攻击性的，并且由于这类攻击非常简单，不需要IPS进行复杂的协议分析，只需要在侦测出攻击后，通过和防火墙联动，由防火墙就能进行处理。 </P>
<P>通过对IntruShield 2600进行测试，我们发现：IPS是对IDS的增强和延伸，能够弥补和防火墙之间的空白，而不是简单地对防火墙和IDS进行融合的结果。</P>
<P><STRONG>IntruShield 2600 </STRONG></P>
<P>产品亮点 <BR>● 在１Ｕ厚度实现２个千兆光口，６个铜缆百兆端口的入侵阻断系统，所有端口可以灵活配置，完全逻辑隔离。 <BR>● 能够快速进行安装部署，支持分布式部署管理。 <BR>● 完善的检测引擎，没有漏报一个测试样例中的攻击。 <BR>● 高性能的吞吐能力，能够在高达600Mbps的HTTP背景流下正常工作。<BR>(e129)</P></SPAN><img src ="http://www.cppblog.com/inwind/aggbug/3150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/inwind/" target="_blank">inwind</a> 2006-02-09 16:50 <a href="http://www.cppblog.com/inwind/archive/2006/02/09/3150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小即是美 Web 2.0创业公司流行小巧路线</title><link>http://www.cppblog.com/inwind/archive/2006/02/09/3148.html</link><dc:creator>inwind</dc:creator><author>inwind</author><pubDate>Thu, 09 Feb 2006 08:46:00 GMT</pubDate><guid>http://www.cppblog.com/inwind/archive/2006/02/09/3148.html</guid><wfw:comment>http://www.cppblog.com/inwind/comments/3148.html</wfw:comment><comments>http://www.cppblog.com/inwind/archive/2006/02/09/3148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/inwind/comments/commentRss/3148.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/inwind/services/trackbacks/3148.html</trackback:ping><description><![CDATA[<P>CNET科技资讯网2月8日国际报道 Jason Fried，37Signals 公司的总裁是一位很棒的软件企业家。但他不想用传统模式去开办一间软件公司。没有试图挤进复杂的，价格昂贵的产品业务市场，Fried 和他的同志选择了相对比较偏门的软件：主机式个人组织器及项目管理应用。 对于Fried 而言，那种老式的依靠客户拿出大把美金维持运营的模式已经作古。 <BR><BR>Fried 说："我认为企业软件的理念已经死亡。企业软件是一个肮脏的世界－大而无用的东西从来就不奏效，永远没法按时为客户就位，并且，它们太昂贵了。" 虽然发展速度比以往几年有所放缓，企业软件市场仍然是一个价值数十亿美金的行业，它还在增长。一些投资者和企业家们说，不断变化的这个行业使得它很难突入进去。 <BR><BR>Onset Ventures公司的Mark Hildenbrand说："投资者们对企业软件的兴奋度正在降低。毫无疑问，它是一个具有挑战性的区域。" <BR><BR>与此相反，过去两年，小型公司正在大量的出现，它们开发基于网络的应用，或者开发开源软件，人们有时称它们为Web2.0公司。 它们中的许多能够依靠相对小规模的前沿投资获得腾飞，而不是过去那种上亿美元的大手笔。 例如，37Signals 的商业计划就是构建简单的主机式应用，按月向小企业或者个人收取注册费用。 自从推出它的第一个服务的两年多以来，这家自筹资金起步的公司已经获得了成百上千名客户，它没有债务。这家公司还成功的资助了开源Web 开发项目Ruby on Rails. </P>
<P><BR>Fried 说："你可以利用互联网建立很棒的小巧产品，你可以获得1 百万或者50万用户。" <BR>企业家和投资者们说，一系列技术的变化令非常专门的产品生存下来变为一种可能。大多数的变革是那些正在不断发展普及的主机式应用，或者服务式的软件。<BR>&nbsp;<BR>网络字处理器公司Upstartle 的创始人们，最开始考虑开发针对企业内部网的协同与文件管理软件，但他们最终放弃了这个主意，而决定将注意力集中在互联网上的字处理器上。 </P>
<P><BR>Writely 公司的创始人之一的Claudia Carpenter 说："过去，你不得不做一种巨大的事情－象套件一类的东西。现在，似乎你能够做一些轻量级的东西。" 由于互联网已经成为一种应用平台，Writely 能够将他的字处理器服务与其它网络服务连接起来，比如网络日志或者照片分享网站。现在，很多网站不断的公布它们的应用程序接口（API ），这让用户及开发者们能够在不同的主机式服务之间分享信息。 </P>
<P><BR>另外一个重要的技术进步就是AJAX（异步JavaScript+XML）的兴起。这是一种创建交互式图形用户界面（GUI ）及网页的开发技术，它能够自动的刷新网络服务器上的数据。利用AJAX，程序员门能够开发出桌面应用程序的主机式版本，比如文件和照片发布，AJAX可以给用户提供和在PC上类似的用户体验。 </P>
<P><BR>除了将注意力集中在专门的产品上，和以往相比，这些新创公司能够用很少的资金实现腾飞。<BR>自由提供的开源软件正在增长，功能强大的硬件服务器价格变得越来越低。而在5 年之前，新创业的公司可能需要花费成千上万美元去购买这些硬件设备。 </P>
<P><BR>运营成本也变得相当的低。以37Signals 为例，这家公司没有花钱在市场营销上，他们采用了网上的营销手段，比如网络日志的口碑宣传。这家7 人公司没有销售人员。 </P>
<P><BR>纽约天使投资公司的董事David Rose说："我们看到的Web2.0是一场软件公司发生深刻变革的运动。" Rose表示，现在的网络企业家可以在短短的一年时间内，仅仅用50万美元的资金即可实现从概念到功能性产品的转变。他说："要是放在过去，得花数年时间，上百万美元，以及多次的计划修改才会等到第一个产品出笼。" </P>
<P><BR>RDF 风险基金的主任Richard Forman认为，基于网络的软件模式可以同时辐射个人与企业两个市场。 他说："Web 2.0 的迷人之处在于它是一种双管齐下的模式。一方面，你拥有用户提交的内容，这对网络来讲是一种巨大的机会，另外一方面，你拥有针对协同性工作以及应用服务提供商的网络服务，它将给企业世界产生真实的影响。" </P>
<P><BR>现在，Salesforce.com，NetSuite和SAP 都在鼓吹，企业客户正希望放弃那些大型的软件项目，而选用主机式服务。即使微软这个软件世界的君王也已经发出过类似的感言。 </P>
<P><BR>进入Web 2.0 世界的低门槛使得那些新奇主意可以轻易的转化为新创企业。一些分析师说，也许这个门槛太低了。 许多的Web 2.0 网络应用可以由几个人，相对较少的创业投资和时间来完成。但是，与此同时，投资者们认为，这些服务很容易被复制。另外，一些Web 2.0 公司的业务模式没有经过完全测试，比如Writely 就仍处于测试当中，公司仍然在评估几种不同的收入模式，比如客户注册和广告模式。（编辑：孙莹） </P>
<P><BR>Small is beautiful for Web 2.0 start-ups </P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>&nbsp;</P><img src ="http://www.cppblog.com/inwind/aggbug/3148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/inwind/" target="_blank">inwind</a> 2006-02-09 16:46 <a href="http://www.cppblog.com/inwind/archive/2006/02/09/3148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>保证你现在和未来不失业的十种关键技术（zz） </title><link>http://www.cppblog.com/inwind/archive/2005/12/23/2014.html</link><dc:creator>inwind</dc:creator><author>inwind</author><pubDate>Fri, 23 Dec 2005 09:13:00 GMT</pubDate><guid>http://www.cppblog.com/inwind/archive/2005/12/23/2014.html</guid><wfw:comment>http://www.cppblog.com/inwind/comments/2014.html</wfw:comment><comments>http://www.cppblog.com/inwind/archive/2005/12/23/2014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/inwind/comments/commentRss/2014.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/inwind/services/trackbacks/2014.html</trackback:ping><description><![CDATA[本文列出了当今计算机软件开发和应用领域最重要十种关键技术排名，如果你想保证你现在以及未来的几年不失业，那么你最好跟上这些技术的发展。虽然你不必对这十种技术样样精通，但至少应该对它们非常熟悉。<BR><BR><B>一、XML</B><BR>&nbsp;&nbsp;&nbsp; 在十种技术中，最重要的一种技术我想应该非XML莫属。这里不仅仅指XML规范本身，还包括一系列有关的基于XML的语言：主要有XHTML，XSLT，XSL，DTDs，XML Schema（XSD），XPath，XQuery和SOAP。如果你现在还对XML一无所知，那么赶快狂补吧。XML是包含类似于HTML标签的一个文本文件，在这个文件中定义了一个树型结构来描述它所保存的数据。<BR>&nbsp;&nbsp;&nbsp; XML最大的优点是你既可以在这个文本文件中存储结构化数据，也可以在其中存储非结构化数据——也就是说，它能包含和描述"粗糙的"文档数据，就象它描述"规则的"表格数据一样。 
<UL>
<LI>XHTML是目前编写HTML的首选方法；因为XHTML本身就是格式良好的XML，与通常畸形的HTML文档相比， XHTML格式文档更容易处理。 
<LI>XSLT和XSL是对XML文档进行转换的语言。它们可以将XML文档转换成各种格式，比如另一个文本文件、PDF文件、HTML文件、逗号分割的文件，或者转换成其它的XML文档。 
<LI>DTDs 和XML Schema用来描述XML文件所包含的数据内容的类型，使你不用编写定制的代码就能对XML文档的内容进行"有效性"检查，使内容强行遵守给出的规则。 
<LI>XPath 和 XQuery是查询语言，用它们可以从XML文档中吸取单个的数据项或者数据项列表。XQuery的功能特别强大，因为它对XPath查询进行了扩展。实际上，XQuery和XML的关系就像SQL之于关系数据库一样。 
<LI>SOAP是Web services间进行通讯的标准协议。你不必知道SOAP协议的所有细节，但是你应该熟悉其常用规则及其工作原理，这样你才能使用它。 </LI></UL><B>二、Web Services</B><BR>&nbsp;&nbsp;&nbsp; Web服务是XML流行后的直接产物。因为XML可以描述数据和对象，XML大纲可以保证XML文档数据的有效性，因为XML的基于文本的规范，因而XML文档极其适合于作为一种跨平台通讯标准的基本格式。如果你还没有接触过Web服务，那么过不了多久你肯定会碰到它，所以必须熟练掌握Web服务，最好是精通它，因为它是迄今为止应用程序间跨不同种类机器、语言、平台和位置通讯的最简单的一种方式。不管你需不需要它，Web服务都会是将来互用性的主要趋势。<BR>&nbsp;&nbsp;&nbsp; XML工作组的John Bosak曾说过："XML使得Java有事可做"，那么，我们也可以说，Web服务使得所有语言都有事可做。Web服务让运行在大型机上的COBOL应用程序与运行在手持设备上的应用程序相互沟通；让Java小应用与.NET服务器相互通讯，让桌面应用与Web服务器进行无缝交互，不但为商业数据处理，同时也为商业功能提供了方便的实现——并且这种实现与语言、平台、和位置无关。<BR><BR><B>三、面向对象编程</B><BR>&nbsp;&nbsp;&nbsp; 许多程序员仍然认为OOP乃技术的象牙之塔，但是细细想一下过去十年里在面向对象领域里占据过统治地位的开发语言之后，你就不会这么认为了，OOP理念从Smalltalk开始，然后蔓延到C++和Pascal（Delphi），到Java成为真正的主流，几年之后，VB.NET 和 C#的出现可以说是OOP发展到了登峰造极的地步。虽然使用这些语言不必了解OOP的概念，但如果你缺乏一些OOP的基本知识和方法，我想你很难在逐渐疲软的就业市场中找到工作。<BR><BR><B>四、Java, C++, C#, VB.NET</B><BR>&nbsp;&nbsp;&nbsp; 如果你热衷于技术，并且热爱编程，那么我想你应该轻松玩转这些高级语言，我说的玩转并不一定要你成为超级编程高手。而是能看懂用这些语言编写的代码即可。如果你还有精力用它们编码那就更好了。其实这种机会甚少。但是看代码的机会很多，学习编程的最有效的一种方式就是看源代码——浩如烟海的源代码中很多都不是用你所钟爱的开发语言编写的。<BR>&nbsp;&nbsp;&nbsp; 在过去的几年里，各个语言功能的发展基本上都差不多。现在你完全可以用VB.NET来写Windows服务、Web应用或者命令行程序。即使你只用其中的一种语言写程序。我认为也完全有必要学习另外一种语言，使自己能阅读和理解它们现有的例子代码，并且能将一种语言编写的代码转换成你首选的编程语言代码。这里列出的四种语言可谓是一个强大的开发语言工具箱，如果你掌握了它们，毫无疑问你一定是一个众人仰慕的高手。这里我要声明一下：那就是我并没有要忽略和排除其它的高级语言，如：FORTRAN、COBOL、APL、ADA、Perl和Lisp等等，根据你所从事的领域不同，应该选择适合的语言和工具。<BR><BR><B>五、JavaScript</B><BR>&nbsp;&nbsp;&nbsp; Java 和JavaScript两者的名字尽管很类似，但它们之间并没有什么关系。为什么一种脚本语言会如此重要，以至于将它列入十种关键技术之一呢？仔细想一下就知道了，目前所有主流的浏览器都使用JavaScript。如果你要编写Web应用程序，那么JavaScript不可或缺。此外，JavaScript还能作为一种服务器端的脚本语言，如将它嵌入在ASP、ASP.NET中，或者嵌入XSLT来扩展功能。目前JavaScript在Mozilla/Netscape中是激活基于XUL界面的首选语言，它派生出了ActionScript，成为Flash MX应用的编程语言。还有就是JavaScript极有可能成为未来新设备的脚本语言以及主流应用的宏语言。<BR>&nbsp;&nbsp;&nbsp; 相比之下，VBScript虽然在微软的产品中得到很好的支持，但从长远来看，没有迹象表明它会有美好前途。微软自己都趋向于用JavaScript（或者用由JavaScript派生的JScript）来编写其客户端脚本代码。因此，如果你要选择脚本语言，非JavaScript莫属。<BR><BR><B>六、Regular Expressions</B><BR>&nbsp;&nbsp;&nbsp; 从所周知，关系数据库的查询使用SQL，搜索XML文档用XPath 和XQuery，而正则表达式则用来搜索纯文本。例如，你可以用一个命令来查找或删除HTML格式文件中的注释内容。大家都用过"IndexOf"、"InStr"以及"Like"这些内建在JavaScript或VB中的文本搜索函数，这些函数虽然很容易使用，但是它们的功能却无法与正则表达式同日而语——现在每一种主流的开发语言都提供对正则表达式的存取。尽管有人认为正则表达式本身的读写艰涩难懂，但毕竟它的功能强大，使用它的领域也越来越多。<BR><BR><B>七、Design Patterns</B><BR>&nbsp;&nbsp;&nbsp; 就像OOP通过创建和分类对象来简化编程一样，设计模式将普通的对象交互分类成指定的模型，这是一个从一般到具体的过程。OOP的成分使用得越多，设计模式就显得越有用武之地。所以你必须理解它们，跟上其总体理论的发展。<BR><BR><B>八、Flash MX</B><BR>&nbsp;&nbsp;&nbsp; 当你需要比HTML和CSS所能提供的更多的客户端图形和编程能力时，Flash是最佳选择。在Flash中编程比用Java小应用或者.NET代码来得快得多，也容易得多。<BR>&nbsp;&nbsp;&nbsp; 在最新版本中（MX），Flash不仅可以画图和进行动画打包，它还是个高度的可编程应用环境。具备强大的与SOAP Web服务沟通的能力，可以调用运行在远端服务器上的ColdFusion、Java或.NET代码。可以说Flash几乎无处不在，包括手持设备、置顶盒、甚至是新的平板电脑，你到处都可以见到它的身影，所以使用它实际上可以扩展和延伸你的应用程序使用领域。<BR><BR><B>九、Linux/Windows</B><BR>&nbsp;&nbsp;&nbsp; 这是当今PCs机操作系统的两大阵容，如果你想在计算机行业里混，就一定要熟悉它们。对于Linux，最好能自己安装，配置，下载它的图形用户界面以及一些应用程序。自己安装Apache并会编写Web应用程序。要清醒地认识到这个世界除了Windows之外，还有Linux的存在。并且这种局面将会长期存在。反过来，如果你是一个死忠的Linux开发者，不要再继续对Windows的憎恶，要相互学习，取长补短，看看Windows有什么好的东东可以采纳。记住Windows仍然是桌面之王。<BR>&nbsp;&nbsp;&nbsp; 谁也说不准你们公司什么时候会决定从Linux转向Windows，或者从Windows转向Linux。谁也说不准什么时候你会跳槽跑到另外一个使用不同平台的公司上班——或者即便不跳槽，也有可能在不同平台上开始另外一个杀手级项目——所以最好在每个平台上都积累一些经验，而不要在一棵树上吊死。<BR><BR><B>十、SQL</B><BR>&nbsp;&nbsp;&nbsp; 尽管SQL在当今众多的技术中已不是什么新东西，而且在未来的十年里它的作用很有可能被削弱，甚至整个被淘汰，但它仍然是一种基本技能——别看它是一种基本技能，至今仍有许多开发人员不懂什么是SQL或对它了解不多。不要指望基于图形用户界面的SQL构造器会帮你的忙，还是自己亲手写SQL查询吧，确定你掌握了SQL的基本语法。现在理解了SQL，不仅对以后学习XQuery有所裨益，而且可以使你很快找到简化或改进当前开发项目的途径。<BR><BR><B>尾声：培养对技术的好奇心</B><BR>&nbsp;&nbsp;&nbsp; 其实，不管技术的发展趋势如何，每个人最重要的一个技能是好奇心。敢于面对挑战，在你目前或未来的工作中，新语言或新技术可能很重要，也可能不怎么重要，你所学习的东西并不一定非要针对你的工作。不要怕失败，任何新的技术对初学者来说都是困难的。大多数的失败都可以归咎于本身急功近利，希望速成。俗话说——千里之行，始于足下，应该脚踏实地，一步一个脚印地往前走。不要让时间来左右你行动，而是要利用时间来关注、研究、测试新的开发技术和工具。<BR>&nbsp;&nbsp;&nbsp; 本文的用意不在于要让你成为任何一种技术的专家——只是想借VCKBAE这块宝地抛砖引玉，和大家畅谈现在和未来哪些技术是我们要密切关注的，讨论今后IT行业就业的知识结构，思考自己今后应该在哪些方面需要多花些功夫。因为每一个人的情况各有不同，应该根据具体情况来构筑自己的知识层面。但有一点无庸置疑——那就是保持良好的好奇心始终会使你充实和睿智。<BR><img src ="http://www.cppblog.com/inwind/aggbug/2014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/inwind/" target="_blank">inwind</a> 2005-12-23 17:13 <a href="http://www.cppblog.com/inwind/archive/2005/12/23/2014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>受教了！</title><link>http://www.cppblog.com/inwind/archive/2005/12/22/1959.html</link><dc:creator>inwind</dc:creator><author>inwind</author><pubDate>Thu, 22 Dec 2005 05:43:00 GMT</pubDate><guid>http://www.cppblog.com/inwind/archive/2005/12/22/1959.html</guid><wfw:comment>http://www.cppblog.com/inwind/comments/1959.html</wfw:comment><comments>http://www.cppblog.com/inwind/archive/2005/12/22/1959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/inwind/comments/commentRss/1959.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/inwind/services/trackbacks/1959.html</trackback:ping><description><![CDATA[这一天，大夫伍举进见楚王。楚庄王手中端着酒杯，口中嚼着鹿肉，醉醺醺地在观赏歌舞。他眯着眼睛问道:"大夫来此，是想喝酒呢，还是要看歌舞?"伍举话中有话地说:"有人让我猜一个谜语，我怎么也猜不出，特此来向您请教。"楚庄王一面喝酒，一边问:"什么谜语，这么难猜?你说说。"伍举说:"谜语是‘楚京有大鸟，栖上在朝堂，历时三年整，不鸣亦不翔。令人好难解，到底为哪桩?'您请猜猜，不鸣也不翔。这究竟是只什么鸟？”楚庄王听了，心中明白伍举的意思，笑着说: "我猜着了。它可不是只普通的乌。这只鸟啊，<FONT color=#a52a2a>三年不飞，一飞冲天;三年不鸣，一鸣惊人</FONT>。你等着瞧吧。"伍举明白了楚庄王的意思，便高兴地出退了来。<BR><img src ="http://www.cppblog.com/inwind/aggbug/1959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/inwind/" target="_blank">inwind</a> 2005-12-22 13:43 <a href="http://www.cppblog.com/inwind/archive/2005/12/22/1959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>做科研还是做技术</title><link>http://www.cppblog.com/inwind/archive/2005/12/08/1640.html</link><dc:creator>inwind</dc:creator><author>inwind</author><pubDate>Thu, 08 Dec 2005 14:09:00 GMT</pubDate><guid>http://www.cppblog.com/inwind/archive/2005/12/08/1640.html</guid><wfw:comment>http://www.cppblog.com/inwind/comments/1640.html</wfw:comment><comments>http://www.cppblog.com/inwind/archive/2005/12/08/1640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/inwind/comments/commentRss/1640.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/inwind/services/trackbacks/1640.html</trackback:ping><description><![CDATA[读书读到这个份上了，如果只是做一个coder，太亏了，也不一定有小本做得好。<BR><BR>但是问题在于，只作科研，paper，对于以后找工作呢？<BR><BR>实验室几位毕业的硕士今年找工作，就凸现了这个问题，而相识的几位科大的硕博，找到的工作都非常棒。他们除了有比较出色的科研成绩之外，另外一个相同之处，就是都对一项或者几项技术非常非常的熟练。说到底，资本家雇用你，是因为你能实际的为他做事，能为他创造实际的价值，而不是需要只能做文章的理论者——虽然也需要，但是非常非常的少，而且做为理论，我们又怎么做得过数学系出身的人呢？<BR><BR>考虑一下需要研究的技术<BR>c/c++,java ，vc, c#, <BR>linux系统和网络编程，驱动程序编程<BR>windows的系统和驱动程序编程<BR><BR>还有，看到某位大虾说得，感觉挺有道理，应该找个时间，研究一下脚本语言的说<BR><BR>在近一年以内，要做什么呢？<BR>linux内核，在放假前应该可以看完了，然后可以参与社区的开发研究——限于条件，暂时可以不用linux的机器，不要紧，关键在于理解其内核运行的机制，算法等<BR>然后是c＋＋，一月份之前需要彻底复习一下，然后，就需要开始vc内幕四版的学习，加上算法的学习——算法i－iv，然后是art of programming。对于c＋＋的深入研修也是必要的，primer加上那两本特价书。<BR><BR>除了art of programing，其他应该在三月份以内搞定。<BR><BR>oh yeah～～～～～<BR><img src ="http://www.cppblog.com/inwind/aggbug/1640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/inwind/" target="_blank">inwind</a> 2005-12-08 22:09 <a href="http://www.cppblog.com/inwind/archive/2005/12/08/1640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天发热，哈哈</title><link>http://www.cppblog.com/inwind/archive/2005/12/07/1598.html</link><dc:creator>inwind</dc:creator><author>inwind</author><pubDate>Wed, 07 Dec 2005 05:42:00 GMT</pubDate><guid>http://www.cppblog.com/inwind/archive/2005/12/07/1598.html</guid><wfw:comment>http://www.cppblog.com/inwind/comments/1598.html</wfw:comment><comments>http://www.cppblog.com/inwind/archive/2005/12/07/1598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/inwind/comments/commentRss/1598.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/inwind/services/trackbacks/1598.html</trackback:ping><description><![CDATA[刚刚注册了这个blog，热情足啊，一口气转载了那么多文章，没有几篇仔细看的，呵呵：）<BR>不过，先放着，下班之后就可以看了。<BR>还是先把本职工作做一下吧<img src ="http://www.cppblog.com/inwind/aggbug/1598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/inwind/" target="_blank">inwind</a> 2005-12-07 13:42 <a href="http://www.cppblog.com/inwind/archive/2005/12/07/1598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>