<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[Decell.org]]></title>
<link>http://www.decell.org/</link>
<description><![CDATA[心坚石也穿]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[decell@163.com(Decell)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>Decell.org</title> 
	<url>http://www.decell.org/images/logos.gif</url> 
	<link>http://www.decell.org/</link> 
	<description>Decell.org</description> 
</image>

			<item>
			<link>http://www.decell.org/default.asp?id=123</link>
			<title><![CDATA[关于串口的CTS与RTS]]></title>
			<author>decell@163.com(admin)</author>
			<category><![CDATA[嵌入式技术]]></category>
			<pubDate>Wed,18 Nov 2009 19:47:35 +0800</pubDate>
			<guid>http://www.decell.org/default.asp?id=123</guid>	
		<description><![CDATA[本文转自<a href="http://www.edacn.net/html/89/118589-49762.html" target="_blank">http://www.edacn.net/html/89/118589-49762.html</a><br/><br/>网上看到一篇很好的说明CTS与RTS作用的讨论，转过来保存。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;很久很久以前，计算机还没有出现，那时就已经存在了(计算机)史前的串口设备(电传打字机，工控测量设备，通信调制解调器)，为了连接这些串口，EIA制定了RS232标准，采用DB25接插件，支持同步和异步串口，D型的接口可以有效防止插反。标准化给使用带来了便利。<br/>&nbsp;&nbsp;&nbsp;&nbsp;时光荏苒，个人计算机出现了，这些已有的串口设备毫无疑问地成为了最初的外设，自然而然地RS232标准被个人计算机采纳。但是设备制造商倾向于体积更小，成本更低的接口，因此，将DB25中未使用的和支持同步模式的引脚去掉，形成DB9。最初的情况相当混乱，因为DB9只定义了信号，却没有指定信号和引脚的对应关系，各个制造商只能自行定义。幸运的是，IBM的PC成了工业标准，DB9逐渐统一到IBM的定义上来。<br/>&nbsp;&nbsp;&nbsp;&nbsp;DB9只有9根线，遵循RS232标准。定义如下：<br/>&nbsp;&nbsp;&nbsp;&nbsp;DTR,DSR------DTE设备准备好/DCE设备准备好。主流控信号。<br/>&nbsp;&nbsp;&nbsp;&nbsp;RTS,CTS------&nbsp;请求发送/清除发送。用于半双工时，收发切换。属于辅助流控信号。半双工的意思是说，发的时候不收，收的时候不发。那么怎么区分收发呢？缺省时是DCE向&nbsp;DTE发送数据，当DTE决定向DCE发数据时，先有效RTS，表示DTE希望向DCE发送，一般DCE不能马上转换收发状态，DTE就通过监测CTS是否有效来判断可否发送，这样避免了DTE在DCE未准备好时发送所导致的数据丢失。<br/>&nbsp;&nbsp;&nbsp;&nbsp;全双工时，这两个信号一直有效即可。<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;随着计算机的日益普及，很多非RS232的串口也要接入PC机，如果为每一种新出现的串口都增加一个新的I/O口显然不现实，因为PC后面板位置有限，因此，将RS232串口和非RS232串口都通过RS232口接入是最佳方案。UART的U(通用)指的就是这个意思。早期ROM&nbsp;BIOS和DOS里的通信软件都是为RS232设计的，在没有检测到DCD有效前不会发送数据，因此，就连发送一个字符这样朴素的应用也要给出DCD、&nbsp;DTR、DSR等控制信号。因此，串口接头上要将一些控制线短接，或者干脆绕过系统软件自己写通信程序。<br/>&nbsp;&nbsp;&nbsp;&nbsp;到此，UART的涵义就总结为：通用的&nbsp;异步&nbsp;(串行)&nbsp;I/O口。<br/>&nbsp;&nbsp;&nbsp;&nbsp;就在UART冠以通用二字，准备一统江湖的时候，制造商们不满于它的速度、体积和灵活性(软件可配置)，推出了USB和1394串口。目前，笔记本上的&nbsp;UART串口有被取消的趋势，因而有网友发出了“没有串口，吾谁与归”的慨叹，古今多少事，都付笑谈中，USB取代UART是后话，暂且不表。<br/>&nbsp;&nbsp;&nbsp;&nbsp;话说自从贺氏(Hayes)公司推出了聪明猫(SmartModem)，他们制定的MODEM接口就成了业界标准，自此以后，所有公司制造的兼容猫都符合贺氏标准(连AT指令也兼容，大家一起抄他呗)。<br/>&nbsp;&nbsp;&nbsp;&nbsp;细观贺氏制定的MODEM串口，与RS232标准大不相同。DTR在整个通信过程中一直保持有效，DSR在MODEM上电后/可以拨号前有效(取决于软件对&nbsp;DSR的理解)，在通信过程的任意时刻，只要DTR/DSR无效，通信过程立即终止。在某种意义上，这也可以算是流控，但肯定不是RS232所指的那种主流控。如果拘泥于RS232，你是不会理解DTR和DSR的用途的。<br/>&nbsp;&nbsp;&nbsp;&nbsp;贺氏不但改了DTR和DSR，竟然连RTS和CTS的涵义也重新定义了。因此，RTS和CTS已经不具有最开始的意义了。从字面理解RTS和CTS，是用于半双工通信的，当DTE想从收模式改为发模式时，就有效RTS请求发送，DCE收到RTS请求后不能立即完成转换，需要一段时间，然后有效CTS通知DTE：DCE已经转到发模式，DTE可以开始发送了。在全双工时，RTS和CTS都缺省置为有效即可。然而，在贺氏的MODEM串口定义中，RTS和CTS用于硬件流控，和什么劳什子的全双工/半双工一点关系也没有。<br/>&nbsp;&nbsp;&nbsp;&nbsp;注意，硬件流控是靠软件实现的，之所以强调“硬件”二字，仅仅是因为硬件流控提供了用于流量情况指示的硬件连线，并不是说，你只要把线连上，硬件就能自己流控。如果软件不支持，光连上RTS和CTS是没有用的。<br/>&nbsp;&nbsp;&nbsp;&nbsp;RTS和CTS硬件流控的软件算法如下：(RTS有效表示PC机可以收，CTS有效表示MODEM可以收，这两个信号互相独立，分别指示一个方向的流量情况。)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;dengm&nbsp;发表于&nbsp;2005-1-14&nbsp;07:52&nbsp;侃单片机<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;PC端处理：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;发.&nbsp;当&nbsp;发现（不一定及时发现）&nbsp;CTS&nbsp;(-3v&nbsp;to&nbsp;-15v)无效时，停止发送,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当&nbsp;发现（不一定及时发现）&nbsp;CTS&nbsp;(3v&nbsp;to&nbsp;15v)有效时，恢复发送；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;收.&nbsp;0&lt;M&lt;N&lt;LEN_OF_RX_BUFFERS<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当接收buffers中的bytes&lt;M&nbsp;时，给&nbsp;RTS&nbsp;有效信号（+3v&nbsp;to&nbsp;+15v),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当接收buffers中的bytes&gt;N&nbsp;时，给&nbsp;RTS&nbsp;无效信号（-3v&nbsp;to&nbsp;-15v);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;MODEM端处理：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同上，但RTS与CTS交换。<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.decell.org/default.asp?id=122</link>
			<title><![CDATA[Come What May]]></title>
			<author>decell@163.com(admin)</author>
			<category><![CDATA[情感]]></category>
			<pubDate>Mon,09 Mar 2009 22:51:52 +0800</pubDate>
			<guid>http://www.decell.org/default.asp?id=122</guid>	
		<description><![CDATA[When&nbsp;she&nbsp;looks&nbsp;at&nbsp;me<br/>I&nbsp;know&nbsp;the&nbsp;girl&nbsp;sees&nbsp;things<br/>Nobody&nbsp;else&nbsp;can&nbsp;see<br/><br/>All&nbsp;of&nbsp;the&nbsp;secret&nbsp;fears&nbsp;inside<br/>And&nbsp;all&nbsp;the&nbsp;craziness&nbsp;I&nbsp;hide<br/>She&nbsp;looks&nbsp;into&nbsp;my&nbsp;soul<br/>And&nbsp;reads&nbsp;me&nbsp;like&nbsp;nobody&nbsp;can<br/><br/>And&nbsp;she&nbsp;doesnt&nbsp;judge&nbsp;the&nbsp;man<br/>She&nbsp;just&nbsp;takes&nbsp;me&nbsp;as&nbsp;I&nbsp;am<br/><br/>(chorus)<br/>Come&nbsp;what&nbsp;may,&nbsp;she&nbsp;believes<br/>And&nbsp;that&nbsp;faith&nbsp;is&nbsp;something<br/>Ive&nbsp;never&nbsp;known&nbsp;before<br/>Come&nbsp;what&nbsp;may,&nbsp;she&nbsp;loves&nbsp;me<br/>And&nbsp;that&nbsp;love&nbsp;has&nbsp;helped&nbsp;me&nbsp;open&nbsp;a&nbsp;door<br/>Making&nbsp;me&nbsp;love&nbsp;myself&nbsp;a&nbsp;little&nbsp;more<br/><br/>When&nbsp;I&nbsp;turn&nbsp;away<br/>She&nbsp;knows&nbsp;those&nbsp;are&nbsp;the&nbsp;times<br/>Theres&nbsp;nothing&nbsp;she&nbsp;can&nbsp;say<br/><br/>Nothing&nbsp;that&nbsp;anyone&nbsp;can&nbsp;do<br/>And&nbsp;so&nbsp;she&nbsp;lets&nbsp;me&nbsp;live&nbsp;it&nbsp;through<br/>And&nbsp;when&nbsp;Im&nbsp;in&nbsp;my&nbsp;darkest&nbsp;hour&nbsp;of&nbsp;uncertainty<br/>She&nbsp;just&nbsp;simply&nbsp;lets&nbsp;me&nbsp;be<br/>And&nbsp;goes&nbsp;right&nbsp;on&nbsp;loving&nbsp;me<br/><br/>(chorus)<br/>And&nbsp;when&nbsp;it&nbsp;seems&nbsp;my&nbsp;dreams<br/>Have&nbsp;all&nbsp;slipped&nbsp;through&nbsp;my&nbsp;fingers<br/>When&nbsp;they&nbsp;just&nbsp;cant&nbsp;be&nbsp;found<br/>I&nbsp;turn&nbsp;around&nbsp;and&nbsp;there&nbsp;they&nbsp;are<br/>Shining&nbsp;in&nbsp;her&nbsp;eyes<br/>(repeat&nbsp;chorus)<br/><br/>I&nbsp;love&nbsp;you,&nbsp;Hannah.]]></description>
		</item>
		
			<item>
			<link>http://www.decell.org/default.asp?id=121</link>
			<title><![CDATA[mpc5121手记--nand flash控制器]]></title>
			<author>decell@163.com(admin)</author>
			<category><![CDATA[嵌入式技术]]></category>
			<pubDate>Tue,17 Feb 2009 01:54:41 +0800</pubDate>
			<guid>http://www.decell.org/default.asp?id=121</guid>	
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;mpc5121的nand&nbsp;flash控制器可以支持512、2k、4k&nbsp;page大小的nandflash。LPC，nand/PATA共用EMB接口，复用优先的仲裁由EMB仲裁器完成。获得总线仲裁时，他与PATA共享EMB_AD[0..31]，PATA占用EMB_AF[0..15]与EMB_AX[2..0]，nand占用EMB_AD[16..31]。<br/>&nbsp;&nbsp;&nbsp;mpc5121内部有一个4.5K大小的RAM，作为对nand&nbsp;flash进行操作的时候的数据输入/输出接口。该RAM完全模拟一块nand&nbsp;flash的page结构，共分为8个512&nbsp;Byte&nbsp;的main&nbsp;section和8个26&nbsp;byte的&nbsp;spare&nbsp;section。page大小为2K/4K的nand&nbsp;flash，也是根据这样分区的，2K&nbsp;page的nand&nbsp;flash的main区会被分成4个section，每section&nbsp;512B，同时spare区也会相应地分成4个section，每个section16B。<br/>&nbsp;&nbsp;&nbsp;打开ECC的情况下，写入操作的时候，现将目标数据写入该RAM。然后设定RBA设定目标section，最后设定FDI位，硬件会计算该section的ECC&nbsp;code，然后连同目标数据一起写入flash&nbsp;page。比如对于2K&nbsp;page的nand，如果RBA=0，则会把RAM中section0/1/2/3写入nand。虽然是一次完成，但是ECC是计算了四次的，每512B一次，也就是，先算section0的ECC，section0写入page&nbsp;main区的头512B，ECC则写入spare区的头16B，再算section1的ECC，section1写入page&nbsp;main区的第二个512B，ECC则写入spare区的第二个16B，如此类推。当然你也可以设RBA=4，这时将会把RAM中section4/5/6/7写入nand。RBA不能等于1/2/3/5/6/7。<br/>&nbsp;&nbsp;&nbsp;读与写类似，也是先设定RBA，设定FDO，数据会从nand&nbsp;flash读出，放到RBA指定的section中。也是先读第一个512B和第一个16B，再第二个512B和第二个16B。用户这时可以从RAM的spare&nbsp;section中读出写入时产生的ECC。写入是产生的ECC只能这样读，因为写入是产生的ECC是不会放入到spare&nbsp;section中的，他们直接被写入flash中。]]></description>
		</item>
		
			<item>
			<link>http://www.decell.org/default.asp?id=120</link>
			<title><![CDATA[无题]]></title>
			<author>decell@163.com(admin)</author>
			<category><![CDATA[生活日记]]></category>
			<pubDate>Mon,09 Feb 2009 17:38:11 +0800</pubDate>
			<guid>http://www.decell.org/default.asp?id=120</guid>	
		<description><![CDATA[昨天跟一个友人聊天，他问起我一个问题：你自学的时候，以什么来衡量你已经掌握了这种知识呢？<br/>这个问题真的是一个值得认真思考的问题。<br/><br/><img src="http://www.minix3.org/doc/raccoon.jpg" border="0" alt=""/>]]></description>
		</item>
		
			<item>
			<link>http://www.decell.org/default.asp?id=119</link>
			<title><![CDATA[[X-node] uC/OS-II v2.70]]></title>
			<author>decell@163.com(admin)</author>
			<category><![CDATA[嵌入式技术]]></category>
			<pubDate>Thu,05 Feb 2009 21:26:42 +0800</pubDate>
			<guid>http://www.decell.org/default.asp?id=119</guid>	
		<description><![CDATA[uC/OS-II&nbsp;v2.70&nbsp;成功在X-node上跑起来了。我没有使用uC/OS官方的IAR或GNU编译器，而是使用TI的CCE&nbsp;v3.2，所以又修改了一点源码，主要是汇编的格式和伪指令。有用CCE而又懒得去研究编译器语法的朋友可以向我要源码。版权归uC/OS-II的原作者所有。<br/><img src="http://ai.ee.ccu.edu.tw/os/projects/2006fall/team07/images/uc-OS-II-logo.gif" border="0" alt=""/>]]></description>
		</item>
		
			<item>
			<link>http://www.decell.org/default.asp?id=118</link>
			<title><![CDATA[好久不见]]></title>
			<author>decell@163.com(admin)</author>
			<category><![CDATA[生活日记]]></category>
			<pubDate>Thu,22 Jan 2009 19:05:15 +0800</pubDate>
			<guid>http://www.decell.org/default.asp?id=118</guid>	
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;常听说身体是革命的本钱，这句话是很道理的。病了足足一个月，很多事情都落下了，造成了一些不小的损失。昨天刚回到实验室，发现大部分的人都走了，而到了今天，实验室更是只剩下我一个了。静下心坐下来想处理一些事情，才发现有很多事情因为错过了处理他的最好的时机，现在处理起来越发困难，就像治病一样，久疾难治。X-node的片子回来了，但是因为买不到所需的物料，现在限于停顿，要等5号赛格开门才有办法了。先处理5121的电源问题吧，板上时钟模块的问题同样是物料的原因，只能年后再算。不过说来也奇怪，在实验室，心反而很踏实，在家里面，心情总好不起来。可能我实在逃避吧，没人能帮上忙，就躲一躲吧～<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天是年二十几我不是太清楚，反正是差不多过年了。昔日的同学们，远在外地工作的，读书的朋友们，都陆陆续续的回家了，昨天我也去接了麦，两个人谈了很久。聚会也会慢慢多起来了吧，每个人都总会有些变化，昔日的曦都变了现在的热线熊猫了，呵呵。相信最近听到的和说得最多一句话，除开那些祝福的话语，就应该是：“哇，好耐无见啦！最近点啊～”。hi！各位朋友，好久不见了，你们好吗？]]></description>
		</item>
		
			<item>
			<link>http://www.decell.org/default.asp?id=117</link>
			<title><![CDATA[X-node]]></title>
			<author>decell@163.com(admin)</author>
			<category><![CDATA[嵌入式技术]]></category>
			<pubDate>Mon,12 Jan 2009 15:00:25 +0800</pubDate>
			<guid>http://www.decell.org/default.asp?id=117</guid>	
		<description><![CDATA[最近做的一个WSN节点（其实很早就可以画的了，最近老板抓得紧了，于是重视了一下）。<br/>之所以叫X-node，是因为元器件是45度place的，板子看起来有点像X字形。<br/>MSP430+CC2500+CC2591。理论发射功率可以有20dbm。尺寸是45mm&nbsp;x&nbsp;30m。<br/><img src="http://i401.photobucket.com/albums/pp92/decell_chow/1169528528233994630.jpg" border="0" alt=""/><br/><br/>Happy&nbsp;birthday&nbsp;to&nbsp;Hannah！<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.decell.org/default.asp?id=116</link>
			<title><![CDATA[你今天黑屏了吗？]]></title>
			<author>decell@163.com(admin)</author>
			<category><![CDATA[生活日记]]></category>
			<pubDate>Sat,25 Oct 2008 18:29:22 +0800</pubDate>
			<guid>http://www.decell.org/default.asp?id=116</guid>	
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;最近微软打击盗版，搞了个“黑屏”补丁（其实只是黑背景而已）。一时间，坊间议论纷纷，听得最多的一句话是“嘿！你看到过那个黑屏了吗？”。于此同时，国内的专家又开始出来说，“我们真的要注意啦，国家安全就是这么脆弱的啊！”。其中一种很主要的声音，就是要在国内推Linux，专家们认为这样比较安全。<br/>&nbsp;&nbsp;&nbsp;&nbsp;我说这些专家都是傻的！我宁愿全中国的计算机系统都用微软的东西！为什么呢？你看看国内有多少人是专心研究Linux的？你看看国人对Linux内核，对开源社区做了多少贡献？<br/>&nbsp;&nbsp;&nbsp;&nbsp;用微软，选择不开源，那还好，国家安全系于一个公司，一个国家之手。<br/>&nbsp;&nbsp;&nbsp;&nbsp;用Linux，选择开源，国家安全系于全世界100多万参与过Linux开发的黑客之手。<br/>&nbsp;&nbsp;&nbsp;&nbsp;你选那个？归根到底，我们国家的核心计算机系统还是需要一套我们自己的东西。从内核，到所有用户层库，全部是我们自己开发的。中科院，多干点实事吧。]]></description>
		</item>
		
			<item>
			<link>http://www.decell.org/default.asp?id=114</link>
			<title><![CDATA[ARM-ELF文件格式与GNU ARM Linker机制]]></title>
			<author>decell@163.com(admin)</author>
			<category><![CDATA[嵌入式技术]]></category>
			<pubDate>Mon,13 Oct 2008 23:38:18 +0800</pubDate>
			<guid>http://www.decell.org/default.asp?id=114</guid>	
		<description><![CDATA[【本站原创，转载请注明出处】<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里所说的ARM系统基本文件格式，都是在基于ARM的嵌入式系统开发中常会碰到的文件格式。<br/>&nbsp;&nbsp;&nbsp;&nbsp;ARM系统基本文件格式有三种：<br/>1)&nbsp;BIN，平板式二进制格式，一般用于直接烧写到Flash中，也可以用于加载到monitor程序中。<br/>2)&nbsp;ELF，EXECUTABLE&nbsp;AND&nbsp;LINKABLE&nbsp;FORMAT，一种通用的OBJECT文件格式，一般由GNU&nbsp;COMPILER&nbsp;COLLECTION&nbsp;(GCC)产生。<br/>3)&nbsp;AXF，BIN格式的扩展版,主体部分同BIN，在文件头和尾加入了调试用的信息，用于AXD。<br/>&nbsp;&nbsp;&nbsp;&nbsp;本文主要讨论BIN与ELF。<br/>&nbsp;&nbsp;&nbsp;&nbsp;首先说明，ELF格式是一种OBJECT文件格式。一般OBJECT文件都可以分成三类：可重定位OBJECT文件，可执行OBJECT文件，共享OBJECT文件。ELF格式文件也可以分成这三种。<br/>&nbsp;&nbsp;&nbsp;&nbsp;首先说说可重定位OBJECT文件。这种OBJECT文件一般由GCC中的ASSEMBLER(as)产生(请不要认为GCC只是编译器)，里面除了二进制的机器代码，还有一些可用于进行重定位的信息。它主要是作为LINKER(ld)的输入，LINKER将跟据这些信息，将需要重定位的符号重定位，进而产生可执行的OBJECT文件。ELF格式的可重定位OBJECT文件由header与section组成。<br/>&nbsp;&nbsp;&nbsp;&nbsp;Header&nbsp;包括ELF&nbsp;header&nbsp;与&nbsp;section&nbsp;header.&nbsp;ELF&nbsp;header&nbsp;位于文件的头部，用于存储目标机器的架构，大小端配置，ELF&nbsp;header大小，object文件类型，section&nbsp;header&nbsp;在文件中的偏移，section&nbsp;header&#160;&#160;&#160;&#160;的大小，section&nbsp;header&nbsp;中的项目数等信息。Section&nbsp;header&nbsp;则定义了文件中每个section&nbsp;的类型，位置，大小等信息。Linker就是通过查找ELF&nbsp;header，找到section&nbsp;header&nbsp;的入口，再在section&nbsp;header&nbsp;中找到相应的section&nbsp;入口，进而定位到目标section&nbsp;的。<br/>&nbsp;&nbsp;&nbsp;&nbsp;Section&nbsp;包括&nbsp;<br/>.text&nbsp;&nbsp;&nbsp;&nbsp;：经过编译的机器代码。<br/>.rodata&nbsp;&nbsp;：只读的数据，例如printf(“hello!”)中的字符串hello。<br/>.data&nbsp;&nbsp;&nbsp;&nbsp;：已初始化的全局变量，局部变量将在运行时被存放在堆栈中，不会在.data或&nbsp;.bss段中出现。<br/>.bss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;：未初始化的全局变量，在这里只是一个占位符，在object文件中并没有实际的存储空间。<br/>.symtab&nbsp;&nbsp;：符号表，用于存放程序中被定义的或被引用到的全局变量和函数的信息。<br/>.rel.text&nbsp;&nbsp;：一个保存着一系列在.text中的位置的列表。这些位置将在linker把这个文件与其它object文件合并时被修改，一般来说，这些位置都是保存着一些引用到全局变量或者外部函数的指令。引用局部变量或者本地函数的指令是不需要被修改的，因为局部变量和本地函数的地址一般都是使用PC相对偏移地址的。需要注意的是，这个section&nbsp;和下面的.rel.data在运行时并不需要，生成可执行的ELF&nbsp;object文件时会去掉这个section。<br/>.rel.data&nbsp;：保存全局变量的重定位信息。一般来说，如果一个全局变量它的初始化值是另一个全局变量的地址，或者是外部函数的地址，那么它就需要被重定位。<br/>.debug&nbsp;&nbsp;：保存debug信息。<br/>.strtab&nbsp;&nbsp;：&nbsp;一个字符串表，保存着.symtab和.debug&nbsp;,和各个section的名字。.symtab，.debug&nbsp;和section&nbsp;table里面，凡是保存name的域，其实都是保存了一个偏移值，通过这个偏移值在这个字符串表里面可以找到相应得字符串。<br/>&nbsp;&nbsp;&nbsp;&nbsp;下面仔细讨论一下.symtab：<br/>&nbsp;&nbsp;&nbsp;&nbsp;每一个可重定位的object文件，都会有一个.symtab。这个符号表保存了在这个object文件中所有被定义的和被引用的符号。当源程序是C&nbsp;语言程序时，.symtab&nbsp;中的符号直接来源于C编译器(cc1)。这里所说的符号主要有三种：<br/>1)&nbsp;在这个object文件中被定义的可以被其他object文件全局符号。在C语言源程序中，主要就是那些非静态（没有static&nbsp;修饰的）的全局变量和非静态的函数。在ARM汇编语言中，就是那些&nbsp;被EXPORT&nbsp;指令导出的变量。<br/>2)&nbsp;在这个object文件中引用到，但是在其他文件中定义的全局变量。在ARM汇编语言中就是通过IMPORT命令引入的变量<br/>3)&nbsp;本地变量。本地变量只在本object文件内可见。这里的本地变量指的是连接器本地变量，应该和一般的程序本地变量作区别。这里所指的本地变量，包括用static&nbsp;修饰的全局变量，object文件中section名称，源代码文件名称。一般意义上的本地变量，是在运行时由系统的运行时环境管理的，linker并不关心。<br/>&nbsp;&nbsp;&nbsp;&nbsp;每个符合上面条件的符号在.symtab文件中都会有一个数据项。这个数据项的数据结构是：<br/><br/>Typedef&nbsp;struct{<br/>&#160;&#160;&#160;&#160;int&nbsp;name;//符号名称，其实就是.strtab的偏移值<br/>&#160;&#160;&#160;&#160;int&nbsp;value;//在section中的位置，以相对section地址的偏移表示<br/>&#160;&#160;&#160;&#160;int&nbsp;size;//大小<br/>&#160;&#160;&#160;&#160;char&nbsp;type;//类型，一般是数据或函数<br/>&#160;&#160;&#160;&#160;char&nbsp;binding;//是本地变量还是全局变量<br/>&#160;&#160;&#160;&#160;char&nbsp;reserved;//保留的位<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;section;//符号所属的section。可选有：.text(用数字1代表)，.data(用数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//3代表)，ABS（不应被重定位的符号），UND（在本object文件<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//中未定义的符号，可能在别的文件中定义），COM（一般的未初//始化的变量符号）。<br/>}ELF_sym<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;现在假设组成应用的各个模块都已经被汇编，构建出了可重定位的object文件。这些object的结构都是一样的，有各自的.text,&nbsp;.data&nbsp;section,&nbsp;有各自的.symtab.&nbsp;GCC下一步要做的就是使用linker&nbsp;(ld),把这些object文件，加上必要的库连接成具有绝对运行时地址的可执行文件，就是可执行的ELF格式的文件。<br/>&nbsp;&nbsp;&nbsp;&nbsp;Linker&nbsp;的连接动作可以分为两部分：<br/>1)&nbsp;符号解析。确定引用符号的指向。<br/>2)&nbsp;符号重定位。合并section,&#160;&#160;&#160;&#160;分配运行时环境地址，引用符号重定位。<br/>&nbsp;&nbsp;&nbsp;&nbsp;符号解析：<br/>&nbsp;&nbsp;&nbsp;&nbsp;在一个object文件中，有指令定义了符号，也有指令引用了符号。可能存在这样一种情况，一个被引用到的符号，有多重的定义。符号解析的作用就是确定，在这个object文件中，一个符号引用真正引用的是哪个符号。<br/>&nbsp;&nbsp;&nbsp;&nbsp;在编译的时候，除了在本文件中定义的全局变量会由编译器生成一个符号表项之外，当发现一个被引用到的符号在本文件中并没有被定义，编译器也会自动产生一个符号表项，把确定这些引用的工作留给linker。汇编器在汇编时将读取这些符号表项，生成.symtab。在读取的过程中，如果发现有在无法确定的符号引用项，汇编器会为这些符号额外生成一个数据项，称作重定位数据项，存放于rel.text或rel.data&nbsp;section中，交由linker确定。下面是重定位数据项（relocation&nbsp;entry）的数据结构：<br/><br/>Typedef&nbsp;struct{<br/>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;offset;//指明需要被重定位的引用在object中的偏移，实际上就是需要被重定位的引用<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在object中的实际位置<br/>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;symbol;//这个被重定位的引用真实指向的符号<br/>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;type;//重定位类型：R_ARM_PC24:使用24bit的PC相对地址重定位引用<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&nbsp;&nbsp;//R_ARM_ABS32:使用32bit绝对地址重定位引用<br/>}Elf32_Rel<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;Linker&nbsp;需要解析的，就是那些被生成了重定位数据项的引用。Linker将根据C语言定义的规则，对于每一个重定位数据项，在输入的各个object文件中查找适合的符号，把这个符号填入symbol项中。但是由于还不知道这个符号的真实地址，所以现在就算知道了引用的真实指向，但我们还是不能确定这个引用指向的地址。<br/>&nbsp;&nbsp;&nbsp;&nbsp;符号重定位：<br/>&nbsp;&nbsp;&nbsp;&nbsp;符号重定位用来解决上面的问题。Linker首先进行section&nbsp;的合并。Linker合并object文件的过程很简单，一般就是相同属性的section合并，例如不同object文件的.text&nbsp;section&nbsp;将被合并成一个.text。同样，.symtab&nbsp;section也被合并成一个.symtab。这里面涉及到两个问题：<br/>1)&nbsp;各个object文件合并的顺序。这个问题涉及到最终指令和符号的运行地址。最为重要的是，究竟是哪个section排在最前头？在ARM&nbsp;RAW&nbsp;系统得开发过程中，这个最为重要。ARM系统CPU上电后，系统会自动的从0x00000000地址取指令并执行，这个地址上映射着存储器。这个动作是不可编程的。所以排在最前面的section一定要包含有程序的入口点，否则系统无法正常运行。<br/>2)&nbsp;输入段与输出端之间的对应关系。理论上，任何section,都可以被随意的映射到一个输出段中。一个.data&nbsp;section是可以与一个.text&nbsp;section&nbsp;组成输出一个.text的。当然这样的动作毫无意义。我们必须告诉linker使用那些section作为输入，产生一个输出section.<br/>&nbsp;&nbsp;&nbsp;&nbsp;以上这两个问题，都是通过一个称为连接脚本的文件控制的。Linker通过读取连接脚本，来决定section&nbsp;从输入到输出的映射，设置程序的入口点，设置哪个section应该在整个可执行文件的头部等问题。<br/>&nbsp;&nbsp;&nbsp;&nbsp;连接脚本还有另外一个作用，那就是指定每个section的地址。在section&nbsp;合并完成后，linker将跟据.symtab，对符号进行统一的编址，分配一个绝对的运行时地址。这个地址是以section地址作为基地址的。假设.text&nbsp;section的地址是0x00000000，那么.text里面的符号将以0x00000000这个地址作为基准地址。指定section地址的工作也是由连接脚本完成。在嵌入式开发中常见的在编译工程时需指定的text_base,&nbsp;data_base等参数，最后会被加入到连接脚本中，从而完成section的地址分配。<br/>&nbsp;&nbsp;&nbsp;&nbsp;以上两步完成后，linker&nbsp;执行引用符号重定位操作。Linker遍历.rel&nbsp;section&nbsp;(包括.rel&nbsp;text&nbsp;和&nbsp;.rel&nbsp;data)，对于其中的每个数据项，根据symbol域到.symtab&nbsp;中查出相应的引用的真实地址(经过上面的地址分配，现在.symtab里面的符号都具有绝对的运行地址)，再根据offset域提供的偏移，将这个地址填入相应的位置上。<br/>&nbsp;&nbsp;&nbsp;&nbsp;至此，符号重定位工作全部完成。Linker删除用于保存重定位信息的rel.text和rel.data&nbsp;section，加入一个segment&nbsp;header和&nbsp;一个.init&nbsp;section。生成可执行的ELF格式的object文件。<br/>&nbsp;&nbsp;&nbsp;&nbsp;Segment&nbsp;header保存了用于操作系统内存映射的信息。.init&nbsp;section&nbsp;包含了一个_init&nbsp;的函数。程序加载时，操作系统的程序加载器通过读取segment&nbsp;header，将程序加载到用户内存空间，并根据segment&nbsp;header里面映射信息，分别将.text&nbsp;段和.data段映射到适当的地址上。然后再调用.init中的_init函数，完成初始化工作。<br/>&nbsp;&nbsp;&nbsp;&nbsp;由于ELF文件具有通用性强的优点，现在流行的开发模式是，先通过编译工具生成ELF文件格式的可执行文件，在使用外部工具，抽离出ELF文件中的相应部分，生成BIN文件。例如著名的GNU&nbsp;bootloader&nbsp;U-Boot，就采用了这种做法，编译器工具集是GCC，BIN生成工具是elf2bin。ARM公司著名的开发环境ADS，虽然使用的是自家的armcc,和armcpp编译器，但他们的工作方式却是与GNU&nbsp;GCC如出一辙。<br/><img src="http://upload.wikimedia.org/wikipedia/commons/thumb/7/77/Elf-layout--en.svg/200px-Elf-layout--en.svg.png" border="0" alt=""/>]]></description>
		</item>
		
			<item>
			<link>http://www.decell.org/default.asp?id=113</link>
			<title><![CDATA[黑]]></title>
			<author>decell@163.com(admin)</author>
			<category><![CDATA[生活日记]]></category>
			<pubDate>Tue,07 Oct 2008 00:34:29 +0800</pubDate>
			<guid>http://www.decell.org/default.asp?id=113</guid>	
		<description><![CDATA[黑色遮蔽了我的眼睛，使我失去方向，失去快乐，失去动力。太阳终于完全下山了。<br/><img src="http://www.searchviews.com/wp-content/themes/clean-copy-full-3-column-1/images/sad-face.jpg" border="0" alt=""/>]]></description>
		</item>
		
</channel>
</rss>