wjfblack 发表于 2015-8-17 10:31:31

从硬件角度如何理解将代码拷贝到内存中运行?

本人做硬件的,一直无法理解软件工程师说的, 将Flash中的代码拷贝到内存中运行。
希望有大牛出来解释一下下,通俗易懂的最好啊。

ibichao 发表于 2015-8-17 10:46:09

本帖最后由 ibichao 于 2015-8-17 10:47 编辑

这东西没什么说的,换个地方,挪个窝而已,
比如茶壶里的水倒在茶杯中喝,
难道直接用茶壶喝就不行?当然可以,只是用茶壶不方便,体积大,散热又差。
同样道理,程序在flash中就JB不能运行?当然可以,只是速度慢,或有其它目的。

磊磊映画 发表于 2015-8-17 10:48:32

本帖最后由 磊磊映画 于 2015-8-17 10:51 编辑

1.跟做硬件做软件没关系吧?
2.单片机原理总学过吧,在单片机里面只能存放二进制代码,每次烧录程序都是往单片机的ROM里面写01010011010(例子),不同的01组合代表不同的指令。
3.以51单片机为例,单片机上电后PC寄存器固定从0000地址执行,有的指令就需要从rom中取常数,放到CPU里去运算处理。

wjfblack 发表于 2015-8-17 11:10:12

ibichao 发表于 2015-8-17 10:46
这东西没什么说的,换个地方,挪个窝而已,
比如茶壶里的水倒在茶杯中喝,
难道直接用茶壶喝就不行?当然可 ...

{:sweat:} ,简单粗暴的解释,话糙理不糙。
{:handshake:}

jm2011 发表于 2015-8-17 11:15:02

我来按硬件的说法来讲一下为什么要进行这次代码的搬运哈:

一段程序在编译的时候,地址就是已经订下来的,特别是跳转语句和函数调用(当然也有与地址无关的,不考虑哈);那这段代码在编译后,它的运行地址就是已经确认的、是写死在ELF文件里面的、是不随你的意愿而能改变的,这个楼主是否可以理解哈?

这个地址一般都放在RAM里,理由是速度快,放在FLASH里面也是可以的,就是速度太慢,这个楼主是否可以理解?(还有一些初始化的不讲了,大家都明白)

那么现在的做法就是在FLASH里面写上一段代码,这段代码的作用就是初始化硬件和把放在FLASH的APP拷贝到RAM里面跑哈

完毕,楼主明白了吗?

wjfblack 发表于 2015-8-17 11:17:28

磊磊映画 发表于 2015-8-17 10:48
1.跟做硬件做软件没关系吧?
2.单片机原理总学过吧,在单片机里面只能存放二进制代码,每次烧录程序都是往 ...

{:victory:}

wjfblack 发表于 2015-8-17 11:28:12

jm2011 发表于 2015-8-17 11:15
我来按硬件的说法来讲一下为什么要进行这次代码的搬运哈:

一段程序在编译的时候,地址就是已经订下来的, ...

看完后我的理解是:

本质上FLash存的是指令执行的地址,这些地址会被读入到内存中,最终CPU会读取这些地址来执行相应的操作。

不知道这样理解是否正确?

lans0625 发表于 2015-8-17 11:38:05

Falsh中存放的是指令和数据,有些指令有数据,有些没有。取得指令就解码,看看这个指令是否需要数据,需要就读取数据,而后根据指令该干吗就干吗。。。

tjuspring001 发表于 2015-8-17 13:17:05

因为RAM速度比外部快,所以CPU按照特定规则从RAM读取指令和数据,然后把结果回存或者输出。至于CPU是如何运作的,我觉得用FPGA验证一下代码,这样最形象。

jm2011 发表于 2015-8-17 13:53:59

wjfblack 发表于 2015-8-17 11:28
看完后我的理解是:

本质上FLash存的是指令执行的地址,这些地址会被读入到内存中,最终CPU会读取这些地 ...

这个应该是指令吧,不过你理解的步奏是对的,指令被读到RAM里面去,最终CPU会读取这些指令来执行相应的操作。
只要记住,这些指令里面可能包含着绝对或相对的地址就可以了;

在编译的时候我们最后一步是链接,我们会把各个OBJ文件链接在一起,这个是通过链接命令LD来实现的;这个过程就是地址的重定位过程:)
通俗的说就是按照你定义的运行的地址(在xxx.ld文件里面指定),我们把跳转和函数的地址计算出来写进去哈;

zchong 发表于 2015-8-17 14:52:13

从硬件更好理解,只要能取到指令,代码在哪都能跑

zengyi703 发表于 2015-8-17 14:53:42

学习楼上几位讲解

dykwai1 发表于 2015-8-17 15:20:29

CPU 的寻址空间固定的,只要在这个范围内,都可以访问,不管是代码还是数据,flash还是ram
ram一般访问的速度比flash快一些,所以经常将存储在flash空间的代码搬移到ram空间运行以提高程序运行速度
但是代码编译链接时是又要求的,必须是采用间接寻址的位置无关方式编译链接

wjfblack 发表于 2015-8-17 16:11:53

jm2011 发表于 2015-8-17 13:53
这个应该是指令吧,不过你理解的步奏是对的,指令被读到RAM里面去,最终CPU会读取这些指令来执行相应的操 ...

领教了。
你应该是软件工程师吧。

wjfblack 发表于 2015-8-17 16:13:30

dykwai1 发表于 2015-8-17 15:20
CPU 的寻址空间固定的,只要在这个范围内,都可以访问,不管是代码还是数据,flash还是ram
ram一般访问的速 ...

多谢解答,加深了我的理解。

wjfblack 发表于 2015-8-17 16:14:08

lans0625 发表于 2015-8-17 11:38
Falsh中存放的是指令和数据,有些指令有数据,有些没有。取得指令就解码,看看这个指令是否需要数据,需要 ...

{:victory:}
页: [1]
查看完整版本: 从硬件角度如何理解将代码拷贝到内存中运行?