从硬件角度如何理解将代码拷贝到内存中运行?
本人做硬件的,一直无法理解软件工程师说的, 将Flash中的代码拷贝到内存中运行。希望有大牛出来解释一下下,通俗易懂的最好啊。 本帖最后由 ibichao 于 2015-8-17 10:47 编辑
这东西没什么说的,换个地方,挪个窝而已,
比如茶壶里的水倒在茶杯中喝,
难道直接用茶壶喝就不行?当然可以,只是用茶壶不方便,体积大,散热又差。
同样道理,程序在flash中就JB不能运行?当然可以,只是速度慢,或有其它目的。 本帖最后由 磊磊映画 于 2015-8-17 10:51 编辑
1.跟做硬件做软件没关系吧?
2.单片机原理总学过吧,在单片机里面只能存放二进制代码,每次烧录程序都是往单片机的ROM里面写01010011010(例子),不同的01组合代表不同的指令。
3.以51单片机为例,单片机上电后PC寄存器固定从0000地址执行,有的指令就需要从rom中取常数,放到CPU里去运算处理。 ibichao 发表于 2015-8-17 10:46
这东西没什么说的,换个地方,挪个窝而已,
比如茶壶里的水倒在茶杯中喝,
难道直接用茶壶喝就不行?当然可 ...
{:sweat:} ,简单粗暴的解释,话糙理不糙。
{:handshake:} 我来按硬件的说法来讲一下为什么要进行这次代码的搬运哈:
一段程序在编译的时候,地址就是已经订下来的,特别是跳转语句和函数调用(当然也有与地址无关的,不考虑哈);那这段代码在编译后,它的运行地址就是已经确认的、是写死在ELF文件里面的、是不随你的意愿而能改变的,这个楼主是否可以理解哈?
这个地址一般都放在RAM里,理由是速度快,放在FLASH里面也是可以的,就是速度太慢,这个楼主是否可以理解?(还有一些初始化的不讲了,大家都明白)
那么现在的做法就是在FLASH里面写上一段代码,这段代码的作用就是初始化硬件和把放在FLASH的APP拷贝到RAM里面跑哈
完毕,楼主明白了吗? 磊磊映画 发表于 2015-8-17 10:48
1.跟做硬件做软件没关系吧?
2.单片机原理总学过吧,在单片机里面只能存放二进制代码,每次烧录程序都是往 ...
{:victory:} jm2011 发表于 2015-8-17 11:15
我来按硬件的说法来讲一下为什么要进行这次代码的搬运哈:
一段程序在编译的时候,地址就是已经订下来的, ...
看完后我的理解是:
本质上FLash存的是指令执行的地址,这些地址会被读入到内存中,最终CPU会读取这些地址来执行相应的操作。
不知道这样理解是否正确? Falsh中存放的是指令和数据,有些指令有数据,有些没有。取得指令就解码,看看这个指令是否需要数据,需要就读取数据,而后根据指令该干吗就干吗。。。 因为RAM速度比外部快,所以CPU按照特定规则从RAM读取指令和数据,然后把结果回存或者输出。至于CPU是如何运作的,我觉得用FPGA验证一下代码,这样最形象。 wjfblack 发表于 2015-8-17 11:28
看完后我的理解是:
本质上FLash存的是指令执行的地址,这些地址会被读入到内存中,最终CPU会读取这些地 ...
这个应该是指令吧,不过你理解的步奏是对的,指令被读到RAM里面去,最终CPU会读取这些指令来执行相应的操作。
只要记住,这些指令里面可能包含着绝对或相对的地址就可以了;
在编译的时候我们最后一步是链接,我们会把各个OBJ文件链接在一起,这个是通过链接命令LD来实现的;这个过程就是地址的重定位过程:)
通俗的说就是按照你定义的运行的地址(在xxx.ld文件里面指定),我们把跳转和函数的地址计算出来写进去哈; 从硬件更好理解,只要能取到指令,代码在哪都能跑 学习楼上几位讲解 CPU 的寻址空间固定的,只要在这个范围内,都可以访问,不管是代码还是数据,flash还是ram
ram一般访问的速度比flash快一些,所以经常将存储在flash空间的代码搬移到ram空间运行以提高程序运行速度
但是代码编译链接时是又要求的,必须是采用间接寻址的位置无关方式编译链接 jm2011 发表于 2015-8-17 13:53
这个应该是指令吧,不过你理解的步奏是对的,指令被读到RAM里面去,最终CPU会读取这些指令来执行相应的操 ...
领教了。
你应该是软件工程师吧。 dykwai1 发表于 2015-8-17 15:20
CPU 的寻址空间固定的,只要在这个范围内,都可以访问,不管是代码还是数据,flash还是ram
ram一般访问的速 ...
多谢解答,加深了我的理解。 lans0625 发表于 2015-8-17 11:38
Falsh中存放的是指令和数据,有些指令有数据,有些没有。取得指令就解码,看看这个指令是否需要数据,需要 ...
{:victory:}
页:
[1]