gpt4 book ai didi

assembly - 为什么引导加载程序会在内存中重新定位?

转载 作者:行者123 更新时间:2023-12-02 19:04:18 24 4
gpt4 key购买 nike

我正在编写一个引导加载程序,并且已经掌握了大部分详细信息,但我不确定为什么某些引导加载程序在开始大量执行之前会在内存中重新定位自己。

谁能解释一下吗?

此行为的一个示例是 original v0.01 Linux kernel bootloader其中有以下评论:

boot.s is loaded at 0x7c00 by the bios-startup routines, and moves itself out of the way to address 0x90000, and jumps there.

最佳答案

CookieOfFortune 本质上是正确的(因为他想将某些内容移动到初始引导加载程序所在的位置),但它不是针对第二个引导加载程序,而是针对内核本身。

来自他的评论:

It then loads the system at 0x10000, using BIOS interrupts. Thereafter it disables all interrupts, moves the system down to 0x0000, changes to protected mode, and calls the start of system. System then must RE-initialize the protected mode in it's own tables, and enable interrupts as needed.

他希望内核位于 0x0000...0xKERNEL_SIZE-1,但是初始引导加载程序当前位于 0x7C00,因此如果内核超过 ~32 KB,它将在移动引导加载程序时覆盖引导加载程序。内核位于 0x0000 的事实也解释了这个注释:

"NOTE! currently system is at most 8*65536 bytes long."

如果从 0 开始的长度超过 512 KB,则将面临访问 x86 地址空间保留区域的风险。

我相信此代码部分包含实际跳转到内核的内容

mov ax,#0x0001  | protected mode (PE) bit
lmsw ax | This is it!
jmpi 0,8 | jmp offset 0 of segment 8 (cs)

关于assembly - 为什么引导加载程序会在内存中重新定位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1203108/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com