我正在研究x86系统启动的过程 这是启动流程:
- BIOS 将 bootsect 从磁盘 MBR 加载到 0x7c00 内存地址
- boosect 将自身复制到 0x90000 内存地址并跳转到 0x90000。
- boosect 从磁盘加载设置到 0x90200 内存地址。
- 获取一些系统外围设备参数(视频、根磁盘、键盘等)并跳转到 0x90200。
- 将系统切换到保护模式将内核从 0x10000(64K) 移动到 0x0000
- 跳转到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/