您的位置:首页 > 其它

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

2017-07-18 11:27 351 查看

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指令。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: