找回密码
 立即注册
搜索
热搜: 活动 通知
查看: 298|回复: 6

系统调用过程的问题

[复制链接]

37

主题

37

回帖

317

积分

至尊会员

积分
317

至尊会员

发表于 2024-6-27 10:34:06 来自手机 | 显示全部楼层 |阅读模式
各位老师,请教大家一些问题,最近在书上看到关于linux32位系统调用问题,
看的云里雾里……
linux下32位系统调用通过int 0x80和eax=系统调用编号的方式进行,处理器收到int 0x80中断后,会去找IDT表中0x80表项对应的中断描述符表项,此时我有一些疑问……

1、我们应用程序能通过int 0x80中断去访问0x80项中断描述符,是不是操作系统设计者刻意将idt中断描述符表项目的0x80项的DPL设置为3,让用户态可以进入?

2、从IDT表中取出对应选择子放入到CS代码段寄存器中,此时又要去GDT表中找对应代码段描述符然后执行具体系统调用过程,从IDT到GDT过程中当前特权级CPL是多少?GDT对应的那条描述符的DPL又是多少?

350

主题

279

回帖

2816

积分

管理员

积分
2816
发表于 2024-6-27 10:50:59 | 显示全部楼层
跟普通的中断处理过程区别不大。当你在3特权级执行时,发生了硬件中断,去处理中断,是怎么处理的,就怎么处理。

3

主题

33

回帖

381

积分

至尊会员

积分
381

至尊会员

发表于 2024-6-27 22:12:49 | 显示全部楼层
本帖最后由 cindeequan 于 2024-6-27 22:17 编辑

首先,中断有不同来源

CPU内部:Int指令触发(又叫软中断)   异常(CPU执行指令时候出现错误,比如缺页)
CPU外部(从外部引脚引入):NMI(不可屏蔽中断)  INTR(可屏蔽中断,从8259A引入)

上面这几个中断都可以通过中断号统一用IDT的表格来索引,找到相应的例程来处理,所以老师讲的硬件中断和Linux通过int 88触发软中断的处理过程基本一样
区别是int 88触发是不受eflags中IF位的限制,但是IF位可以屏蔽掉8259A通过INTR引入的中断信号

点评

还有一点是软中断不存在中断响应周期。  发表于 2024-6-27 23:14

3

主题

33

回帖

381

积分

至尊会员

积分
381

至尊会员

发表于 2024-6-27 22:28:56 | 显示全部楼层
再补充一下中断中特权级转移和变化
对于硬件中断(比如8259A引入的时钟中断),CPU只拿到了一个中断向量号,用来在IDT中定位相应的中断描述符(中断门),这里CPU只检查用户代码CPL和中断门指向的代码段DPL(通过门描述符中的目标代码段选择子确定)之间的关系,即CPL数值上>=DPL才能通过检查,因为CPU只允许通过门从低特权级向高特权级转移

对于Int 88软中断,除了上面说的检查外,会多一个检查,即在数值上CPL<=门描述自己的DPL,总结来说,在数值上,只有  目标代码(中断处理程序)DPL<=CPL<=门描述符DPL,才能通过特权级检查
这些建议看下老师提供的i386和intel手册,里面写的很清楚了

点评

这段对我太重要了,谢谢老师,干杯🍻  发表于 2024-6-28 10:07

3

主题

33

回帖

381

积分

至尊会员

积分
381

至尊会员

发表于 2024-6-28 10:18:45 | 显示全部楼层
cindeequan 发表于 2024-6-27 22:28
再补充一下中断中特权级转移和变化
对于硬件中断(比如8259A引入的时钟中断),CPU只拿到了一个中断向量号 ...

也可以看下郑刚写的《操作系统真象还原》,里面拆解的也挺细致的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|鼠侠网 ( 吉ICP备19001332号 )

GMT+8, 2024-9-8 09:12 , Processed in 0.268831 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表