搜索
bottom↓
回复: 9

问一个基础问题,CPU在执行代码时是否将数据从FLASH中拷到RAM中在执行?

[复制链接]

出0入0汤圆

发表于 2011-8-31 16:14:44 | 显示全部楼层 |阅读模式
记得曾经的X86架构下,CPU执行的都是RAM中的代码,那时的内存很小,所以采用64K代码限制的说法;也就是说,CPU要执行程序,都是将ROM中的程序拷贝到RAM中,才能执行的?? 那谁来做这个拷贝的工作??

现在的单片机FLASH都是几十K,RAM才几K,代码都是烧到FLASH中,我理解是CPU直接从FLASH中取指,不可能在将代码拷贝到RAM中执行了!!

但看http://www.ibm.com/developerworks/cn/linux/l-btloader/,提到“bootloader在stage2中,将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中”,也就是说代码要读到RAM,才执行的!!

那是不是每一种CPU在执行代码时,都要将代码从FLASH中拷贝到RAM中,才去执行?

出0入0汤圆

发表于 2011-8-31 16:25:33 | 显示全部楼层
大部分单片机都是从Flash直接执行的,这也是为什么速度始终徘徊在几十兆的范围
因为能直接执行指令的Flash速度就这么快了
电脑都是从非易失性存储器中拷贝到DRAM中执行的

但是也有既可在Flash中直接执行指令也可拷贝到RAM中执行指令的单片机,通过配置设置
CM3就可以
Bootloader也可以在Flash中执行,看处理器而定

出0入0汤圆

发表于 2011-8-31 17:28:32 | 显示全部楼层
回复【楼主位】ybdesire  
-----------------------------------------------------------------------
如果移植了linux这样的操作系统,内存已经基本不是问题,至少配备了几十M内存,而且这样的CPU主频也在百兆开外,所以必须把操作系统搬到内存中去才能发挥操作系统的优势,像2440有400M主频,如果操作系统放到flash里面可想而知效果是怎么样的。代码不一定要到内存,但是可读写的数据必须在内存中(带有特殊掉电非易失存储区并且支持直接写的如E2PROM的除外)有些编译在编译的时候会编译进去一些库函数来帮你完成初始化工作,这个工作可能不是代码的搬移,比如BSS段清零等

出0入0汤圆

 楼主| 发表于 2011-8-31 18:46:32 | 显示全部楼层
谢谢ls两位,据我所知,S3C2440是“拷贝”的
请问还有其它什么样的处理器是需要“拷贝”的?
这个“拷贝”工作是编译器添加进去的库函数完成的?

出0入0汤圆

发表于 2011-9-1 23:51:55 | 显示全部楼层
回复【3楼】ybdesire
-----------------------------------------------------------------------
上面没说清楚,有的编译器可以做BSS段的清零工作,比如在keil中你的汇编程序最后跳到bx main和bx _main函数效果肯定是不一样的,就是应为这个原因几次移植ucgui都失败了,开始一直跳到main函数,后来突然有一天改到_main这个系统自带的入口点后就成功了,我猜测可能是这个库函数做了环境初始化工作,比如BSS段清零。还有其他的一些系统自带库函数环境的初始化工作,但是代码的搬移工作肯定不能指望编译器来完成的而需要自己写代码搬移。至于你说的其他处理器,我不是很清楚,我知道的几种类型的CPU都没有强制要求搬移的,但是要求可读写的数据段必须在程序指令可以直接读写的地方,而一般用的nor类型的falsh类型不满足这个条件或者说写操作太费时了。这个时候数据段就需自己写代码要搬移到内存了,而代码段可以在flash中。

编辑:http://blog.csdn.net/norains/article/details/6052029这个链接上有介绍_main函数的作用,说得比较清楚参考一下。

出0入0汤圆

 楼主| 发表于 2011-9-2 21:25:03 | 显示全部楼层
回复【4楼】s200661524
-----------------------------------------------------------------------

也不对,比如在windows下写的exe程序,就是一个pe文件,大家可以研究下PE中肯定没有代码搬移
编译器添加的启动代码,只做初始化的工作,比如开辟堆栈、变量初始化、设定中断向量...  没有代码搬移的啊!!!

出0入0汤圆

发表于 2011-9-2 23:10:34 | 显示全部楼层
呵呵,还是先限定下说的是什么单片机吧,否则怎么说都可能的。51,AVR,和最新的ARM是没法在一起讨论的。

出0入0汤圆

发表于 2011-9-2 23:21:01 | 显示全部楼层
ARM 其实已经不属于单片机的范畴了。。

出0入0汤圆

发表于 2011-9-3 12:12:17 | 显示全部楼层
回复【5楼】ybdesire
-----------------------------------------------------------------------
操作系统充当了搬移任务,pe里面记录了各种段的地址,加载器分析后加载到相应的位置。

回复【6楼】eefans
-----------------------------------------------------------------------
你所说的不能比是指什么方面呢?综合性能方面肯定是不可同日而语的。

回复【7楼】huayuliang 花生
-----------------------------------------------------------------------

书上和网上对单片机的定义都是这么说的
单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
这是国人定义的,可能每个人都有不同的看法,就像说什么是嵌入式一样,但是既然书上和网上这么说不妨作为参考。
呵呵 如果按照这样理解的话,现在基于ARM内核的MCU大部分也还是可以归结到单片机的大范畴,尽管这根我们通常提起单片机就想到51.

出0入0汤圆

 楼主| 发表于 2011-9-18 08:47:05 | 显示全部楼层
是否拷贝,也是代码说了算的,一般的拷贝工作都有启动程序(bootloader,BIOS)来执行
所以主要看启动程序,就能知道代码在执行时是否发生了拷贝
u-boot,BIOS都会将内核与文件系统拷贝到内存中,然后在跳转到内存中执行相应代码
在内存中执行代码的主要优点,就在于能提到代码的执行速度(读写FLASH、硬盘,速度都不如读写RAM快)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 20:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表