程序的运行
操作系统环境下:可执行ELF文件运行
裸机环境下:BIN/HEX文件运行
1 可执行ELF文件
1.1 加载器
- 在操作系统环境下执行一个可执行文件,加载器会首先将可执
行文件加载到内存中 - 加载器拷贝数据完毕,进行相关操作,然后会跳转到程序入口
处运行该程序
1.2 镜像加载地址
- 程序头表
» 指定了可执行文件镜像加载到内存中的地址
» 链接地址=加载到内存中的地址 - ELF文件头基本信息
» 文件类型、运行平台、程序入口地址
1.3 程序头表 Program header table
记录系统如何将可执行文件加载到内存、要加载的段、入口地
址,一个程序段可能包含几个section
readelf -l
左边为可执行文件
右边为可重定位文件
2 Linux内存映像
当运行一个可执行文件时,主要的工作有三步
- 创建一个独立的虚拟地址空间
- 读取可执行文件头,建立虚拟地址空间与可执行文件的映射关系
- 将PC指针设置为可执行文件的入口地址,启动运行
2.1 程序入口
- 一般情况下,编译时的链接地址=运行地址
- 加载器会读取ELF文件头,找到程序入口地址
- 一般情况下:程序入口地址=链接地址+一定偏移
每个程序的链接地址都是0x08048000,为什么没有冲突?
3 MMU
3.1 虚拟地址与物理地址
CPU管脚的地址信号:物理地址
使能MMU后,操作系统运行的是虚拟地址
3.2 MMU的用途
虚拟内存,通过交换分区,可以运行比实际物理内存大的程序
内存保护:可以设置不同内存块的读写权限