特权级之间的转换

来源:互联网 发布:美工刀削水果 编辑:程序博客网 时间:2024/04/27 16:27

特权级之间的转换包括代码段之间的转换和数据段之间的转换。对于数据段之间的转换,只检查选择子中RPL和段中DPL的值,如果RPL<=DPL则可以转换,而对于代码段之间的转换,情况会稍微复杂。

代码段之间特权级的转换主要通过jmp和call指令实现,jmp和call的操作数可以直接是选择子,但注意在用call时,要记得ret。call的操作数还可以是一个调用门或者是一个包含选择子的TSS或者是一个包含TSS的任务门。对于门,其实质就是描述符,与代码段和数据段描述符不同,它是系统描述符,所以其s=0。暂时接触到的门共有四种:调用门、中断门、陷阱门和任务门。调用门只能放在GDT或LDT中,不能在IDT中,中断门和陷阱门则只能放在IDT中,而任务门既可以放在GDT中也可以放在LDT和IDT中。

这次碰到的问题有:

1.GDT中第四项(代码中为调用门)的索引为0x18,开始写为0x10了~

2.ret时,会检查被调用者的cs,eip等值,所以如果没有保存的话,系统会崩溃

[cpp] view plain copy
  1. org 0x7c00  
  2.     mov ax,cs  
  3.     mov ds,ax  
  4.     ;initgdt  
  5.     xor eax,eax  
  6.     mov ax,cs  
  7.     shl eax,4  
  8.     add eax,display  
  9.     mov word [gdt+10],ax  
  10.     shr eax,16  
  11.     mov byte [gdt+12],al  
  12.     mov byte [gdt+15],ah  
  13.     lgdt [gdt_addr]  
  14.     cli  
  15.     ;a20  
  16.     in al,0x92  
  17.     or al,00000010b  
  18.     out 0x92,al  
  19.     ;cr0 开CR0!  
  20.     mov eax,cr0  
  21.     or eax,0x1  
  22.     mov cr0,eax  
  23.       
  24.     ;jmp dword codeselector:0  
  25.     call gateselector:0  
  26.     jmp $;死循环 否则没有代码执行系统会崩溃  
  27. gdt:  
  28.     dw 0,0,0,0  
  29.       
  30.     dw 0x07ff  
  31.     dw 0x0000  
  32.     dw 0x9a00  
  33.     dw 0x00cf  
  34.       
  35.     dw 0x07ff  
  36.     dw 0x8000  
  37.     dw 0x920B  
  38.     dw 0x00cf  
  39.     ;gate 调用门可以放在GDT或LDT中 但不能放在IDT中  
  40.     dw 0x0000  
  41.     dw 0x0008  
  42.     dw 0xec00  
  43.     dw 0x0000  
  44. ;选择子  
  45. codeselector: equ 0x08  
  46. videoselector: equ 0x10  
  47. gateselector: equ 0x18;第四项为0x18!!!  
  48. ;GDT地址  
  49. gdt_addr:  
  50.     dw 0x07ff  
  51.     dw gdt,0  
  52.       
  53. ;Gate  
  54. ;gate:  
  55.   
  56. [BITS 32]  
  57. display:  
  58.     mov ax,videoselector  
  59.     mov gs,ax  
  60.     mov edi,(80*0+0)*2  
  61.     mov ah,0x0c  
  62.     mov al,'A'  
  63.     mov [gs:edi],ax  
  64.     jmp $;retf出问题 没保存堆栈?  
  65. times 510-($-$) db 0  
  66. dw 0xaa55  
 
0 0
原创粉丝点击