1.内核与应用程序之间的调用
这篇谈论的主要是8086的几个简单的门,分别为中断门,调用门,任务门等。
中断门,故是保护模式下的中断关系,主要是设置中断向量与加载向量地址。这样就能在保护模式下复位中断程序。
中断门有两个重要的内容,一个是idtr,一个是idt表项。
idtr如下图:
idtr寄存器内容
从这里可以看到,idtr寄存器内容是48位的,低16位表示的idt的限长,也就是中断描述符表的长度(len-1,因为从0开始的),高32位表示idt的基地址
另外一项就是idt的内容了,如下图所示:
idt格式中断门就要举一个例子了。入口点其实就是表示函数,段选择符一般是代码段,然后就是TYPE=1110b(14=e),所以可以假设一个描述符=0x00008e00 0008(代码段) fun(函数地址0xxxxx)
接着讲解一下调用门,调用门与中断门有一点区别是eflags的if标志,另外就是描述符中的TYPE字段需要修改为TYPE=15.调用门描述符如下:
调用门调用门一般使用int 0x80进入,当然是自己写的操作系统,则可以自定义。
任务门,则比较特殊,基本的寄存器和ldt与gdt类似,不过一般不使用它,我就不写了。
对应的,可以使用另外一种描述符方式,将其描述符放在gdt描述符中,它是属于系统段的。
这里面会涉及到TR,TSS等内容。
系统段描述符对应图如下:
系统段TYPE字段对应含义如下:
系统段tss包含的内容如下:
tss段包含的内容
tss描述符如下:
tss描述符另外要留意一下段描述符:
段描述符
另外则是局部描述符表与全局描述符表:
全局描述符表与局部描述符表之间关系还有一个很重要的点是特权级发生变化前后的寄存器内容处理:
内核堆栈变化前后
网友评论