Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么引导加载程序在内存中重新定位?_Assembly_System_Bootloader_Bios - Fatal编程技术网

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

Assembly 为什么引导加载程序在内存中重新定位?,assembly,system,bootloader,bios,Assembly,System,Bootloader,Bios,我正在编写一个引导加载程序,我已经记下了大部分细节,但我不确定为什么有些引导加载程序在开始执行大部分操作之前会在内存中重新定位它们自己 有人能解释一下吗 此行为的一个示例是,其中包含以下注释: bios启动例程在0x7c00加载boot.s,并将其自身移动到地址0x90000,然后跳转到该地址 从链接文章中: 在实践中,MBR通常包含一个引导加载程序,其目的是加载另一个引导加载程序-在其中一个分区的开始处找到。这通常是一个非常简单的程序,找到标记为活动的第一个分区,将其第一个扇区加载到RAM中,

我正在编写一个引导加载程序,我已经记下了大部分细节,但我不确定为什么有些引导加载程序在开始执行大部分操作之前会在内存中重新定位它们自己

有人能解释一下吗

此行为的一个示例是,其中包含以下注释:

bios启动例程在0x7c00加载boot.s,并将其自身移动到地址0x90000,然后跳转到该地址


从链接文章中:

在实践中,MBR通常包含一个引导加载程序,其目的是加载另一个引导加载程序-在其中一个分区的开始处找到。这通常是一个非常简单的程序,找到标记为活动的第一个分区,将其第一个扇区加载到RAM中,然后开始执行。由于按照惯例,新的引导加载程序也加载到地址7C00h,因此在执行此操作之前,旧的加载程序可能需要将其自身的全部或部分重新定位到不同的位置。另外,ES:SI应该包含分区表RAM中的地址,以及引导驱动器号。违反这些约定可能会导致引导加载程序与其他引导加载程序不兼容


Cookieoff实际上是正确的(因为他想把一些东西移到初始引导加载程序所在的位置),但这不是第二个引导加载程序,而是内核本身

根据他的评论:

然后在0x10000处加载系统, 使用BIOS中断。此后 禁用所有中断,移动 系统降到0x0000,更改为 保护模式,并调用 系统。然后,系统必须 在中重新初始化受保护模式 它有自己的表,并启用 根据需要中断

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

“注意!当前系统最多为 8*65536字节长。”

如果从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)

有时引导加载程序在ROM中,需要在某个时候复制到RAM。

但他在该页底部特别询问了Linux v0.01引导加载程序,它似乎不是2阶段加载程序。正如顶部的注释所示,它似乎直接将内核加载到0x10000。谢谢,完美的答案!我收集到这些应用程序被链接在一起,但我没有想到其他所有应用程序也会被加载到同一个地址。我注意到DL寄存器被用来标识驱动器号,但我还是找不到任何明确的文档。我不认为有一个标准的BIOS参考手册文件漂浮在互联网上,是吗?我曾经有一本包含中断表的书,但它至少有20年的历史了,可能已经非常过时(并且丢失了)。很明显,只有在操作系统设置了中断表之后,这些才可用。我使用了从ROM开始的引导加载程序。对不起。=)好吧,通常不是:)