关于6.828实验中的bootloader链接地址与加载地址的思考

来源:互联网 发布:seo关键字是什么 编辑:程序博客网 时间:2024/05/17 17:44

bootloader的链接地址与加载地址不致会引起什么问题?

这个问题是我们所关心的,涉及到的其他相关知识读者可以自己去了解,不多解释了。

1、bootloader如何进内存

这个工作由BIOS来完成,我们也可以根据这个过程来了解加载地址是如何确定的。
明确:BIOS根据事先确定好的地址来加载bootloader。

2、bootloader链接地址与加载地址不一致情况下第一条指令如何执行

需要明确的是,什么不变,什么变了。这个地方的两种情况是:
a、加载地址Addr_load、链接地址Addr_linkA(两者一致)。
b、加载地址Addr_load、链接地址Addr_linkB(两都不一致)。
这个过程我们修改了链接地址,加载地址不变。

两种情况下,bootloader第一条指令都能正确执行,问题是在b中,当机器碰到跳转指令时就会引起问题。
代码认为自己在某个位置,但实际上那个位置并没有自己想要的东西。再考虑每个cpu指令集不定长的情况,基于cpu取指、执行的工作模式,cpu大概率会取到不正确的指令,直接就挂了。

这个是基本情况,网上看了一些资料,感觉很多没有说清楚,所以把自己的观点贴出来。

这里写图片描述

图中是用qemu模拟加载bootloader的过程,其中:
加载地址是0x7c00,链接地址是0x7c04。
可以看到bootloader在0x7c00开始的指令都能正确执行,碰到ljmp指令的时候会挂。
这个指令的具体内容是:ljmp 0x8,0x7c36。
但是事实上这个地址并没有一个完整的x86指令。

原创粉丝点击