linux - 为什么 bootsect 在 linux(x86) 中将自身移动到 0x90000?

标签 linux linux-kernel x86

我正在研究x86系统启动的过程 这是启动流程:

  1. BIOS 将 bootsect 从磁盘 MBR 加载到 0x7c00 内存地址
  2. boosect 将自身复制到 0x90000 内存地址并跳转到 0x90000。
  3. boosect 从磁盘加载设置到 0x90200 内存地址。
  4. 获取一些系统外围设备参数(视频、根磁盘、键盘等)并跳转到 0x90200。
  5. 将系统切换到保护模式将内核从 0x10000(64K) 移动到 0x0000
  6. 跳转到0x0000执行head.s进行内核启动

我的问题是,为什么我们需要先将 bootsect 本身移动到 0x90000?

为什么我们不能只移动设置和系统?

谢谢。

最佳答案

“卷影复制”您的引导加载程序并跳转到它曾经是(现在仍然是)一个好习惯。这种做法很早就开始了,当时典型的引导加载程序被限制为 x86 处理器上单个段的大小和从磁盘读取的单个扇区。一旦询问硬件,引导加载程序就可以执行更高级的工作,例如安装系统文件(调用、 Hook 、TSR 等)、被病毒接管,或初始化保护模式并开始执行应用程序的硬件分页等。

“行为”的起源早于 Linux,您应该发现这种行为在 x86 引导加载程序中很常见。可能是任何基于 IBM PC 的计算机。

目前在 Linux 中的代码可能来源于此:

外汇。 https://stuff.mit.edu/afs/sipb/user/warlord/C/memtest86/bootsect.s

在这种情况下,重定位到 0x90000 的选择可能是任意的,目标是将加载器从默认位置移到它自己选择的位置,这样它就不会被可能从“分配的程序”篡改低内存”(实际上:作为实践问题。)

我自己想知道一个明确的理由 :) 很确定这真的只是 x86 平台是 DOS 平台的时代的残余,随着硬件的发展,新的技巧被用来保持与“不友好”的向后兼容低内存代码。

关于linux - 为什么 bootsect 在 linux(x86) 中将自身移动到 0x90000?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25452352/

相关文章:

gcc - 内联汇编寻址方式

assembly - 获取 16 或 32 字节固定大小缓冲区的 C 字符串长度? (XMM 或 YMM 寄存器宽度)

c - sleep2 在 apue 中不能正常工作?

linux - Linux 中的内存区域标志 : why both VM_WRITE and VM_MAYWRITE are needed?

linux - kmemleak 和 kmemcheck 有什么区别?以及如何在 Android 操作系统上启用这些工具?

linux - 是否可以将输入的处理数据传输到另一台设备上的另一个 CPU?

assembly - 如何更改字符串的前景色(32 位汇编内核)?

linux - Logcat 在 Eclipse Mars 中显示不可见的消息

linux - "executable: command not found"虽然"make executable"成功了

linux - 如何禁用 GPU