
理解bootloader与Linux中的位置无关代码(PIC)

"该文主要探讨了bootloader与Linux系统中的位置无关代码(Position Independent Code,简称PIC),并以u-boot和vivi两个bootloader为例进行了深入分析。文章首先介绍了加载域与运行域的概念,解释了为何需要这两个概念,并通过norflash到RAM的代码执行例子进行说明。此外,文章还讨论了链接地址的重要性以及相对跳转指令如何实现位置无关性。"
文章的核心知识点包括:
1. **加载域与运行域**:加载域是指代码在存储介质(如norflash)中的地址,而运行域则是代码实际执行时的内存地址(如RAM)。这种分离是因为某些代码需要在不同的地方运行,比如从非易失性存储加载到RAM中执行。
2. **链接地址与位置无关代码(PIC)**:链接地址是链接器分配给代码、变量和函数的实际地址。位置无关代码(PIC)是指不依赖于绝对地址的代码,它使用相对寻址而非绝对寻址,使得代码可以在内存中的任何位置正确执行。PIC的关键在于能够适应不同的加载和运行地址。
3. **汇编指令的相对跳转**:汇编指令如b、bl进行相对地址跳转,而不是绝对地址。例如,b main指令实际上是计算main标签相对于当前指令的偏移量,而不是main的绝对地址,这使得包含这些指令的代码段可以在不同位置运行。
4. **u-boot中的PIC应用**:在u-boot的start.S文件中,可以看到使用了位置无关的代码设计,如全局符号_start和相对指令ldrp,这些设计确保了u-boot在不同地址加载时仍能正常启动。
5. ** PIC的重要性**:对于可移植性和内存管理,特别是在动态链接和共享库的情况下,使用位置无关代码是必要的。在嵌入式系统中,如u-boot和vivi这样的bootloader,为了能在多种硬件配置下工作,通常需要实现位置无关。
6. **PIC的限制**:尽管PIC提供了灵活性,但使用绝对寻址指令会使代码变得位置有关。因此,在编写需要位置无关性的代码时,应避免使用绝对寻址。
7. **特定平台考虑**:文中提到分析基于mini2440的板子及配套代码,这意味着其他平台或代码可能有不同的实现方式和考虑。
8. **vivi部分的分析**:虽然未提供vivi的具体代码,但可以推断文章会进一步分析vivi如何实现位置无关代码,以及与u-boot在处理PIC方面的异同。
这篇文章不仅讲解了位置无关代码的基本原理,还通过具体的bootloader实例展示了其在实际系统中的应用。理解这些概念对于开发和调试嵌入式系统,尤其是Linux系统的引导过程至关重要。
相关推荐

















philipyu
- 粉丝: 3
最新资源
- 黑鱼工具箱:AE多线程渲染加速解决方案
- 联想工程师专修工具 LSPrepair 最新版本发布
- ASP+ACCESS网络考试系统完整开发教程及源代码
- 1995-2022年经济政策不确定性指数分析
- 封装TiXml导出项至DLL动态链接库方法介绍
- 项目管理绩效考核表的有效应用与重要性
- 易语言实现自绘播放器列表的源码解析
- 美国经济数据统计与分析-涵盖GDP、就业与汇率等关键指标
- Linux服务器JDK8u144-x64版本安装指南
- Padavan固件K2P_DRV_V5_512M更新版本特性解析
- ASP+ACCESS网络招聘管理系统全套解决方案
- 即插即用的OFD文件预览插件快速集成方案
- SWT与SwingWorker融合技术实现控件内容更新
- C#代码保护神器——ConfuserEx加壳工具
- 陕西西安建筑轮廓数据详细介绍与下载
- MATLAB实现RabbitDetect数据集目标检测方法
- 全面首发个人发卡系统,对接osupay.com教程及源码
- 解决车厢调度问题的数据结构课程作业
- yolov5机器视觉识别项目:三轮车违规停放数据集详细解读
- 原生安卓影视APP开发:苹果CMS10魔改与三级分销集成
- 健康劳动节特辑-4.23健康主题介绍
- 三相逆变器离网控制策略详解——比例谐振控制
- 2013年全球机场跑道shp格式地理数据集
- Android项目搭建规范与简易复用工具类