程序4-4 代码功能
lidt IDT_POINTER(%rip)
...
setup_IDT: // ignore_int(%rip) = 0x1111 2222 3333 4444
#首先ignore_int中断服务程序的偏移地址(OFFSET)就可以使用lea指令取出ignore_int标号的基地址
#这个基地址要被拆分成第0-15位和第48-63位,分别放在EAX和EDX寄存器中
#然後在將EAX的值加載到中斷描述符的低位,將EDX的值加載到中斷描述符的高位。
leaq ignore_int(%rip), %rdx ;假如 ignore_int 函数 的地址为 %rdx = 0x2222 3333 4444 5555
movq $(0x08 << 16), %rax ; 段选择子 %rax = 0x0000 0000 0008 0000 = 0b 0000 0000 0000 1000 位数: 0-1 RPL 请求特权级 1-2 TI 指示目标段描述符所在描述符表类型 3-15 用于索引目标段描述符 2 #段选择符,我们要选用代码段的段选择符,所以我们使用0008h号GDT段选择符。
movw %dx, %ax ; 段内偏移 15:00 %ax = ignore_int 函数的低16位 %ax = 0x5555 %rax = 0x0000 0000 0008 5555
movq $(0x8E00 << 32), %rcx ; %rcx = 0x0000 8E00 0000 0000 = 0b0000 0000 0000 0000 1000 1110 0000 0000 32-34 IST ( Interrupt Stack Table,中断枝表)是IA-32e模式为任务状态段引人的新型战指针,其功能与 RSP相同,只不过IST切换中断棋指针时不会考虑特权级切换。 35-39:0 40-43:Type 第40-43位为段描述符类型标志(TYPE),我们设置的是1110.即将此段描述符标记为“386中断门”。 44-44:0 45-46:DPL 描述符特权级 47-48:P 指定调用门描述符是否有效
addq %rcx, %rax ; %rax = 0x0000 8E00 0008 5555 %rcx = 0x0000 8E00 0000 0000
movl %edx, %ecx ; %ecx = ignore_int 函数的低32位 0x4444 5555 %rcx = 0x0000 8E00 4444 5555
shrl $16, %ecx ; %ecx = 0x0000 4444 %rcx = 0x0000 8E00 0000 4444
shlq $48, %rcx ; %rcx = 4444 0000 0000 0000
addq %rcx, %rax ; %rax = 0x4444 8E00 0008 5555
shrq $32, %rdx ; %rdx = 0x0000 0000 2222 3333
leaq IDT_Table(%rip), %rdi ;
mov $256, %rcx
rp_sidt:
movq %rax, (%