文章目录

  • 中断描述符表
    • 中断描述符
    • 中断描述符表寄存器
  • 中断错误码
  • 可编程中断控制器
    • 8259A
      • 8259A和CPU的交互
      • 8259A编程
        • ICW初始化
        • OCW操作
  • Gos中的中断
    • 初始化中断描述符表
    • 初始化PIC
  • 中断实现锁机制
    • 信号量的实现
      • 线程阻塞与唤醒
    • 锁的实现
  • 参考文献

写在前面:自制操作系统Gos 第二章第九篇:主要内容是中断相关知识已经在内核中如何取实现中断
关于中断的基础知识请移步至此博客:什么是中断
Gos完整代码:Github

中断描述符表

和其他的概念一样,我们首先要了解的就是操作系统是如何识别 执行中断的。这靠的其实就是中断表描述符中断表描述符表

中断描述符表(IDT,interrupt descriptor table)其实就是保护模式下面我们用于存储中断处理程序函数指针的一个数据结构。当CPU收到一个中断的时候,需要用中断向量号在此数据结构中检索相应的函数指针,得到了处理程序在内存中所处的位置之后,执行中断处理程序

中断描述符

在中断描述符表中,其实除了中断描述符还有任务门描述符陷阱门描述符

  • 中断门描述符:中断门包含了中断处理程序所在段的选择子和段内偏移地址。当通过此方式激怒中断后,标志寄存器eflags的IF位自动置为0,也就是进入中断之后,不能重复进入中断。

    注意:D位为0表示16位模式,为1表示32位模式
    其用代码表示如下:
// @brief 中断描述符结构体
struct gate_desc
{uint16_t func_offset_low_word;  //中断处理程序在目标文件中偏移低16位uint16_t selector;              //选择子,其实也就是下标uint8_t dcount;                 //此项为双字计数字段,是门描述符中的第4字节。此项固定值,不用考虑uint8_t attribute;              //描述符属性uint16_t func_offset_high_word; //中断处理程序在目标文件中偏移高16位
};
  • 任务门描述符:任务门和任务状态段是Intel处理器在硬件一级提供的任务切换基址,所以任务门需要和TSS配合在一起使用。在任务门中记录的是TSS选择子。
  • 陷阱门描述符:陷阱门和中断门十分相似,区别是由陷阱门进入中断后,标志寄存器eflags的IF位不会置为0。
  • 调用门描述符:调用门其实也就是系统调用,给用户进程提供给进入特权0级的方式。当然,其不存在与中断描述符表IDT中,一般是在全局描述符表GDT或本地描述符表LDT中。

    可以看到,这几个描述符的结构其实差不多,唯一的差距可能就在于TYPE字段了。

中断描述符表寄存器

现在我们已经知道中断描述符表长什么样子,下一步就是解决中断描述符表存哪里的问题。根据

Gos —— 开启中断与中断机制详解相关推荐

  1. Nginx开启Gzip压缩配置详解

    Nginx开启Gzip压缩配置详解 最近生产上发生了一些问题,原先所有的静态资源文件都是经过gzip压缩的,然而这几天突然都没有压缩了,经过一顿排查,发现是Nginx的配置有问题,借此机会详细了解了N ...

  2. 中断系统的简单了解以及C51(STC89C52)单片机中断系统的详解

    目录 一.中断系统简介 二.C51单片机的中断 1.外部中断 2.定时器/计数器中断 三.总结 一.中断系统简介 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的. 当中央处理机CPU正在 ...

  3. RISC-V SiFive U54内核——中断和异常详解

    目录 中断 中断优先级 异常 陷阱trap 本地中断 中断操作 中断进入和退出 中断控制和状态寄存器 Machine Status Register (mstatus) Machine Trap Ve ...

  4. 【STM32】FreeRTOS 调度器开启和任务相关函数详解

    文章目录 调度器开启过程分析 调度器开启过程分析 前面的所有例程中我们都是在 main()函数中先创建一个开始任务 start_task,后面紧接着调 用函数 vTaskStartScheduler( ...

  5. 【STM32】外部中断实验代码详解

    文章目录 main.c exit.c exit.h STM32 的每个 IO 都可以作为外部 中断的中断输入口,这点也是 STM32 的强大之处. STM32F103 的 19 个外部中断为: 线 0 ...

  6. c语言51单片机外部中断,51单片机外部中断0实例详解

    今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法. 1 51单片机的中断源 51单片机共有5个中断源,分别为:外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 每一个中断 ...

  7. STM32F10X CAN+TJA1050中断 接受例程详解,测试无误

    硬件平台:STM32F10X内部CAN模块 + TJA1050 + JLink 软件平台:Keil 4 一.结果演示 二.接受程序例程 程序涉及的模块有: USART:通用同步异步收发器,即串口,用于 ...

  8. PCIe中MSI和MSI-X中断机制详解

    目录 1.MSI和MSI-X中断机制 2.MSI和MSI-X对比 3.MSI/MSI-X Capability结构 3.1 MSI Capability结构 3.2 MSI消息格式及发送方式 3.3 ...

  9. 【STM32】定时器中断实验代码详解

    文章目录 main.c timer.c timer.h STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成. STM32 的通用定时器可以被用于:测 ...

  10. Windows下开启Mysql慢查询详解

    //show variables like '%quer%';查询是否开启了慢查询!! 第一步:修改my.ini(mysql配置文件)   在my.ini中加上下面两句话   log-slow-que ...

最新文章

  1. python twisted 笔记
  2. 【网络流】解题报告:luogu P3376 【模板】网络最大流
  3. Mysql与Sql Server查询数据库中表以及表字段
  4. 浏览器窗口的高度和宽度
  5. API性能优化之异步
  6. 设计模式之_工厂系列_01
  7. 今日头条人群洞察报告
  8. Tomcat日志打印乱码解决方法
  9. chrome 非安全模式解决开发跨域问题
  10. 什么是比特币?比特币的发展史,什么是挖矿?
  11. validate针对checkbox、radio、select标签的验证
  12. 通过隐藏Nginx和PHP版本号防止黑客攻击
  13. 【Linux】Shell脚本:while read line无法读取最后一行???
  14. HTML页面中条形码或二维码扫描枪的使用
  15. 什么蓝牙耳机好?测评达人精选五款性价比高蓝牙耳机推荐
  16. PCB设计走线细节讲解(图文结合|强力推荐)
  17. warpAffine函数解析
  18. 无人驾驶引发的变革比想象的更快,留给车企和老司机的时间已不多
  19. 表示身体各部位的英语单词
  20. ArcGIS制图技巧:制图入门与点、线、面状符号制作

热门文章

  1. 斐讯dns劫持,路由器DNS被劫持的解决办法
  2. 网站域名DNS被劫持了如何解决?
  3. 解决Vmware虚拟机startx进入图形界面卡退、白屏、黑屏的问题
  4. 每天禅道超时任务、超时未开始任务发送飞书提醒
  5. 集群健康值: yellow 问题
  6. 1357. 路径总和 II
  7. 自我认知测试软件,职业生涯测评系统在线测试
  8. 各种水龙头拆卸图解_水龙头拆除和安装步骤图解
  9. 硬盘柱面损坏怎么办_电脑硬盘坏了怎么办?不花一分钱就能成功修复!
  10. 给一个字符串,将其按照单词顺序进行反转