免费注册 查看新帖 |

Chinaunix

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

int 80 和中断的一点疑问. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-08 10:40 |只看该作者 |倒序浏览
既然有任务门,那么其本身的设计就是为了用int 指令实现任务切换,注意这里是任务切换,不是进程切换,当然进程切换也可以任务切换的一种.
是这样吗?

int 80 进去程序后,是不关中断的,这时候能被外部中断打断,那么inet能做 任务门的返回,也能做中断门的返回,那处理器必须支持这种嵌套执行?是不是一开始就在处理器里面放置的中断进入的记录?是否存在嵌套深度?

论坛徽章:
0
2 [报告]
发表于 2009-11-08 11:01 |只看该作者
我想答案是 成立的,只要在处理器里简单实现一个栈来保存 号 即可.而这恰恰是不能嵌套同一种中断的原因,因为一个号只对应一个可返回的现场.

论坛徽章:
0
3 [报告]
发表于 2009-11-09 17:22 |只看该作者

回复 #1 epegasus 的帖子

好像linux不用任务门吧。

int不关中断,外部中断是在eflags中关中断的,嵌套是存在的。内核使用锁lock来禁止特殊程序块的嵌套,就是每次只能有一个进程进入,还有一种软中断(此时中断打开)来尽量缩短中断关闭的时间并一次处理多次中断剩下的的并不紧迫的部分。

论坛徽章:
0
4 [报告]
发表于 2009-11-10 19:15 |只看该作者

回复 #3 zhiguo9503 的帖子

恩,确实不用任务门切换进程.
不过对于第一点,我错误的认为int 指令对应的80是任务门,因为 确实使用的是个TSS.

那80对应的其实是一个陷阱门, 那么问题就来了,首先陷阱门使用了一个任务状态段.
已知IDT中有4种门,那他们的触发源可能是外部中断, int 指令,内部异常,
而情景分析中有句话,中断门和陷阱门的区别仅仅在于处理器穿越他们的行为,而不是触发源,那么
门和出发源是否可以有任意的匹配规则.

而门中多半有段选择符,至于怎么用这些选择符是处理器的行为,也就是处理器能识别门,那拿到选择符号后处理器还有必要识别是什么样的段吗?比如不同的段选择符有不同的type.
而int 80是使用陷阱门匹配的TSS.是否也能匹配其他的段呢?

论坛徽章:
0
5 [报告]
发表于 2009-11-11 00:26 |只看该作者
1. int 80 是中断.或者叫软中断.而不是异常.
2. 我觉得如果是低级的中断在执行的时候,发生了一个高级中断,同时中断没有被禁止. 那么低级的应该被打断,而去执行高级的中断.
如果是同一级的中断,一般在中断处理函数里都先把自己的中断关掉.因为开着也没意义.
3. 我觉得在发生了中断,跳转到中断服务程序之前,系统 (OS OR CPU) 总会保存一些当前的信息.这样,当你从ISR里调用IRET返回的时候,就可以返回到上一次的地方. 而不是任意的地方.
4. 可以看看这篇文章的 1,2,3
http://www.phrack.org/issues.html?issue=59&id=4&mode=txt

以上全部是个人意见. 也许有不对的地方.

论坛徽章:
0
6 [报告]
发表于 2009-11-11 18:46 |只看该作者

回复 #5 accessory 的帖子

我发现要搞清楚进程和中断这部分的原子性,必须把处理器的行为的搞的很清楚才行,一个动作,哪些是处理做的,哪些程序做的.
>> 一般在中断处理函数里都先把自己的中断关掉.因为开着也没意义.
这里说的开着没意义,我们查看中断执行的每一个细节可以发现,是外部中断产生的情况下,如果IDT是一个中断门,或者是int 指令穿越了一个中断门(是否存在?),则中断标志是处理器自动关闭了,同级这样可以防止同级嵌套,我们假设中断现场由处理器自动保存而不是用指令保存,那么同级嵌套导致前一个中断现场丢失.

当你从ISR里调用IRET返回的时候,就可以返回到上一次的地方,
这个不确切,比如我上面提到的.中断能嵌套在系统调用内 而都用inet返回, 那你一个inet到底是中断的返回还是系统调用的返回,这个问题很大,我觉得一定处理器有个栈做记录了,那么就能正常的嵌套了,还有个值得注意的地方:inet返回的动作是大的,相当于几条汇编指令,那么从哪里返回?现场如果是记录在处理器里,自然不错,不过我怀疑仍然是记录在内存中,而返回也是再次通过idt表对应的中断门找相关信息.

论坛徽章:
0
7 [报告]
发表于 2009-11-11 22:35 |只看该作者
原帖由 epegasus 于 2009-11-11 18:46 发表
我发现要搞清楚进程和中断这部分的原子性,必须把处理器的行为的搞的很清楚才行,一个动作,哪些是处理做的,哪些程序做的.
>> 一般在中断处理函数里都先把自己的中断关掉.因为开着也没意义.
这里说的开着没意义, ...

你越说越混乱,建议你先把自已思路理清


你是将中断调用的几种形式搞混乱了


1、 使用 interrupt gate 进行调用 interrupt services routine 的情况下, processor 是要进行关中断处理的,换句话说:在 interrupt serrices routine 里是不会允许另一个 MMI 发生。直到 iret 指令执行完后。

      但是,使用 trap gate 进行调用 interrupt services routine 情况下,processor 是不会关中断的。



2、使用 task gate 进行调用 interrupt services routine 是允许中断的嵌套的,换句话:processor 不会关中断。


流程大概如下:

