浅谈编译器编译地址 ,cpu统一编址的物理地址,程序载入内存的地址。
来源:互联网 发布:js读取txt文件内容 编辑:程序博客网 时间:2024/06/05 16:23
随便找个IAR或者其他编译器生成的map文件。我们不难发现程序就是 .txt, .bss, .data等段的集合。
再仔细一看,BL _main,_main是一个地址,.data段也有地址。这些地址是如何来的呢?
编译器地址空间:
编译器按照一定的地址空间来编译程序,最终的程序就是指令和地址的集合,这个地址空间就是编译器地址空间。
CPU统一寻址空间:
CPU按照统一编址的地址去访问相关数据或者硬件。
编译地址空间和物理地址空间要对上号才能正确运行。为什么呢?
如:BL _main(0x800000000). 这条是编译器编译出来指令,就是跳转到0x80000000,
假如执行完上述指令,cpu pc指针指向0x80000000,而该处没有指令,而是一个寄存器的地址,那么程序是没有办法执行的下去的。
如何实现编译地址空间和物理地址空间要对上号?
通过两种方法来实现
1:一种是编译时确定,就是给编译器设定参数比如某个段从某个地址开始编译。
一般如嵌入式中常见的从0x8000000, 0x2000000.或者你可以单独定义数据段从某个地址开始。
然后通过bootloader 或者PC端载入程序把程序载入到对应的地址运行。
这种方式适合没有mmu的嵌入式系统的编译和载入。尤其要求载入的物理地址必须与代码段编译地址空间相对应(起始位置要相同)。
2: 通过MMU来实现地址的重定位。
编译器不关心的物理地址,编译器把编译地址认为从0-4g进行统一编址。
每个elf文件被载入内存,首先确定其载入内存所在的地址作为基地址,或者说将elf文件映射到对应的空间中。
0 0
- 浅谈编译器编译地址 ,cpu统一编址的物理地址,程序载入内存的地址。
- 物理地址与虚拟地址、统一编址与独立编址以及 I/O 端口与 I/O 内存
- linux的内存物理地址与映射地址
- linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)
- linux内存管理---物理地址、线性地址、虚拟地址、逻辑地址之间的转换
- 【Linux内存管理】虚拟地址、逻辑地址、线性地址、物理地址的区别
- 【Linux内存管理】虚拟地址、逻辑地址、线性地址、物理地址之间的转换
- linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别
- 逻辑地址,线性地址,物理地址的差别
- 逻辑地址,线性地址,物理地址的差别
- 如何将V4L2映射的内存地址转换成物理地址?
- linux内存管理-虚拟地址转换成物理地址的过程
- 物理地址和逻辑地址的
- 物理地址,虚拟地址,总线地址,i/o地址空间,内存地址空间,以及他们的映射关系
- 浅谈物理地址、虚拟地址和逻辑地址
- 理解的逻辑地址、线性地址、物理地址和虚拟地址
- 逻辑地址、线性地址、物理地址和虚拟地址的区别
- nandflash地址的物理地址,逻辑地址,spare地址等理解
- asp全局静态变量被回收
- Android Asynchronous Http Client-Android异步网络请求客户端接口
- pat 1079 another solution
- haudoopMR程序如何做表之间的链接
- 什么是渡假式交换酒店,先记一下
- 浅谈编译器编译地址 ,cpu统一编址的物理地址,程序载入内存的地址。
- android xml 无法自动提示
- RMQ算法 (区间最值问题)
- poj 1122
- 英语六级听力应试技巧:“五边处理法”
- UItableviewCell重用注意事项
- linux命令大全
- 【cocos2d-x】3.0 C++11 特性
- python 开一个简单的服务器