数据结构逻辑结构图例子
目录
一、程序的结构
1. 程序头(Header)的描述信息
2. 关于汇编地址的概念
二、bootloader的作用
1. bootloader将程序从硬盘读取到内存的过程
2. 读取到内存中的位置确定
3. 如果程序文件超过64KB的处理方法
三、代码重定位
1. 程序点的重定位
2. 段表的重定位
四、跳转到程序的地址
五、操作系统程序的执行
在上一篇文章中,以几个重要的内存地址为线索,介绍了x86系统在上电开机后如何执行第一条指令。本文继续探讨引导程序(bootloader)如何将操作系统程序读取到内存中,然后跳转到操作系统的第一条指令处开始执行的过程。
为了理解这一过程,我们先介绍待加载的操作系统程序的文件结构。这里的文件结构是一个简化版本,与我们平时写的应用程序没有差别,因此也可以看作是一个普通的程序文件。
操作系统程序静静地躺在硬盘中,等待bootloader来读取。bootloader可以看作是一个加载器。为了二者之间的通信,需要某种协议来进行沟通,这个协议就是程序文件的头信息(Header)。
程序头信息详细描述了程序的各种属性,包括:程序的总长度、包含的段数量、地址等信息。典型的Linux ELF格式的可执行文件就包含了这样的头部信息。
为了便于描述,假设程序中包括3个段:代码段、数据段和栈段。每一个段的详细信息都在Header中有详细的描述。为了能够让加载器(bootloader)了解每个段的具体信息,程序会在自己的Header部分详细描述自己的信息。这样,bootloader就能够知道要读取多少个字节的程序文件,以及跳转到哪个位置才能让操作系统的指令开始执行。