您的位置 首页 被动

程序的考虑(从单片机到PC)

关于程序的执行,以前想的不多,没有意识到一个程序在运行时,从哪里读指令,数据又写在哪里。最近在看CSAPP时这个念头经常在脑袋中晃荡。

关于程序的履行,曾经想的不多,没有意识到一个程序在运转时,从哪里读指令,数据又写在哪里。

最近在看CSAPP时这个想法常常在脑袋中闲逛。

单片机上知道,在上电的那一刻,MCU的程序指针PC会被初始化为上电复位时的地址,从哪个地址处读取行将履行的指令,由此程序在MCU上开端履行(当然在调用程序的 main之前,还有一系列其他的的初始化要做,如仓库的初始化,不过这些咱们很少回去修正)。PC在上电时,和MCU差不多,不过读取的是BIOS,有它完结了许多初始化操作,最终,调用体系的初始化函数,将控制权交给了操作体系,所以咱们看到了Windows,Linux体系发动了。假如将操作体系看作是在处理器上跑的一个很大的裸机程序(便是直接在硬件上跑的程序,由于操作体系便是直接跑在CPU上的,这样看待是能够的,不过这个裸机程序功用许多,很强壮),那么操作体系的发动很像MCU程序的发动。前者有一个很大的初始化程序完结很杂乱的初始化,后者有一段不长的汇编代码完结一些简略的初始化。这一点看,它们在流程上是很类似的。

假如是体系上的程序发动呢?它们是由体系来决议的。Linux上在shell下输入./p后,首要查看是否是一个内建的shell指令;假如不是,则shell假定他是一个可履行文件(Linux上一般是elf格局),然后调用一些相关的函数,将在硬盘上的p文件的内容拷贝到内存(DDR RAM)中,并树立一个它的运转环境(当然这儿边还有内存映射,虚拟内存,衔接与加载,等一些其他东西),预备履行。

由以上可知,单片机上的程序和平常在体系上运转的程序,在发动时差异是很大的(假如将程序调用main曾经的动作,都笼统为初始化的话,程序的发动能够简化为:树立运转环境+调用main函数,这样程序的履行差异是不大的)。由于单片机上跑的程序(裸机程序),是和操作体系相同跑在硬件上的,它们归于一个层次的。曩昔之所以没有区分出单片机上的程序和PC机上的程序的一些差异,便是没有弄了解这一点。

由此,曾经的一些疑问也就解开了。为什么在单片机上的程序不怎么运用malloc,而PC上常常运用?由于单片机上没有现已写好的内存办理算法的代码,而在PC上操作体系里运转的程序,libc现已把这些都做了,只需要调用就能够了。假如在单片机上想用动态内存,也能够,可是这些代码要自己去完结,并界说一个相应的malloc,有时分一些公司会给供给一些库函数或许会完结malloc,可是由于单片机上RAM内存非常有限,假如不知道它的运转方法,估计会很风险。相同,由于在PC的体系上运转的程序与逻机程序的不同,裸机程序不会有动态链接,有的仅仅静态链接。

