Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Operating system 在JOS中加载全局/中断描述符表寄存器后,BIOS做什么?_Operating System_Bios - Fatal编程技术网

Operating system 在JOS中加载全局/中断描述符表寄存器后,BIOS做什么?

Operating system 在JOS中加载全局/中断描述符表寄存器后,BIOS做什么?,operating-system,bios,Operating System,Bios,我已经分析了BIOS开始执行直到加载全局/中断描述符表寄存器的第一个代码。我所说的BIOS是MITs课程“操作系统工程”中的BIOS。在那之后我很难理解BIOS是怎么做的 [f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b #when BIOS starts executing, jump to the address fe05bH to continue to execute [f000:e05b] 0xfe05b: cmpl $0x0,%c

我已经分析了BIOS开始执行直到加载全局/中断描述符表寄存器的第一个代码。我所说的BIOS是MITs课程“操作系统工程”中的BIOS。在那之后我很难理解BIOS是怎么做的

[f000:fff0]    0xffff0: ljmp   $0xf000,$0xe05b
#when BIOS starts executing, jump to the address fe05bH to continue to execute
[f000:e05b]    0xfe05b: cmpl   $0x0,%cs:0x6574
[f000:e062]    0xfe062: jne    0xfd2b6
[f000:e066]    0xfe066: xor    %ax,%ax
[f000:e068]    0xfe068: mov    %ax,%ss
#set %ss to 0
[f000:e06a]    0xfe06a: mov    $0x7000,%esp
[f000:e070]    0xfe070: mov    $0xf3c24,%edx
[f000:e076]    0xfe076: jmp    0xfd124
[f000:d124]    0xfd124: mov    %eax,%ecx
[f000:d127]    0xfd127: cli
#turn off interrupt
[f000:d128]    0xfd128: cld 
# set DF flag to 0, when  DF=0, SI = SI + 1 , DI = DI + 1
[f000:d129]    0xfd129: mov    $0x8f,%eax
[f000:d12f]    0xfd12f: out    %al,$0x70
[f000:d131]    0xfd131: in     $0x71,%al
#close NMI through 70H I/O port, selecting CMOS 0xF register, and assigining 0xF register's value to %al register
[f000:d133]    0xfd133: in     $0x92,%al
[f000:d135]    0xfd135: or     $0x2,%al
[f000:d137]    0xfd137: out    %al,$0x92
#enable A20 address line
[f000:d139]    0xfd139: lidtw  %cs:0x6690
[f000:d13f]    0xfd13f: lgdtw  %cs:0x6650
#loading Global/Interrupt Descriptor Table Register
[f000:d145]    0xfd145: mov    %cr0,%eax
[f000:d148]    0xfd148: or     $0x1,%eax
[f000:d14c]    0xfd14c: mov    %eax,%cr0
#set CR0 PE=1. when PE=1 CPU is in protected mode
[f000:d14f]    0xfd14f: ljmpl  $0x8,$0xfd157
 The target architecture is assumed to be i386
 => 0xfd157:    mov    $0x10,%eax
 => 0xfd15c:    mov    %eax,%ds
 => 0xfd15e:    mov    %eax,%es
 => 0xfd160:    mov    %eax,%ss
 => 0xfd162:    mov    %eax,%fs
 => 0xfd164:    mov    %eax,%gs
 #After loading GDTR, it's necessary to reload all the segment register
 .....

在这些代码之后,我不知道BIOS如何执行以搜索可引导设备,如软盘、硬盘或CD-ROM。最终,当它找到可引导磁盘时,BIOS从磁盘读取引导加载程序并将控制权传输给它,但我遇到了相同的问题,并在

我链接的页面是映射到重置向量的向量的源代码。 如果您真的想在GDB中解析40KB的BIOS代码,请随便拿一些草稿纸,开始绘制堆栈布局和BIOS代码布局。在决定阅读源代码之前,我花了几个小时这样做;阅读源代码可能更健康

编辑:也可以在wikipedia页面上查看选项ROM上的BIOS,与选项ROM的wikipedia页面相比,提供了更好的选项ROM信息。我花了很长时间才弄明白