操作系统的中断处理

简介: /*define SAVE_ALL "cld; \n\t""pushq %rax; \n\t""pushq %rax; \n\t""pushq %es, %rax; \n\t""pushq %rax; \n\t""pushq".

/*

define SAVE_ALL "cld; \n\t"

"pushq  %rax;   \n\t"
"pushq  %rax;   \n\t"
"pushq  %es,    %rax;   \n\t"
"pushq  %rax;   \n\t"
"pushq"
...

上面的这段汇编代码的宏定义就是在执行中断程序的时候调用的现场保留的操作, 和异常的现场保留是类似的
不同的是, 在异常中是处理器产生的任务暂停, 而在中断中是外部设备产生的任务暂停
也和异常一样, 在执行中断处理函数之前就需要执行现场保留的代码
*/

/*

  • 执行的流程, 通过处理函数的入口函数, 先执行现场保留的代码,接着下来就和异常处理程序有一点不一样了, 在中断处理中, 调用一个do_IRQ函数, do_IRQ函数寄存器中的参数调用
  • 对应的处理函数, 在异常中, 我们通过处理函数的入口函数执行了现场保留的代码之后, 在调用明确的异常处理函数, 当然程序的返回地址都是要记录的, 这样才能返回我们原来的程序
    */

/*

  • 上面讲到的是在遇到了异常的时候CPU是怎么处理的, 前提是我们现在为中断提供了入口函数 --> 注意: 入口函数和程序处理函数不是完全一样的, 入口函数中包含有程序处理函数,
  • 在入口函数中调用程序处理函数, 在异常和中断中都是这样的, 只不过正如上面提到的那样, 在中断中的程序处理函数都是交给了一个do_IRQ函数通过参数判断要调用对应的中断处理函数
  • 我们现在就是要使用set_intr_gate函数将中断的入口函数们一一注册好, 注意: 这里的set_intr_gate函数虽然接受的参数是我们入口函数的地址, 但是他在中断向量表对应的index
  • 写入的数据是一个门描述符, 该门描述符不仅仅是简单的是入口函数的地址在Linux中, 有一个函数指针数组, 在该数组中保存这的就是所有的中断处理函数的入口函数的地址, 也就是
  • 函数指针, 需要注意的是, 我们使用for循环进行注册的时候, 起始的i是应该为32, 因为前32个中断向量号已经被异常时候, 但是有不是32个异常, 用到的是20个异常, 剩下的12个异常中断
  • 向量号为Intel所保留
    */

/*

  • 注册好了之后, 我们需要初始化好ICW和OCW寄存器中的数据
  • */

/*

  • 下面是一个do_IRQ的demo示例
  • 功能: 在屏幕上打印出时钟中断的中断向量号
    */

void do_IRQ(unsigned long regs, unsigned long nr) {
color_printk(RED, BLACK, "do_IRQ:%#08x\t", nr);
io_out(0x20, 0x20);
}

/*

  • 通过阅读建议的键盘驱动, 发现所以的驱动编写就是在编写一个中断处理函数, 我们已经知道了, CPU根据中断向量表中的index找到键盘中断的入口函数, 在该入口函数中调用do_IRQ函数, 在
  • do_IRQ函数中调用驱动程序, 就是这样而已, 所以编写驱动程序仅仅是内核中的冰山一角
    */
目录
相关文章
|
2天前
|
算法 调度 UED
深入理解操作系统中的进程调度
【10月更文挑战第29天】探索进程调度的奥秘,本文将带你深入了解在操作系统中如何管理和控制多个并发执行的程序。从简单的调度算法到复杂的多级反馈队列,我们将逐步揭示如何优化系统性能和提高资源利用率。准备好一起揭开进程调度的神秘面纱吧!
|
1月前
|
算法 调度
深入理解操作系统:进程调度与优先级反转问题
【9月更文挑战第36天】操作系统是计算机科学中的核心概念,它管理着计算机的硬件资源和软件进程。在多任务处理环境中,进程调度是保证系统高效运行的关键机制之一。本文将探讨进程调度的基本概念、调度算法以及它们如何影响系统性能。同时,我们还将讨论优先级反转问题,这是一个在实时系统中常见的问题,它可能导致系统响应时间不可预测。通过分析优先级反转的原因和解决方案,我们可以更好地理解操作系统的设计和优化策略。
|
1月前
|
算法 Linux 调度
深入理解操作系统的进程调度
【9月更文挑战第30天】本文将带你进入操作系统的核心—进程调度。我们将探讨其工作原理,分析几种常见的调度算法,并通过实际代码示例来揭示这些理论是如何在真实系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都能帮助你更好地理解操作系统的这一关键组成部分。
|
2月前
|
算法 调度 UED
探索操作系统中的进程调度
【9月更文挑战第27天】操作系统是计算机的灵魂,而进程调度则是其跳动的心脏。本文将深入浅出地探讨进程调度机制,从理论到实践,带你领略这一技术的魅力和复杂性。我们将通过代码示例,揭示调度算法如何影响系统性能和用户体验。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇理解操作系统深层工作原理的大门。
21 6
|
2月前
|
算法 程序员 调度
深入理解操作系统之进程调度
【9月更文挑战第27天】本文旨在通过浅显易懂的语言和生动的比喻,带领读者走进操作系统的核心——进程调度。我们将从进程的基本概念出发,探讨进程调度的重要性、常见算法及其在现代操作系统中的应用。通过本文,你将获得对操作系统中这一复杂机制的直观理解,并学会如何在实际编程中有效利用进程调度来优化程序性能。
|
2月前
|
算法 调度
深入理解操作系统:进程调度与优先级反转
【9月更文挑战第21天】在操作系统的心脏跳动着的,是进程调度器。它决定了哪个进程运行,何时运行,以及如何优雅地共享CPU资源。本文将通过浅显易懂的语言和直观的代码示例,探索进程调度的奥秘,揭示优先级反转问题及其解决方案,带领读者领略操作系统中这一精妙绝伦的设计。
|
6月前
|
Linux C语言
操作系统 | 添加系统调用
操作系统 | 添加系统调用
62 0
|
5月前
|
存储 API 调度
深入理解操作系统:从内核到应用
【6月更文挑战第25天】本文将深入探讨操作系统的内部结构、功能以及它如何与应用程序交互。我们将从内核开始,逐步了解进程管理、内存管理、文件系统等关键组件,并讨论操作系统如何支持多任务处理和并发。最后,我们将探讨操作系统与应用程序之间的接口,以及操作系统如何影响应用程序的性能和稳定性。
|
5月前
|
存储 安全 数据安全/隐私保护
探索操作系统的心脏:内核与用户空间
【6月更文挑战第4天】本文将深入探讨操作系统的两个核心组成部分:内核和用户空间。我们将分析它们各自的功能、交互方式以及在现代计算环境中的重要性。通过比较单核与微内核设计,我们还将讨论不同内核架构对系统性能和安全性的影响。
32 0
|
6月前
|
存储 缓存 调度
深入理解操作系统:从内核到用户空间
【5月更文挑战第31天】本文将探讨操作系统的核心概念,包括内核、进程管理、内存管理和文件系统。我们将深入了解这些组件如何协同工作,以提供稳定、高效的计算环境。此外,我们还将讨论操作系统如何与硬件交互,以及如何在用户空间中运行应用程序。通过阅读本文,您将获得对操作系统工作原理的全面了解。