32位的地址,如果没开启分页,指的是当前段所在的物理地址,否则是分页前的虚拟地址
G(Granurality)值为1表示段界限以4K为单位,否则以字节为单位
段界限描述段的大小size-1,单位由G决定。
D/B表示64位,32位下置0
AVL留给操作系统自己使用的,意义自定义
P1表示当前段有效,0表示当前段无效
DPL(descriptor priority level)表示当前段的优先级
S1表示数据段或代码段,0表示系统段
type 数据段使用指令lgdt m48
,m48为内存地址,在16位下为16位,32位下为32位,其地址里面存有如下数据4字节addr|2字节size
,size是GDT的大小减去1,addr为GDT所在的内存地址。
由于小端序有点违反直觉,要注意一下
段选择子
16位的段选择指,高13位表示该段在GDT表中是第一个段描述符,共有
2
13
−
1
2^{13}-1
213−1个有效的段描述符,开始的第一个是NULL空描述符。
表示是从全局描述符表找,还是从局部描述符表找
RPL与DPL相关,请求特权级,暂时为0
本代码用到的4个有效段描述符DPL=0,G=0,S=1,D=1,P=1
times 8 db 0
dd 0x7c0001ff,0x00409800
dd 0x8000ffff,0x0040920b
dd 0x00007a00,0x00409600
[bits 16]
mov ax,cs
mov ss,ax
mov sp,0x7c00
mov dword [cs:gdt+0x7c02],gdt+0x7c06
lgdt [cs:gdt+0x7c00]
in al,0x92 ;南桥芯片内的端口
or al,0000_0010B
out 0x92,al ;打开A20
cli
mov eax,cr0
or eax,1
mov cr0,eax ;设置PE位
jmp dword 0x0008:flush
[bits 32]
flush:
mov cx,0x10 ;加载数据段选择子(0x10)
mov ds,cx
mov byte [0x00],'P'
mov byte [0x02],'r'
mov byte [0x04],'o'
mov byte [0x06],'t'
mov byte [0x08],'e'
mov byte [0x0a],'c'
mov byte [0x0c],'t'
mov byte [0x0e],' '
mov byte [0x10],'m'
mov byte [0x12],'o'
mov byte [0x14],'d'
mov byte [0x16],'e'
mov byte [0x18],' '
mov byte [0x1a],'O'
mov byte [0x1c],'K'
mov cx,0x18 ;加载堆栈段选择子
mov ss,cx
mov esp,0x7c00
mov ebp,esp ;保存堆栈指针
push byte '.' ;压入立即数(字节)
sub ebp,4
cmp ebp,esp ;判断压入立即数时,ESP是否减4
jnz loop
pop eax
mov [0x1e],al ;显示句点
loop:
jmp loop
gdt:
dw 31
dd 0
times 8 db 0
dd 0x7c0001ff,0x00409800
dd 0x8000ffff,0x0040920b
dd 0x00007a00,0x00409600
times 510-($-$$) db 0
db 0x55,0xaa
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