linux-x86:中断处理程序循环
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux-x86:中断处理程序循环,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2466字,纯文字阅读大概需要4分钟。
内容图文
![linux-x86:中断处理程序循环](/upload/InfoBanner/zyjiaocheng/946/2c43bec60b4a43c28f256468df41e756.jpg)
我正在尝试通过IDT处理内核中断.
我在Linux下使用Intel x86.
我已经设置了IDT和中断条目,并启动了一些测试以查看中断处理程序.
当我尝试int $0x0时,它可以完美地工作:我的处理程序被调用,但是当我尝试某些异常并推送错误代码时,我进入了无限循环.
该架构如下:
当异常到达时,我的处理程序的第一部分在ASM中,并调用公共C部分.
my_handler.c
void handler(int i)
{
printf("Exception %d caught\n", i);
}
my_handlers
common:
pushal
pushl %ds
pushl %es
pushl %fs
pushl %gs
addl $48, %esp // 4 4-bytes segments pushed
// + 8 4-bytes registers (pushal)
` // esp points on exception code
call handler // call the C handler with exception code
subl $48, %esp
popl %gs
popl %fs
popl %es
popl %ds
popal
addl $8, %esp // 4-byte error code + 4-byte exception number
iret
exception_de_handler:
pushl $0 // Fake error code
pushl $0 // interrupt number
jmp common
exception_gp_handler:
// error code is pushed by μproc.
pushl $13 // interrupt number
jmp common
exception_pf_handler:
// error code is pushed by μproc.
pushl $14 // interrupt number
jmp common
如果我尝试运行以下代码:
int* a = 0x0;
*a = 42;
它起作用,* a = 42之后恢复执行;
但是,如果我尝试:
int* a = 0x0;
*a = 42;
*a = 1337;
它进入无限循环:
Exception 14 caught
Exception 13 caught
Exception 13 caught
Exception 13 caught
Exception 13 caught
.....
Exception 13 caught
Exception 13 caught
Exception 13 caught
.....
为什么先处理第一个异常Page Fault(14),然后在General Protection(13)上循环?
谢谢您的回答.
解决方法:
我认为您正在弄乱您的堆栈.您需要非常小心在中断处理程序中对堆栈进行的处理.在这种情况下,您似乎可以执行以下操作:
推送错误代码(可以由CPU完成)
推规
推送分段规则
将0x48添加到堆栈指针,以将堆栈完全回卷,使其指向错误代码.
调用您的C函数
这实际上是在“释放”段寄存器存储在其中的堆栈部分.实际上,您甚至根本不需要担心C函数,因为返回地址在C处被压入堆栈.呼叫说明,甚至在进行C呼叫之前就吹掉ds和es的记录.当您从C调用中恢复时,您尝试整理一下调用堆栈,但并不能完全正确-部分原因是您已经弄乱了它,部分原因是您未在调用之后清理堆栈.函数调用(假设处理程序使用_cdecl调用约定).
这使您弹出ds的虚假值.当您将其加载到ds中时,CPU会根据GDT检查该值,并发现该值无效.此时,它会引起您正在关注的GPF(异常13).在某种程度上,那可以恢复堆栈(CPU正在为您照顾SS)并保留ds的旧值-因此您永远不会真正更改ds,从而可以再次运行printf.
您需要更加仔细地对齐堆栈,并且每当您添加堆栈指针时,都需要考虑该范围内的数据永远消失了,因为下一个家伙或可能是意外中断会会让你绊倒.
内容总结
以上是互联网集市为您收集整理的linux-x86:中断处理程序循环全部内容,希望文章能够帮你解决linux-x86:中断处理程序循环所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。