当前位置: 首页 > news >正文

电脑配件网站建设机械技术支持东莞网站建设

电脑配件网站建设,机械技术支持东莞网站建设,关于免费制作网页的网站,四川建设厅官网查询官网开篇 学习任何一门编程语言#xff0c;都会从hello world 开始。对于一门从未接触过的语言#xff0c;在短时间内我们都能用这种语言写出它的hello world。 然而#xff0c;对于hello world 这个简单程序的内部运行机制#xff0c;我相信还有很多人都不是很清楚。hello wor… 开篇 学习任何一门编程语言都会从hello world 开始。对于一门从未接触过的语言在短时间内我们都能用这种语言写出它的hello world。 然而对于hello world 这个简单程序的内部运行机制我相信还有很多人都不是很清楚。hello world 这些信息是如何通显示器过显示的cpu执行的代码和程序中我们写的的代码肯定不一样她是什么样子的又是如何从我们写的代码变成cpu能执行的代码的程序运行时代码是在什么地方她们是如何组织的程序中的变量存储在什么地方函数调用是怎样是现的这篇文章将简单的讨论程序的运行机制开发平台隐藏的过程 每一种语言都有自己的开发平台我们的程序大多是也都是在这里诞生的。从程序源代码到可执行文件的转化过程其实是分很多步而且是很复杂的只是而现在的开发平台把所有的这些事情都自己承担了给我们带来方便的同时她也影藏了大量的实现细节。所以大多程序员只负责编写代码其它的复杂的转换工作则由开发平台默默完成。按照我的理解简单 的说从源代码到可执行文件的过程可分为以下几个阶段: 1、从源代码到机器语言并将产生的机器语言按照一定的规律组织起来。我们暂且称为文件A。2、把文件A和运行A需要的文件B如库函数链接起来形成文件A3、把文件A装载进入内存运行文件其实如果是看参考书或者其他资料的话可能不止这几步只是这里为了简化我把它归纳为3步 这些事形成可执行文件的关键步骤缺一不可。现在看到被开发平台“蒙蔽”了吧。下面的部分将拨开迷雾还你开发平台的真面目。目标文件 在计算机领域有过一句经典的话“any problem in computer science can be sloved by another layer of indirecition”“计算机科学领域的任何问题都可以通过增加一个中间层来解决”比如说要实现从A到B的转换可以先把A转换为文件A再把文件A转换为我们需要的文件B。其实在波利亚的《how to slove it》里面对这种方法也有叙述。在解题的时候可以通过增加中间层来简化问题那么从源代码到可执行文件的过程可以这样理解。从源代码到可执行文件也是一样的 通过不断的在他们之间增加中间层来解决问题。和上文说的 先把源程序转化为中间文件A再把中间文件转化为我们需要的目标文件。在处理文件的时候就是按照这种思路来的。其实上面说的文件A更专业的说法是目标文件。她不是可执行程序需要和其它的目标文件进行链接、装载后才能执行。对于一个源程序 开发平台首先要做的就是把源程序翻译成机器语言。其中很重要的一部就是编译。相信很多人都知道就是把源代码翻译成机器语言其实就是一堆二进制代码。编译知识很重要却不是本文的重点有兴趣的可自行google。目标文件格式现在来看一下上面说的目标文件是如何组织的也就是存放结构。起源想象一下如果是你来设计会如何组织这些二进制代码就像书桌上的物品要分类放置才整洁一样为了便于管理翻译出来的二进制代码也分类存放把表示代码的放在一起表示数据的放在一起。这样二进制代码就分为了不同的块来存放。这样的一个区域就是被称为段segment的东西。标准和计算机科学中的很多东西一样为了方便人们的交流、程序的兼容等问题。也为这种二进制的存放方式制订了标准于是COFFcommon object file format就诞生了。现在的windows、Linux、等主流操作系统下的目标文件格式和COFF大同小异都可以认为是它的变种。a.outa.out是目标文件的默认名字。也就是说当编译一个文件的时候如果不对编译后的目标文件重命名编译后就会产生一个名字为a.out的文件。具体的为什么会用这个名字这里就不在深究了。有兴趣的可以自己google。下面的图可以让你更直观的了解目标文件:上图是目标文件的典型结构实际的情况可能会有所差别但都是在这个基础上衍生出来的。 ELF文件头即上图中的第一个段。其中的header是目标文件的头部里面包含了这个目标文件的一些基本信息。如该文件的版本、目标机器型号、程序入口地址等等。 文本段里面的数据主要是程序中的代码部分。数据段程序中的数据部分比如说变量。重定位段重定位段包括了文本重定位和数据重定位里面包含了重定位信息。一般来说代码中都会存在引用了外部的函数或者变量的情况。既然是引用那么这些函数、变量并没存在该目标文件内。在使用他们的时候 就要给出他们的实际地址这个过程发生在链接的时候。正是这些重定位表提供了寻找这些实际地址的信息。理解了上面之后文本重定位和数据重定位也就不难理解了。 符号表符号表包含了源代码中所有的符号信息 。 包括每个变量名、函数名等等。里面记录了每个符号的信息比如说代码中有“student”这个符号对应的在符号表中就包括这个符号的信息。包括这个符号所在的段、它的属性读写权限等相关信息。其实符号表最初的来源可以说是在编译的词法分析阶段。在做词法分析的时候就把代码中的每个符号及其属性都记录在符号表中。字符串表和符号表差不多的功能存放了一些字符串信息。其中还有一点要说吗的是目标文件都是以二进制来存储的它本身就是二进制文件。现实中的目标文件会比这个模型要复杂些但是它的思路都是一样的就是按照类型来存储再加上一些描述目标文件信息的段和链接中需要的信息。a.out剖分 Hello World空口无凭我们现在就来研究一下hello world编译后形成的目标文件这里用 C 来描述。简单的hellow world 源码/*hello.c*/#includestdio.hint main(){int a5;printf(hellow world \n);} 为了在数据段中也有数据可放这里增加了“int a5”。如果在VC上的话点击运行便能看到结果。为了能看清楚内部到底是如何处理的我们使用GCC来编译。运行gcc hello.c再看我们的目录下就多了目标文件a.out。现在我们想做的是看看a.out里到底有什么可能有童鞋回想到用vim文本查看当时我也是这么天真的认为。但a.out是何等东西怎能这么简单就暴露出来呢 。是的vim不行。“我们遇到的问题大多是前人就已经遇到并且已经解决的对其中有一个很强悍的工具叫做objdump。有了它我们就能彻底的去了解目标文件的各种细节当然还有一个叫做readelf也很有用这个在后面介绍。这两个工具一般Linux里面都会自带有有可以自行google注这里的代码主要是在Linux下用GCC编译查看目标文件用的是Objdump、readelf。但是我会把所有的运行结果都上图所以之前没有接触过Linux的童鞋来看下面的内容也完全没问题哦。我用的是ubuntu感觉挺好~下面是a.out的组织结构每段的起始地址、、大小等等查看目标文件的命令是    objdump -h a.out就和上文中描述的目标文件的格式一样可以看出是分类存储的。目标文件被分为了6段。 从左到右第一列Idx Name是段的名字第二列Size是大小 VMA为虚拟地址LMA为物理地址File off是文件内的偏移。也就是这段相对于段中某一参考一般是段起始的距离。最后的Algn是对段属性的说明暂时不用理会 “text”段代码段。 “data”段也就是上面说的数据段保存了源代码中的数据一般是以初始化的数据。 “bss”段也是数据段存放那些未初始化的数据因为这些数据还未分配空间所以单独存放。 “rodata”段只读数据段里面存放的数据是只读的。 “cmment”存放的是编译器版本信息。 剩下的两段对我们的讨论没有实际意义就不再介绍。认为他们包含了一些链接、编译、装在的信息就可。 注 这里的目标文件格式只是列出实际情况中主要部分。实际情况还有一些表未列出。如果你也在用Linux可以用objdump -X 列出更详细的段内容。 深入a.out 上面部分通过实例说了目标文件中的典型的段主要是段的信息如大小 等相关的属性。 那么这些段里面究竟有些什么东西呢“text”段里到底存了什么东西还是用我们的objdump。  objdump -s a.out   通过-s选项就可以查看目标文件的十六进制格式。 查看结果如下 如上图所示列出了各段的十六进制表示形式。可以看出图中共分为两栏左边的一栏是十六进制的表示 右边则显示相应的信息。比较明显的如“rodata”只读数据段中就有 “hello world”。。汗好像程序里的“hello”打错了后面多加了一个“w”截图麻烦。原谅下哈。 你也可以查看“hellow world”的ASCII值对应的十六进制就是里面的内容了。“comment”上文中说的这个段包含了一些编译器的版本信息这个段后面的内容就是了GCC编译器后面的是版本号。a.out反汇编编译的过程总是先把源文先变为汇编形式再翻译为机器语言。添加中间层嘛看了这么多的a.out再研究一下他的汇编形式是恨必要的objdump -d a.out可以列出文件的汇编形式。不过这里只列出了主要部分即main函数部分其实在main函数执行的开始和main函数执行以后都还有多工作要做。即初始化函数执行环境以及释放函数占用的空间等。上面的图中左边是代码的十六进制形式左边是汇编形式。对汇编熟悉的童鞋应该能看懂大部分这里就不在多述。 a.out头文件在介绍目标文件格式的时候提到过头文件这个概念里面包含了这个目标文件的一些基本信息。如该文件的版本、目标机器型号、程序入口地址等等。下图是文件头的形式可以用readelf -h 来查看。(下图中查看的是 hello.o它是源文件hello.c编译但未链接的文件。 这个和查看a.out 大部分是一样的)d 图中分为两栏左边一栏表示的是属性右边是属性值。第一行常被称为魔数。后面是一连串的数字其中的具体含义就不多说了可以自己去google。接下来的是一些和目标文件相关的信息。由于和我们要讨论的问题关系不大这里就不展开讨论了。上面是内容用具体的实例说了目标文件内部的组织形式目标文件只是产生可执行文件过程中的一个中间过程对于程序是如何运行的还没做讨论目标文件是如何转变为可执行文件以及可执行文件是如何执行的将在下面的部分中讨论对链接的简单认识 链接通俗的说就是把几个可执行文件。如果程序A中引用了文件B中定义的函数为了A中的函数能正常执行就需要把B中的函数部分也放在A的源代码中那么将A和B合并成一个文件的过程就是链接了。有专门的过程用来链接程序称为链接器。他将一些输入的目标文件加工后合成一个输出文件。这些目标文件中往往有相互的数据、函数引用。上文中我们看过了hello world的反汇编形式是一个还没有经过链接的文件也就是说当引用外部函数的时候是不知道其地址的如下图上图中cal指令就是调用了printf()函数因为这时候printf()函数并不在这个文件中所以无法确定它的地址在十六进制中就用“ff ff ff ”来表示它的地址。等经过链接以后这个地址就会变为函数的实际地址应为连接后这个函数已经被加载进入这个文件中了。链接的分类按把A相关的数据或函数合并为一个文件的先后可以把链接分为静态链接和动态链接。静态链接在程序执行之前就完成链接工作。也就是等链接完成后文件才能执行。但是这有一个明显的缺点比如说库函数。如果文件A 和文件B 都需要用到某个库函数链接完成后他们连接后的文件中都有这个库函数。当A和B同时执行时内存中就存在该库函数的两份拷贝这无疑浪费了存储空间。当规模扩大的时候这种浪费尤为明显。静态链接还有不容易升级等缺点。为了解决这些问题现在的很多程序都用动态链接。动态链接和静态链接不一样动态链接是在程序执行的时候才进行链接。也就是当程序加载执行的时候。还是上面的例子 如果A和B都用到了库函数Fun()A和B执行的时候内存中就只需要有Fun()的一个拷贝。关于链接还有很多知识以后会用专门的文章来谈。这里就不展开讲了。对装载的简单解释  我们知道程序要运行是必然要把程序加载到内存中的。在过去的机器里都是把整个程序都加载进入物理内存中现在一般都采用了虚拟存储机制即每个进程都有完整的地址空间给人的感觉好像每个进程都能使用完成的内存。然后由一个内存管理器把虚拟地址映射到实际的物理内存地址。按照上文的叙述 程序的地址可以分为虚拟地址和实际地址。虚拟地址即她在她的虚拟内存空间中的地址物理地址就是她被加载的实际地址。在上文中查看段 的时候或许你已经注意到了由于文件是未链接、未加载的所以每个段的虚拟地址和物理地址都是0.加载的过程可以这样理解先为程序中的各部分分配好虚拟地址然后再建立虚拟地址到物理地址的映射。其实关键的部分就是虚拟地址到物理地址的映射过程。程序装在完成之后cpu的程序计数器pc就指向文件中的代码起始位置然后程序就按顺序执行。小结一下 写这篇文章的目的在于梳理程序运行的机制在一个可执行文件执行的背后都隐藏了什么。从源代码到可执行文件通常要经历许多中间步骤每一个中间步骤都生成一个中间文件。只是现在的集成开发环境都吧这些步骤影藏了习惯于集成开发环境的我们也就逐渐的忽略了这些重要的技术内幕。这篇文章也只是介绍了一下这个过程的主线而已。其中的每一个细节展开来讲都可足已用一篇文章来论述。上面写的多是我个人的理解和看法。有不足的地方、还望能不吝赐教。参看资料computer systems 《windows内核分析》《程序员的自我修养》 如有转载请注明出处http://www.cnblogs.com/yanlingyin/ 一条鱼~ 博客园    尹雁铃2012-2-12  E-mailyanlingyinyeah.net
http://www.zqtcl.cn/news/138359/