(1)int XX(task gate)使用 task gate 进行中断
(2)processor 将 TSS descriptor 置为 busy
(3)进入 interrup services routine 进行中断处理
(4)在 ISR 里又使用 int XX(task gate)调用另一个 interrupt services routine
(5)进入新的 interrupt services routine(processor 将旧的信息保存在 current-TSS segment)
       其中 link 被置为 old TSS selector(用于嵌套返回),processor 置当前的 eflags.NT = 1(说明目前处于嵌套中)
(6)执行 iret 返回时,processor 将检查 eflags.NT 是否为 1
       假如 eflags.NT == 1,processor 从 TSS segment 里取出 old-TSS selector 进行嵌套返回
       同时清 eflags.NT = 0
(7)返回原来的 interrupt services routine,执行 iret 返回时,同样检查 eflags.NT 是否为 1
       原来的 eflags.NT 并不为 1,直接从 stack 里取返回地址返回被中断的程序

---------------------------------------------------------------

估计,你就是将 task gate 与 interrupt gate / trap gate 搞混乱了


BTW:现在没有 OS 会使用 task gate 进行中断调用了,在 x64 体系里已经被废除了。

论坛徽章:
0
8 [报告]
发表于 2009-11-12 11:11 |只看该作者

回复 #7 mik 的帖子

我还没有搞清楚细节,所以混乱.

我的困惑大概用以下几个举例的疑问表达:

1,能否用int 指令让CPU跳到一个中断门处理?

2,int 80的IDT里面的段选择符号是否可以指向任意一个数据段选择符?假设不用任务门切换任务,那能不能指向一个TSS段

3, 处理器在穿越中断门和陷阱门的时候是否,在执行IDT对应的程序里的第一条汇编指令前保存了寄存器现场吗?如果保存了那是在处理器还是在内存?如果是在内存,如何保存?

4,假如如上所述:
1、 使用 interrupt gate 进行调用 interrupt services routine 的情况下, processor 是要进行关中断处理的,换句话说:在 interrupt serrices routine 里是不会允许另一个 MMI 发生。直到 iret 指令执行完后。
------
我们假设处理器这个时候应付的是一个中断门.  
我们定义interrupt serrices routine 是指令代码,而不是int指令完成的动作,或者中断出发CPU自动执行的动作,那么我门可以在中断处理程序中用软件指令开中断标志位,这个时候外部中断产生了会怎么办?处理器如何应付这种情况?

在int 进入一个陷阱门后,返回之前能用int 再触发另一个陷阱门吗?在中断门的程序里面能再用int 触发一个陷阱门吗?

[ 本帖最后由 epegasus 于 2009-11-12 11:17 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-11-12 21:28 |只看该作者
原帖由 epegasus 于 2009-11-12 11:11 发表
我还没有搞清楚细节,所以混乱.

我的困惑大概用以下几个举例的疑问表达:

1,能否用int 指令让CPU跳到一个中断门处理?

2,int 80的IDT里面的段选择符号是否可以指向任意一个数据段选择符?假设不用任务门切 ...


你连概念性的东西都没搞清楚!

IDT(Interrupt Descriptor Table)里放着的是 gate descriptor(可以放:interrupt gate descriptor、trap gate descriptor 以及 task gate descriptor)。

task gate descriptor 已经没有 OS 去使用,在 IDT 里大部分都放着 interrupt gate descriptor,而 trap gate descriptor 使用相当少。

interrupt/trap gate descriptor 里放着的是 code segment descriptor's  selector,它必须指向 code segment descriptor。而 task gate descriptor 里放的是 TSS descriptor's selector

-------------------------------------------------------------------------

所以,你的问题已经很清楚:

1、当然可以了,就是通过中断门进入 interrup services routine

2、不能,interrupt/trap gate descriptor 里放着的是 code segment descriptor selector,不能放 data segment selector,只有 task gate descriptor 才能放 TSS selector,不使用 task gate descriptor 是不能指向 TSS descriptor。

3、我不知道你说的“穿越”是什么意思,我没见过这个词的这种用法。什么叫“处理器在穿越中断门和陷阱门的时候”?

    在进入 interrup services routine 之前,processor 会做保存 ss & esp、eflags、cs & eip 仅止而已。
    并不会保存寄存器。 保存寄存器那是属于 interrup services routine 的职责。
    而 ss、esp、eflags、cs 以及 eip 是保存在 current stack(当前栈)里。

    关于 current stack:是指向 processor 会切换到 0 级的 stack(内核栈),这个 kernel stack 就变成 current stack



相信,我已经说得很清晰,明白了。

论坛徽章:
0
10 [报告]
发表于 2009-11-12 21:39 |只看该作者
原帖由 epegasus 于 2009-11-12 11:11 发表
我们假设处理器这个时候应付的是一个中断门.  
我们定义interrupt serrices routine 是指令代码,而不是int指令完成的动作,或者中断出发CPU自动执行的动作,那么我门可以在中断处理程序中用软件指令开中断标志位,这个时候外部中断产生了会怎么办?处理器如何应付这种情况?

在int 进入一个陷阱门后,返回之前能用int 再触发另一个陷阱门吗?在中断门的程序里面能再用int 触发一个陷阱门吗? ...


在 interrupt services routine 里当然可以使用 int 来调用 断

eflags.IF 只是对“可屏蔽中断”起作用。而对 int n 软件中断是不起作用的,还有就是对异常(exception)也不起作用

这些可屏蔽中断指的是:外部中断,例如,键盘,时钟,磁盘等。。。。



所以, 在 interrupt services routine 里可以使用 int n 来通过任何门(interrupt/trap,task)调用其它中断服务例程
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP