在深入了解bootloader为什么要重定位代码之前,我们首先需要了解bootloader的作用。简单来说,bootloader就是系统的引导程序,它负责在系统上电后加载操作系统或其他应用程序,是操作系统和硬件之间的重要接口。
因此,bootloader需要完成以下几个任务:
1.检测硬件配置,并初始化硬件的相关设置;
2.加载操作系统或其他应用程序到内存中,然后跳转到该程序的入口点开始执行;
3.提供一些命令行接口或者图形界面,方便用户进行一些配置或操作。
在加载应用程序时,bootloader需要将应用程序代码从外部存储设备(如硬盘、U盘等)读取到内存中,然后执行代码。由于应用程序代码需要和操作系统协同工作,因此需要满足操作系统的地址空间布局要求。
由于应用程序代码的地址空间布局是由编译器指定的,而不同的编译器可能有不同的布局要求,因此bootloader在加载应用程序代码时需要进行重定位,以便适应当前操作系统的地址空间布局。
Bootloader实现代码重定位的方法包括两种方式:
1.在编译应用程序代码时,将代码重定位信息包含在应用程序的可执行文件中,然后在bootloader加载应用程序时,根据可执行文件中的重定位信息进行代码重定位。
2.在bootloader加载应用程序代码时,通过解析应用程序代码中特定的节(section),根据特定的重定位算法进行代码重定位。
如今,很多应用程序都采用动态链接库(Dynamic Link Library,DLL)的形式进行开发,这种开发方式可以很好地实现代码的共享,减小程序的体积。但是,在DLL开发中,代码重定位就显得尤为重要,因为DLL通常会被多个应用程序使用,而不同的应用程序对代码的地址空间布局有不同的要求,因此需要进行代码重定位。
除此之外,在一些嵌入式系统中,代码重定位也是必不可少的。因为嵌入式系统的硬件资源通常十分有限,需要运行轻量级的操作系统和应用程序。在这种情况下,代码的地址空间布局并不一定满足操作系统的要求,这时候就需要进行重定位。