linux内核地址问题

1.内核编译时使用的虚拟地址0xc0000000

2.编译的内核去除调试信息压缩和misc.o和head.o等链接后形成新的镜像文件

3.这个新的镜像是可重定位的,至少前面执行部分和地址无关(执行地址暂时不清楚,应该是重定位后就可以了)

4.这个镜像使用mkimage后添加0x40个byte信息形成uImage镜像,参数-a指定加载地址-e指定入口地址

5.执行bootm后,uboot首先判断bootm参数地址和-a地址是否相同,如果相同则在-e地址执行,如果不同则执行misc.o和head.o中的自解压代码,其中会判断是否和解压后代码地址冲突,如果冲突就搬移自身代码并执行重定位

6.自解压代码执行解压把压缩内核解压到-a参数地址,然后跳到这个地址执行


推论:

1.如果bootm参数地址和-a相同,则-e地址比-a参数大0x40,这种情况一般是在nor flash直接启动xip执行,编译地址需要和nor flash寻址空间吻合,因为不能重定位

2.如果是在ram中执行内核,一般而言bootm参数bootm参数和-a参数应该不一样,一样其实也没关系,-a和-e参数一样并且一般是物理地址,和0xc0000000应该有个偏移


论据:

1.在内核的head.s文件中添加一个特殊的字符串,至于为什么在这个位置,因为是内核入口,为什么是内核入口,看sysmap.map文件


2.启动uboot后tftp内核到内存后bootm启动,然后重启使用md指令查看内存找到字符串位置

linux内核地址问题_第1张图片


3.实验通过tftp把内核复制到不同地址只要不和解压后地址冲突均可正常启动,但是如果冲突的话就会出错重启,貌似没有搬移自身代码并重定位,待查!


你可能感兴趣的:(linux内核地址问题)