IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 通过GDK7观察神秘的IDT -> 正文阅读

[嵌入式]通过GDK7观察神秘的IDT

1.中断描述符表概述

?

????????中断应该是一个覆盖范围较广的概念,在很多时候我们都会需要“中断”,比如当你用水壶烧水时,你并不需要一直盯着它,可以抽身去做一些别的的事情,当水壶完成烧水的任务,他可能会发出“嘟嘟嘟”的声音来告诉你水烧好了,因此你既完成了一些别的事情,同时又有了热水喝;在计算机中,中断也是如此,CPU的时间较为宝贵,并不可能所有的事情都亲历亲为,也不可能非要盯着一件事情,等这件事情结束后再去做下一件事情,因此CPU会通过下达任务的方式给其他执行单元,在执行单元做任务的过程中,CPU可以抽身去做其他的事情,当该执行单元完成任务后,通知CPU即可,这样任务也完成了,CPU也可以利用宝贵的时间去做其他的事情。

????????在计算机中,中断机制可以让CPU随时被打断,然后去出来其他事情,当事情处理好后再回来做原来的事情;中断通常可以分为内部中断(异常)和外部中断(硬件中断)。

《在调试器下理解计算机系统》课程截屏

????????上面只是关于中断及中断机制的一些较为浅显的解释,中断实际上是操作系统中较为重要的一种概念及机制,关于中断的一些详细的说明可以在由张银奎老师主讲的《在调试器下理解计算系统》中观看到(视频在nano code中;nano code下载链接:Nano Code)。

《在调试器下理解计算机系统》课程截屏

?????? 在上面的截屏中我们可以看到CPU在当前操作系统三大机制(中断、陷阱、任务)之下,CPU所发生的旅途轨迹。

????????当CPU可以被中断后,又出现了另一个问题,即CPU应该去哪里执行事情呢,总要有个目标吧,而且这个目标应该非常精确才行,不然差之毫厘,CPU就去处理其他的事情了;因此我们就非常的需要IDT中断描述符表了,IDT中断描述符表内存储了中断的相关信息,当CPU被中断后,CPU会获取中断向量,然后查阅这张表,找到对应的中断信息,然后根据中断信息跳去相应的位置处理事情。

????????IVT中断向量表可以理解为“迷你版”的IDT中断描述符表,里面存储的中断向量是中断服务程序的入口地址;该入口地址由IDT中断描述符表内的segmen字段和offset_low字段组合形成的(段地址+低16位偏移地址)。

2.使用GDK7观察IDT

?????? 使用GDK7观察IDT,那么我们首先要GDK7与我们的调试机建立连接!如下所示。关于如何使用GDK7与调试机建立连接的过程,可以在下方文章中见到,不再过多赘述。

CSDNhttps://mp.csdn.net/mp_blog/creation/editor/118387446? ? ?

????????打开nano code,载入ndx扩展,并输出!idt扩展命令。

????????执行完成后输出以下结果。

?????? 从执行的结果中。我们可以看到,第一列是向量号,第二列是门描述符,第三列是函数地址,第四列是函数名。

中断向量号??? 异常事件???????????????????? 函数名

0?????????????????? 除法错误???????????????????? Divide_error

1?????????????????? 调试异常???????????????????? Debug

2?????????????????? 非屏蔽中断????????????????? Nmi

3?????????????????? 断点中断???????????????????? Int 3

4?????????????????? 溢出中断???????????????????? Overflow

5?????????????????? 边界监测中断????????????? Bounds

6?????????????????? 无效操作码????????????????? Invalid_op

7?????????????????? 设备不可用????????????????? Device_not_available

8?????????????????? 双重故障???????????????????? Double_fault

9?????????????????? 协处理器段溢出?????????? Coprocessor_segment_overrun

10????????????????? 无效??????????????????????????? TSS? Incalid_tss

11????????????????? 缺段中断???????????????????? Segment_not_present

12????????????????? 堆栈异常???????????????????? Stack_segment

13????????????????? 一般保护异常????????????? General_protection

14????????????????? 页异常???????????????????????? Page_fault

15??? ??????????? intel保留???????????????????? Spurious_interrupt_bug

16????????????????? 协处理器出错????????????? Coprocessor_error

17????????????????? 对齐检查中断????????????? Alignment_check

18????????????????? 机器检查中断????????????? Machine_check

19????????????????? 不可屏蔽中断????????????? Simd_coprocessoe_error

3.!idt的实现原理

????????idt_table在Linux中被定义成了一个数组,每个数组所指向的均是gate_struct结构体,因此显示数组信息亦相当于显示gate_struct结构体的信息,只不过因为地址的不同,gate_struct结构体所含有的信息也会有所差别;想要从idt_table内获取对应的元素的信息应该先从idt_table全局变量中获取idt_table的基地址,然后获取gate_struct结构体的偏移值,根据偏移值来显示不同是数组信息。

?????? 当获取到基地址以后,应该根据此地址从gate_struct结构体内获取信息,我们要输出的信息有中断向量号、门描述符、函数地址、函数名;中断向量号只需要顺序向下排即可,门描述符则可以在idt_bits结构体内找到,函数地址由gate_struct结构体内的offset_low字段、offset_middle字段及offset_high字段组合而成,可以在Linux中通过[cat /proc/kallsyms | grep 函数名]来确认获取的函数地址是否正确,函数名则可以根据函数地址获取。

?????? 做循环,不断在基地址的基础上累加偏移地址,从而得到下一个数组元素所对应的地址,然后再利用此地址显示gate_struct结构体的信息,直至完部完成显示。

????????获取函数名示例:GetSymbol(函数地址[传入], 函数名[接受], 偏移值[接受]);

????????关于偏移值的说明:偏移值 = 函数实际地址 – 传入函数地址;因为即使传入一个不准确的地址,GetSymbol也会根据这个地址定位到附近的符号,从而获取函数名;如果你输入的是一个准确的函数地址,那么偏移值就会等于0。

4.中断处理全局变量的获取

????????假如想要获取中断处理有关的全局变量(apic_idts、def_idts、early_idts、ist_idts、dbg_idts)的相关信息,那么我们首先知道这些全局变量在Linux内核中也被定义成了数组的形式,其数组所对应的均为idt_data结构体;因此想要显示中断处理有关全局变量的信息,也就是显示数组元素对应地址的idt_data结构体信息。

????????首先我么需要两个函数,一个显示idt_data结构体的信息,另一个做循环,接受全局变量名,并获取数组地址及数组个数,利用数组个数循环显示数组的不同元素的信息,当然是要传递地址给显示结构体的函数的。

static const __initconst struct idt_data apic_idts[]

static const __initconst struct idt_data def_idts[]

static const __initconst struct idt_data ist_idts[]

static const __initconst struct idt_data dbg_idts[]

struct idt_data {

????????unsigned int?? vector;

????????unsigned int?? segment;

????????struct idt_bits bits;

????????const void????? *addr;

};

5.!idt扩展命令的介绍

????????!idt扩展命令用于在Linux调试的时候,显示IDT中断描述符表内的相关信息。

????????!idt扩展命令格式:!idt [IDT的地址] [显示选项]

????????IDT的地址说明:

可以选择是否指定地址,若没有指定地址则地址会从Linux内核中的idt_table全局变量内获取IDT的基地址。

????????显示选项的含义:

-a:显示Idt表内全部的256个表项的相关信息。

-?:显示命令选项的说明。

空::没有指定显示选项,则只显示大于等于32且非空的表项。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-18 10:20:30  更:2021-09-18 10:22:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:31:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码