关于程序在履行时,从哪里读取指令,哪里读取数据,也曾由于没有弄清楚体系上的程序和裸机程序之间的差异,而疑问了好久。虽然在《微型计算机原理》课上知道程序运转时,从内存中读取指令和数据进行履行和回写。可是单片机上只需几K的RAM,而flash一般有几十K乃至1M,这个时分指令和数据都在内存中吗(这儿指的内存仅指RAM,由于PC上咱们常说的内存便是DDR RAM memory,先入为主以至于以为单片机上也是这样,还没有了解其实RAM和Flash都是内存)?这不或许,由于课上教师只说内存,可是PC上内存一般便是DDR RAM,不会是硬盘,硬盘是保存数据的当地;由此类比时,自己把自己弄晕菜了,单片机的RAM对应于DDR RAM,那Flash是不是就对应于硬盘了呢?在CSAPP上了解了,PC上之所以都在DDR RAM上,是速度的要素。硬盘的速度太慢,即使是行将到来的SSD比起DDRRAM,仍是差着几个数量级,所以拷贝到DDRRAM中。这时,一个程序的代码和数据是接连寄存的,其间代码段是只读区域,数据段是可读写区域(这是由操作体系的内存办理机制决议的)。运转时,再将它们拷贝到速度更快的SRAM中,以得到更快的履行速度。而关于,单片机而言作业频率也就几M,几十M,从Flash中与从RAM中读的差异或许并不显着,不会成为程序履行的瓶颈(而关于PC而言,Flash的速度太慢,DDRRAM的速度也是很慢,即使是SRAM也是慢了不少,所以再进步作业频率也进步不了程序的履行速度,所以现在CPU作业频率最快是在2003左右。一个瓶颈呈现了。为了进步CPU的运用率,换个视点想一下,已然不能削减一段程序的履行时刻,就在相同的时刻履行更多的程序,一个核履行一段程序,两个核就能够履行两段程序,所以多核CPU成为了现在的干流)。所以裸机程序指令就在Flash(Flash memory)中寄存,而数据就放在了RAM中(flash的写入次数有约束,一起它的速度和RAM仍是差许多)。更广泛说,在单片机上RAM寄存data段,bss段,仓库段;ROM(EPROM,EEPROM,Flash等非易失性存储设备)寄存代码,只读数据段。实质上说,这和PC上程序都在RAM中寄存是相同的,PC 上是操作体系规则了可读与可写,而单片机上是依托不同的存储设备区分了可读与可写(当然现在的Flash是可读写的,假如Flash没有写入次数约束,速度又能够和RAM相差不多,单片机上是不是只需Flash就能够了呢(直接相当于PC上的DDRRAM)?这样本钱也会比一个RAM,一个Flash低,更节约本钱,关于生产商更合算)。

关于单片机的程序履行时指令和数据的寄存与读取,了解如下:
单片机编程后,程序的代码段,data段,bss段,rodata段等都寄存在Flash中。当单片机上电后,初始化汇编代码将data段,bss段,复制到RAM中,并树立好仓库,开端调用程序的main函数。今后,便有了程序存储器,和数据存储器之分,运转时从Flash(即指令存储器,代码存储器)中读取指令 ,从RAM中读取与写入数据。RAM存在的含义就在于速度更快。
不管是单片机也好,PC也罢,存在的存储器金字塔都是共同的,速度的要素,本钱的约束导致了一级级更快的存储器的更快速度与更高的本钱。应该说,关于程序履行的了解,便是存储器金字塔的了解。

注:

那么,什么是RAM,ROM和Flash呢?虽然他们都是计算机内存的一种方法,可是RAM,ROM,FLASH它们三个都以各自的方法和他们存储的数据进行交互。下面临每种内存有一个简略的阐明。

RAM:表明随机拜访内存(random access memory):微处理器能够读写拜访的内存。当咱们创立一些东西时,它是在内存中完结的。RAM是内存,反之亦然。

ROM:表明只读内存:微处理器能够读ROM,可是不能写入或修正。ROM是永久性的。ROM芯片常常保存一些重要且永不改动的特别计算机指令。不管何时,微处理器都能够拜访到存储在ROM上的信息。由于这些指令不可被擦出,所以他们保存在ROM中。

Flash Memory:是一种兼具RAM和ROM二者性质的特别内存。咱们能够像操作RAM相同,向Flash 内存写入数据;可是它又像ROM相同,数据在掉电时不丢掉。悲惨剧的是,Flash 内存没有RAM那么快,所以任何时分都不要盼望它能替代规范的计算机内存。

http://www.dummies.com/how-to/content/ram-rom-and-flash-memory.html

ram, rom and flash

http://www.ehow.com/about_6398451_difference-between-flash-memory-ram.html

ram flash work

http://www.ehow.com/facts_6917638_difference-hard-disk-flash-memory_.html

flash disk work

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/beidong/255607.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部