相关文章:

  • 站长工具星空传媒怎么做游戏网站编辑
  • 大兴手机网站建设深圳小程序开发公司
  • c 大型网站开发案例电销系统线路
  • 鸿扬家装网站建设谈谈对seo的理解
  • 七米网站建设做网站也分内存大小的吗
  • 丝足网站的建设南宁关键词排名公司
  • 上饶商城网站建设亚马逊海外购官方网
  • 做网站代理商好赚吗高端品牌男鞋有哪些
  • 农产品网站建设及优化项目商务网站建设 视频
  • 北京兼职做网站建设百度app平台
  • 网站建设头部代码网站怎么做咨询
  • 网站运营 网站建设北京公司网站制作要多少钱
  • 郑州看妇科最好的医院是哪里南宁百度seo软件
  • 深圳市住房与建设局实名制网站手机网站打不开被拦截怎么办
  • 公司做网站的价格几千元wordpress 修改页脚
  • 专业网站建设公司在线咨询宁波网站推广公司价格
  • 网站搭建系统都有哪些丽水网站开发
  • 网站设计包含哪些技术外行怎么做网站
  • 网站建设运营知识推广软文平台
  • 营销型网站建设用途网站 文件夹结构
  • 制作网站建设策划方案cosy主题wordpress
  • 网站建设服务联享科技net和cn哪个做网站好
  • 深圳网站制作公司哪家好艺考培训学校
  • 潍坊网站的公司电话html网站开发基础
  • 网站模板样式做地图特效的网站
  • 商标查询官方网站有没有免费找客户的软件
  • 网站开发及服务合同行业网站名称
  • 网站建设费包括什么建筑设计领域
  • 网站建设 信科网络建行网站会员注册用户名
  • 网站建设的什么是开发实施注意什么网站开发实用技术pdf