位置无关编码(PIC,position independent code):汇编源文件被编码成二进制可执行程序时编码方式与位置(内存地址)无关。在我们写程序时,必须给链接器指定地址。将来的程序被执行时必须放在当时链接时给定的地址才能运行。
位置有关编码:汇编源码编码成二进制可执行程序后和内存地址是有关的。但是也有一种特别的指令他可以跟指定的链接地址没有关系,这些代码不管放在哪里都可以正常运行。
分析:
Ⅰ.之前的裸机程序中,makefile中用-Ttext 0x0来指定链接地址是0x0;这意味着我们认为将来这个程序会被放在0x0这个地址去运行。但是实际上我们在DNW中,把程序下载到0xd0020010(在s5pv210中,由于在内部做了映射,所以0xd002_0010和0x0000_0010是一样的)。那么为什么放在0x0而不是0x0000_0010依旧可以呢?原因就这个是位置无关编码。
☆链接地址:链接时指定的地址(指定方式:makefile中用T-text,或者链接脚本)
☆运行地址:程序实际运行的地址(指定方式:由实际运行时被加载到内存那个位置说了算)
Ⅱ.在linux中的应用程序:gcc hello.c -o hello
☞ 这时候默认的链接地址就是0x0,所以链接在0地址,因为应用程序运行在操作系统的一个进程中,这个进程独享了4G的内存空间,所以应用程序可以链接到0地址,因为每个进程都是从0地址开始的。
☞ 210中的裸机程序运行地址由我们下载时确定,下载时下载到0xd0020010,所以就从这里开始运行。(这个下载地址是iROM中的BL0加载BL1时实现指定好的地址,这个是由CPU设计时候决定的)。所以理论上我们编译链接时应该指定到0xd0020010,但是实际上我们之前的裸机程序都是使用位置无关码PIC,所以链接地址可以是0(随意)
对比:位置无关编码链接地址和运行时地址可以不同,并不影响程序的正常运行;位置有关编码的链接地址和运行时地址必须相同,也就是程序必须放在我们所指定的运行地址处运行。
嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击这里扫码进群领资料,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!