首页 > 编程知识 正文

ie 内核(内核版本)

时间:2023-05-05 00:34:34 阅读:97574 作者:2920

前言

% 20% E6 % 9C % AC % E7 % AF % 87% E6 % 96% 87% E7 % AB % A0 % E6 % 8E % A5 % E7 % 9D % 80% E5 % 86% 85% E6 % A0 % B8 % E4 % B8 % AD % E6 % 96% AD % EF % BC % 881% EF % BC % 89% E6 % 9D % A5 % E8 % BF % 9B % E8 % A1 %

r_code

0x02:分析

该文件主要是定义了CPU异常产生的中断函数的调用。

分成2类:

带返回错误码的中断调用不带返回错误码的中断调用

将所有的寄存器值入栈

SS:存放栈顶的段地址SP:存放栈顶的偏移地址

一个栈也就是一块内存区域,我们必须要有基地址(也就是段地址左移4位)和偏移地址。

要在一个栈中寻址的话,也需要段地址和偏移地址。

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

CS:代码段寄存器IP:指令段寄存器

CS:IP 指向可执行程序的起始地址

此后CPU从这个起始地址开始读取内存中的指令,并且执行。

CS:IP指向

你想让 CPU 执行哪行指令,你就让 CS:IP 指向保存有指令的那块内存即可。任何时候,CS:IP 指向的地址中的内容都是 CPU 当前执行的指令。

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

前四步:

===================================================

xchgl %eax,(%esp)

将eax的值保存在栈上,将中断处理函数的地址保存在eax寄存器中

xchg 交换eax 和esp的值

ESP 专门用作堆栈指针,被形象地称为栈顶指针

EAX是累加器,AX是算术的主要寄存器

asm.s包含着CPU探测到故障异常的底层代码程序,与traps.c关系密切,调用traps.c的程序打印出错信息,并退出。

对于不带出错号的中断过程,堆栈指针位置变化情况请参照图(a)。

在开始执行相应中断服务程序之前,堆栈指针esp指在中断返回地址一栏(图中 esp0处)。

当把将要调用的C函数do_ _divide_ error()或其他C函数地址入栈后,指针位置是esp1处,此时程序使用交换指令把该函数的地址放入eax寄存器中,而原来eax的值则被保存到堆栈上。

此后程序在把一些寄存器入栈后,堆栈指针位置处于esp2处。

当正式调用do_ divide_ error()之前, 程序会将开始执行中断程序时的原eip 保存位置(即堆栈指针esp0值)压入堆栈,放到esp3位置处,并在中断返回弹出入栈的寄存器之前指针通过加上8又回到esp2处。

对于CPU会产生错误号的中断过程,堆栈指针位置变化情况请参照图(b)。

在刚开始执行中断服务程序之前,堆栈指针指向图中esp0处。

在把将要调用的C函数do_ double_ fault()或其 他C函数地址入栈后,栈指针位置是esp1处。

此时程序通过使用两个交换指令分别把eax、ebx寄存器的值保存在esp0、esp1位置处,而把出错号交换到eax寄存器中:函数地址交换到了ebx寄存器中。随后的处理过程则和无错误号一样。

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

一般寄存器:AX、BX、CX、DX

AX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器

索引暂存器:SI、DI

SI:来源索引暂存器,DI:目的索引暂存器

堆叠、基底暂存器:SP、BP

SP:堆叠指标暂存器,BP:基底指标暂存器

cs是代码段寄存器

ds是数据段寄存器

ss是堆栈段寄存器

es是扩展段寄存器

fs是标志段寄存器

gs是全局段寄存器

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

把这些寄存器入栈保护

pushl %ebx

pushl %ecx

pushl %edx

pushl %edi

pushl %esi

pushl %ebp

push %ds

push %es

push %fs

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

无错误号的代码:

核心代码:xchg1 %eax,(%esp) 交换ax和sp push $0 0作为错误号压栈 lea 44(%esp), %edx 把中断的地方压栈 call *%eax 调用中断打印函数 add1 $8 %esp 函数的参数出栈

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

有错误号的代码:

error_code:

0x03:小结

此篇文章主要讲解了中断的工作原理,下篇文章我们一起来看8086 PC机的8259A中断原理。

关于摘星实验室:

摘星实验室是星云博创旗下专职负责技术研究的安全实验室,成立于2020年5月,团队核心成员均具备多年安全研究从业经验。实验室主要致力于攻防技术人员培养、攻防技术研究、安全领域前瞻性技术研究,为公司产品研发、安全项目及客户服务提供强有力的支撑。在技术研究方面,摘星实验室主攻漏洞挖掘及新型攻击,并将重点关注攻击溯源与黑客行为分析;与此同时,实验室还将持续关注对工业互联网领域的技术研究。

实验室成立以来,已通过CNVD/CNNVD累计发布安全漏洞300余个,是CNVD和CNNVD的漏洞挖掘支撑单位,在安全漏洞预警、事件通报处置等方面均得到了行业权威机构的认可。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。