操作系统的中断处理

简介: /*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函数中调用驱动程序, 就是这样而已, 所以编写驱动程序仅仅是内核中的冰山一角
    */
目录
相关文章
|
Python
探索Python虚拟环境:virtualenv、venv与pipenv比较
在Python开发中,有效的环境管理至关重要。virtualenv、venv和pipenv是常用的虚拟环境管理工具。virtualenv支持Python 2.7+和3.3+,可创建独立环境;venv为Python 3.3+内置库,简单轻量但功能有限;pipenv则结合了包管理和虚拟环境管理,生成Pipfile.lock确保依赖确定性和安全性,推荐作为首选工具。
488 2
|
机器学习/深度学习 算法 TensorFlow
TensorFlow的自动微分与梯度下降
【4月更文挑战第17天】本文探讨了TensorFlow中的自动微分和梯度下降在机器学习模型优化中的作用。自动微分通过计算图实现,简化了深度学习模型中梯度的计算。TensorFlow利用`tf.GradientTape`进行反向传播以求梯度。梯度下降算法用于更新参数,`tf.train.GradientDescentOptimizer`是实现这一过程的一种方式。此外,TensorFlow还提供了其他优化器以提升性能。理解这些概念有助于更有效地构建和优化机器学习模型。
|
数据采集 Web App开发 存储
Python-数据爬取(爬虫)
【7月更文挑战第24天】
346 7
|
编译器 API C语言
【QT速成】半小时入门QT6之QT前置知识扫盲(一)
【QT速成】半小时入门QT6之QT前置知识扫盲(一)
1089 0
|
Web App开发 JavaScript 前端开发
html img Src base64 图片显示
大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符。 比如:data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAA...
5288 0
|
图形学 开发者
【unity小技巧】两种办法解决FPS游戏枪或者人物穿墙穿模问题
【unity小技巧】两种办法解决FPS游戏枪或者人物穿墙穿模问题
1200 0
|
设计模式 SQL Java
3-1大佬分享:字节跳动代码设计理念
3-1大佬分享:字节跳动代码设计理念
238 1
|
人工智能 小程序 Java
手把手教你免费搭建自己的红包封面商城​
手把手教你免费搭建自己的红包封面商城​
236 0
|
存储 弹性计算 Linux
省钱小贴士(ECS):教你如何每年省出8w+ 块
随着用户越来越多地使用阿里云的ECS服务,如何用最小的成本来保有ECS,成为用户越来越重要的关注点。为了更好的服务客户,ECS团队调整了系统盘的最小容量限制。
19477 117
|
存储 索引
RandomAccessFile详解
此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。
1697 0