Assembly 引导加载程序-将处理器切换到保护模式
我很难理解一个简单的引导加载程序是如何工作的。我所说的引导加载程序是MITs课程“操作系统工程”中的一个 首先,让我向您展示BIOS执行的一段汇编代码:Assembly 引导加载程序-将处理器切换到保护模式,assembly,operating-system,x86,bootloader,protected-mode,Assembly,Operating System,X86,Bootloader,Protected Mode,我很难理解一个简单的引导加载程序是如何工作的。我所说的引导加载程序是MITs课程“操作系统工程”中的一个 首先,让我向您展示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:f
[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
从外观上看,该代码设置中断表和描述符表,然后打开保护模式
# 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
ljmp $0xb866,$0x87c32
这里完全丢失了-为什么写在.asm文件中的指令和执行的指令不同?我有一种预感,这与受保护模式以及它如何转换地址有关,但我真的不明白
我将感谢任何帮助
为什么我们在BIOS中进入保护模式?引导加载程序不应该在实模式下运行吗(顺便说一句,为什么它需要在实模式下运行?) 受保护模式提供了比realmode更多的功能:本质上是Intel CPU的保护环特权机制(http://en.wikipedia.org/wiki/Ring_(计算机安全)、32位模式执行等 我搜索了ljmpl指令的具体工作原理,但没有找到它与ljmp和常规jmp之间的区别——如果有人能指出正确的方向,我将不胜感激 ljmpl和ljmp在这里的上下文是相同的 为什么要执行跳转?此指令的目的是什么 这是“英特尔手册”中规定的要求,下面的代码中也有内联规定 对于从真实到受保护的转换,它在stage2引导加载程序中实现,如下所示:
正如你所看到的,代码的每个部分都有一个函数,ljmp本质上是清除预取队列,正如《英特尔手册》中所要求的,我不记得在哪里。投票结束太宽:一个问题太多。
ljmp
使用选择器加载cs,该选择器通常在GDT中选择一个描述符,即DPL=0,32位code段。在执行ljmp
之前,无论是否设置PE,您仍然处于16位代码段中。设置PE会影响加载段寄存器的行为。真正改变模式的是cs选择器加载描述符。
ljmp $0xb866,$0x87c32
974 /* load the GDT register */
975 DATA32 ADDR32 lgdt gdtdesc
976
977 /* turn on protected mode */
978 movl %cr0, %eax
979 orl $CR0_PE_ON, %eax
980 movl %eax, %cr0
981
982 /* jump to relocation, flush prefetch queue, and reload %cs */
983 DATA32 ljmp $PROT_MODE_CSEG, $protcseg
984