首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

中断和普通函数调用发生的堆栈操作为什么不同?该如何处理

2012-03-14 
中断和普通函数调用发生的堆栈操作为什么不同?小弟,一直有一个问题,没有弄的很透彻,就是中断发生的时候,在

中断和普通函数调用发生的堆栈操作为什么不同?
小弟,一直有一个问题,没有弄的很透彻,就是中断发生的时候,在中断的服务子程序会强制要求用户写的程序进行所有的通用寄存器的压栈保存,好像是pushA这条指令,而在普通的函数调用,则不是这样对堆栈进行操作的,通常的情况是在函数调用的时候,只要将部分的通用寄存器压栈保存,就是那些在别调用的函数中用到的寄存器才有相应的寄存器的压栈保存。
        我的问题,
        1.   到底是基于什么原因,中断和普通函数的对通用寄存器的压栈保存不一样?为什么?
        请教了!真的不明白呀!

[解决办法]
中断是产生时,会先进入内核,有内核部分检查到中断的产生,并根据设置来决定是否相应中断
,如果你允许相应中断,则内核会先把你当前函数的上下文如栈,注意,这里是有内核来为你的当前环境入的栈。接着会为你的中断相应程序入栈,这时才从内核空间返回到用户空间,开始执行中断相应程序。处理完以后,回返回到内核空间,有内核空间来把中断时的上下文恢复出来。
这些处理都在内核空间来完成的。而普通的函数调用,上下文的入栈,函数执行,上下文的恢复,都是在用户空间内完成的。

实际上在了linuxde
[解决办法]
实际上,在linux内核的开发过程中,有段时间内是把中断相应程序的处理都放在了用户空间,
但后来发现这样的话,用户就能通过中断来提高本进程的执行时间,因为中断相应过程中,进程是不参加进程调度的。这样内核在这个过程中就失去了对用户进程的控制。
[解决办法]
中断是一种硬件机制,用于通知CPU有个异步事件发生了.中断一旦被识别,CPU保存部分(或全部)现场(Context)即部分或全部寄存器的值,然后跳转到ISR.
这得看具体的环境的.
并不是所有情况都一样的.
具体参见对应的cpu手册以及操作系统任务切换的实现~

[解决办法]
用户态 和 内核态

你的编译器只作了用户态的进程代码段.text的安排,当然知道怎么安排那些寄存器了,中断要进入内核态,内核态要用到那些寄存器你的编译器不知道,特别是eax(x86)要保存中断向量号的。在用户态只要保证ebp, esp保持一致就可以了,参数也是靠压栈的,返回值放在eax或者什么的,这是固定的,所以父子函数调用之间是一致的,没有必要清理寄存器。

一句话:编译器保证自己知道用到的那些寄存器的安全一致。你想内核比你早编译完,你知道它里面用到那些寄存器?

[解决办法]
要看中断的作用了,如果不带操作系统,可以不用保存那么多.
如果带操作系统,会涉及到进程切换的话,需要保存进程上下文,就要那些寄存器都要保存了,函数是属于一个进程的,不用保存那么多;

热点排行