免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2894 | 回复: 9
打印 上一主题 下一主题

关于中断里面的CPL和DPL [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-11 10:21 |只看该作者 |倒序浏览
看ULK3,里面说CPU控制单元在验证中断源的时候,会对比cs里面的CPL和GDT里面的DPL,如果CPL的值低于DPL的值,也就是CPL优先级高于DPL的时候,那么就会产生通用保护异常。
  在这里CPL是当前运行代码的优先级,但是这个DPL是GDT里面的哪个描述符所指示的DPL呢?这里我不是十分清楚。

论坛徽章:
0
2 [报告]
发表于 2009-06-11 10:37 |只看该作者
我在怀疑是不是说错了,应该是IDT里面对应的中断的DPL而不是GDT里面某个描述符的DPL,这是我的猜想。伟大的ULK3怎么会错,呵呵。

论坛徽章:
0
3 [报告]
发表于 2009-06-11 11:50 |只看该作者
IDT中保存的是一个48位全指针,包含段选择子和段内偏移
这个选择子从GDT中找到段描述符,这里的DPL就是指这个段描述符的DPL

论坛徽章:
0
4 [报告]
发表于 2009-06-11 12:00 |只看该作者
我看IDT里面不是保存的是8个字节的描述符么?里面应该是中断的handler吧?

论坛徽章:
0
5 [报告]
发表于 2009-06-11 12:35 |只看该作者
lz再好好看一下IDT的结构以及查找中断处理程序入口地址的过程
不要看到IDT和GDT名字差不多就想当然认为它们保存的内容一样

论坛徽章:
0
6 [报告]
发表于 2009-06-11 13:43 |只看该作者
鼓励认真钻研的精神

论坛徽章:
0
7 [报告]
发表于 2009-06-11 14:21 |只看该作者
我参考了一下2.6.11的源代码
void set_intr_gate(unsigned int n, void *addr)
{
        _set_gate(idt_table+n,14,0,addr,__KERNEL_CS);
}
这个函数应该是在IDT表的第n个入口描述符里面写入中断处理程序的handler地址信息addr的吧?

论坛徽章:
0
8 [报告]
发表于 2009-06-11 14:25 |只看该作者
peimichael,你所说的48位的数据是不是idt_descr?这个是一个指示IDT的地址和它的大小的一个变量吧?我的理解有没有什么问题?

论坛徽章:
0
9 [报告]
发表于 2009-06-11 15:40 |只看该作者
可能我说的不清楚
IDT表项是64位的,这64位里面包含了一些属性信息和一个48位的指针,48位的指针中16位是一个段选择子,另外32位是段内偏移,系统会用这16位的段选择子在GDT中找到对应的段,然后把段首地址跟IDT中的32位偏移相加就得到了中断处理函数的入口地址。ULK3中所说的GDT的DPL就是用那16位段选择子在GDT中找到的段描述符的DPL

论坛徽章:
0
10 [报告]
发表于 2009-06-11 16:53 |只看该作者
peimichael,你这样一说我豁然开朗!也就是说IDT表项里面的这个段选择子标识着这个中断服务程序的运行级别,用这个级别来对比当前cs中的运行级别。
谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP