作者:liyanyl_499 | 来源:互联网 | 2023-01-30 10:34
1)CPU的工作模式有哪三种?实模式、保护模式、长模式2)如果下面这段应用程序代码能够成功运行,会有什么后果? intmain() { int*addr(i
1)CPU 的工作模式有哪三种?
2)如果下面这段应用程序代码能够成功运行,会有什么后果?
int main()
{
int* addr = (int*)0;
cli();
3)什么是实模式?
4)实模式下的寄存器有哪些?
5)实模式下访问内存需要获取地址值,这个值是如何计算的呢?
6)分段内存管理模型是什么样的?
7)代码段由哪两个寄存器确定?
8)栈段由哪两个寄存器确定?
9)分析下面代码?
data SEGMENT ;定义一个数据段存放Hello World!
hello DB 'Hello World!$' ;注意要以$结束
data ENDS
code SEGMENT ;定义一个代码段存放程序指令
ASSUME CS:CODE,DS:DATA ;告诉汇编程序,DS指向数据段,CS指向代码段
start:
MOV AX,data ;将data段首地址赋值给AX
MOV DS,AX ;将AX赋值给DS,使DS指向data段
LEA DX,hello ;使DX指向hello首地址
MOV AH,09h ;给AH设置参数09H,AH是AX高8位,AL是AX低8位,其它类似
INT 21h ;执行DOS中断输出DS指向的DX指向的字符串hello
MOV AX,4C00h ;给AX设置参数4C00h
INT 21h ;调用4C00h号功能,结束程序
code ENDS
END start
10)什么是中断?
11)在实模式下中断是如何实现的?
12)中断是如何产生的呢?
13)内存对我们的中断提供了哪些支持?
有了中断号以后,CPU 就能根据 IDTR 寄存器中的信息,计算出中断向量中的条目,进而装载 CS(装入代码段基地址)、IP(装入代码段内偏移)寄存器,最终响应中断。
14)什么是保护模式?
15)保护模式相比于实模式有哪些变化?
16)R0到R3谁大?
17)什么是保护模式段描述符?
18)内存中多个段描述符叫什么?
19)有了段描述符之后是怎么访问内存的?
20)CS、DS、ES、SS、FS、GS 这些段寄存器,里面存放的就是一个内存段的描述符索引吗?
20.1)影子寄存器是什么?
21)什么是保护模式平坦模型?
22)回过头去看看我们前面的Hello OS中段描述符表长什么样?
GDT_START:
knull_dsc: dq 0
;第一个段描述符CPU硬件规定必须为0
kcode_dsc: dq 0x00cf9e000000ffff
;段基地址=0,段长度=0xfffff
;G=1,D/B=1,L=0,AVL=0
;P=1,DPL=0,S=1
;T=1,C=1,R=1,A=0
kdata_dsc: dq 0x00cf92000000ffff
;段基地址=0,段长度=0xfffff
;G=1,D/B=1,L=0,AVL=0
;P=1,DPL=0,S=1
;T=0,C=0,R=1,A=0
GDT_END:
GDT_PTR:
GDTLEN dw GDT_END-GDT_START-1
GDTBASE dd GDT_START
23)保护模式下中断是怎样处理的?
24)保护模式下cpu收到中断后,会采取哪些措施?
检查中断号是否大于最后一个中断门描述符(0-255),然后检查描述符类型(是否是中断门或者陷阱门),是否为系统描述符,是不是存在于内存中。
接着,检查中断门描述符中的段选择子指向的段描述符。
最后做权限检查,如果 CPL 小于等于中断门的 DPL,并且 CPL 大于等于中断门中的段选择子所指向的段描述符的 DPL,就指向段描述符的 DPL。
25)我们的CPU默认是实模式的,那怎样进入保护模式?
第一步,准备全局段描述符表,代码如下。
GDT_START:
knull_dsc: dq 0
kcode_dsc: dq 0x00cf9e000000ffff
kdata_dsc: dq 0x00cf92000000ffff
GDT_END:
GDT_PTR:
GDTLEN dw GDT_END-GDT_START-1
GDTBASE dd GDT_START
第二步,加载设置 GDTR 寄存器,使之指向全局段描述符表。
lgdt [GDT_PTR]
第三步,设置 CR0 寄存器,开启保护模式。
;开启 PE
mov eax, cr0
bts eax, 0 ; CR0.PE =1
mov cr0, eax
第四步,进行长跳转,加载 CS 段寄存器,即段选择子。
jmp dword 0x8 :_32bits_mode ;_32bits_mode为32位代码标号即段偏移
26)为什么要进行长跳转?
27)什么是长模式?
28)长模式相比于保护模式有什么变化?
29)长模式下段描述的格式是什么样的?
ex64_GDT:
null_dsc: dq 0
;第一个段描述符CPU硬件规定必须为0
c64_dsc:dq 0x0020980000000000 ;64位代码段
;无效位填0
;D/B=0,L=1,AVL=0
;P=1,DPL=0,S=1
;T=1,C=0,R=0,A=0
d64_dsc:dq 0x0000920000000000 ;64位数据段
;无效位填0
;P=1,DPL=0,S=1
;T=0,C/E=0,R/W=1,A=0
eGdtLen equ $ - null_dsc ;GDT长度
eGdtPtr:dw eGdtLen - 1 ;GDT界限
dq ex64_GDT