《一个操作系统的实现》笔记(3)--中断和I/O保护
中断和异常机制
有时候普通的程序流必须可以被要求快速反应的处理事件中断。电脑提供了一个称为中断的结构来处理这些事件。 外部中断由CPU的外部引起。 例如:当一个鼠标移动了,硬件鼠标中断现在的程序来处理鼠标移动(移动鼠标,等等)。中断导致控制权转移到一个中断处理程序。中断处理程序是处理中断的程序。每种类型的 中断都分配了一个中断号。在物理内存的开始处,存在一张包含中断处理 程序段地址的中断向量 表。中断号是这张表中最基本的指针。 内部中断由CPU的内部引起,要么是由一个错误引起,要么由中断指令引 起。错误中断称为陷阱。由中断指令引起的中断称为软中断。DOS使 用这些类型的中断来实现它的API。 许多中断处理程序当它执行完成时,将控制权返回给被中断的程序。它 们恢复寄存器,里面的值与中断发生之前的值相同。因此,被中断的程序 就像没有任何事情发生一样运行(除了它失去了一些CPU周期)。
在实模式下能用的BIOS中断在保护模式下已经不能用了,实模式下的中断向量表被保护模式下的IDT所代替。 IDT的作用是将每一个中断向量和一个描述符对应起来。 联系调用门我们知道,其实中断门或者任务门的作用机理几乎是一样的,只不过使用调用门时使用call指令,而这里我们使用int指令。 中断过程调用:
中断门和陷阱门的结构:
外部中断需要建立硬件中断与向量号之间的对应关系,由CPU的引脚INTR来接收:
8259A是可编程中断控制器,通过向相应的端口写入特定的ICW(Initialization Command Word)来实现的,在写入ICW2时涉及与中断向量号的对应,这里IRQ8~IRQ15被设置成对应中断向量28h~2Fh,这个范围处于用户定义的中断向量。
Init8259A:
mov al, 011h
out 020h, al ; 主8259, ICW1.
call io_delay
out 0A0h, al ; 从8259, ICW1.
call io_delay
mov al, 028h ; IRQ8 对应中断向量 0x28
out 0A1h, al ; 从8259, ICW2.
call io_delay
;...
中断或异常发生时的堆栈
保护模式下的I/O
保护模式下对I/O做了限制,用户进程如果不被许可是无法进行I/O操作的。主要通过IOPL和I/O位图来实现。
IOPL
IOPL位于寄存器eflags的第12、13位。 I/O敏感指令如in、out等只有在CPL<=IOPL时才能执行。
I/O许可位图
I/O许可位图位于TSS偏移102字节处,每一位表示一个字节的端口地址是否可用。
- 国内研究人员首次Wifi重大漏洞利用实现 | Krack攻击测试套件打包
- 想成为优秀程序员必知的要点
- Attribute(特性),怎么用才更好?
- 如何使用Airgeddon搭建基于软件的WIFI干扰器
- 还在写SQL的同志,去喝杯咖啡吧!
- 使用XSD编写具有智能提示的XML文件(以SQL-MAP脚本为实例)
- 一个利用CVE-2017-11292的APT样本技术分析(一)
- Attribute(特性),怎么用才更好? —— 字段编号被误解了
- PDF.NET的SQL日志 ASP.net 路径问题 详解
- 【自然框架】稳定版beta1——源码下载,Demo说明
- TOP语句放到表值函数外,效率异常低下的原因分析
- 常见.NET功能代码汇总 (3) 33,彻底关闭Excel进程
- Vue.js 入门指南之“前传”(含sublime text 3 配置) 1,下载安装Node.js2,配置Vue环境3,Vue初探4,配置sublime Text
- JavaScript的“原型甘露”
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 谈谈HTML中锚点及其使用
- java_数据类型转换、运算符
- JavaScript中字符串运算符是什么?有哪些?
- Docker日常使用方式
- 使用Python爬取动态网页-豆瓣电影(JSON)
- Linux安装配置PHPmyadmin
- Angular Service依赖注入的一个具体例子
- php学习day1
- 在Angular里使用rxjs的异步API - Observable
- 自动化监控Oracle表空间并发送报警
- Angular里的消息(Message)显示
- Angular应用内路由(In App Route)的最佳实践
- Angular应用的路由指令RouterLink
- ctfhub-信息泄泄露_备份文件下载
- Angular In-memory Web API使用介绍