【发布时间】:2011-07-09 20:27:47
【问题描述】:
我很难理解一个简单的引导加载程序是如何工作的。我正在谈论的引导加载程序是 MIT 课程“操作系统工程”中的引导加载程序。
首先,让我给你看一段 BIOS 执行的汇编代码:
[f000:fec3] 0xffec3: lidtw %cs:0x7908
[f000:fec9] 0xffec9: lgdtw %cs:0x7948
[f000:fecf] 0xffecf: mov %cr0,%eax
[f000:fed2] 0xffed2: or $0x1,%eax
[f000:fed6] 0xffed6: mov %eax,%cr0
[f000:fed9] 0xffed9: ljmpl $0x8,$0xffee1
从表面上看,这段代码建立了中断表和描述符表,然后开启了保护模式。
- 为什么要进入保护模式 在 BIOS 中?不应该 引导加载程序以实模式运行(顺便说一句 - 为什么需要真实运行 模式?)
- 我搜索但没有找到任何地方 ljmpl 指令到底如何 工作,是之间的区别 it 和 ljmp 和常规 jmp - I 如果有人愿意,将不胜感激 指向正确的方向。
- 我们为什么要执行跳转?什么是 这条指令的目的是什么?
转到引导加载程序代码 -
# Switch from real to protected mode, using a bootstrap GDT
# and segment translation that makes virtual addresses
# identical to their physical addresses, so that the
# effective memory map does not change during the switch.
lgdt gdtdesc
movl %cr0, %eax
orl $CR0_PE_ON, %eax
movl %eax, %cr0
# Jump to next instruction, but in 32-bit code segment.
# Switches processor into 32-bit mode.
ljmp $PROT_MODE_CSEG, $protcseg
- 它说处理器在 实模式 - 但我们刚刚看到 BIOS 切换到保护模式... 我很困惑——这怎么可能 可能吗?
- 我们如何切换到 32 位模式?什么 导致处理器神奇地运行 由于 ljmp 进入 32 位模式 指导?
还有一件事我不明白 - 当我使用 gdb 跟踪引导加载程序的执行时,我看到正在执行以下指令(这是引导加载程序代码中的 ljmp 指令):
ljmp $0x8,$0x7c32
但是当我查看 .asm 文件时,我看到了以下内容:
ljmp $0xb866,$0x87c32
完全迷路了——为什么写在.asm文件中的指令和执行的指令不一样?我有一种预感,这与保护模式以及它如何转换地址有关,但我真的不明白。
我将不胜感激!
【问题讨论】:
-
投票结束过于广泛:一个问题太多。
标签: assembly operating-system x86 bootloader protected-mode