《实模式到保护模式》chap9 学习笔记

本文详细介绍了80x86处理器中的ret和retf指令区别,以及如何改写retf实现相同功能。接着探讨了中断的基本概念,包括非屏蔽中断NMI和可屏蔽中断INTR,以及中断控制器8259的工作原理。还讲解了实模式下的中断向量表和中断处理流程,并提到了实时时钟RTC的初始化和中断处理。最后,简要提及了内部中断、软中断和BIOS中断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

chap8本章习题答案

  1. retf和ret的区别就在于,ret是相对近转移,retf是远转移。ret只弹出指针寄存器IP而retf还要接着弹出段寄存器CS。知道了原理,就可以改写retf了。
 ;源程序
 begin:
         push word [es:code_1_segment]
         mov ax,continue
         push ax                          ;可以直接push continue,80386+
         
         retf                             ;转移到代码段1接着执行 
         
;修改之后的程序
begin:
         push word [es:code_1_segment]
         mov ax,continue
         push ax                          ;可以直接push continue,80386+
         
         ret                             ;转移到代码段1接着执行 
         pop cs

这里本来写的是pop ip,但是编译失败了。可能ip寄存器不能认为操作(为了安全考虑?)

实测可以运行

2.本来这两句话是用来处理实际长度小于等于512个字节的情况的。删除后对于长度小于等于512个字节的扇区,会附加一个空白扇区。

chap9 中断和动态时钟显示

终于到了喜欢的硬件部分了吗!

外部硬件中断

什么是中断?

当处理器遇到了不得不处理的事情(例如:电池低电量;硬盘读取位置数据损坏等)就必须放下手头的工作,先把这个问题解决掉。这就是简单版“中断”

每种类型的中断都被编号(中断向量号)

从硬件角度而言,外部硬件中断通过两个信号线引入处理器内部:NMI和INTR

NMI:非屏蔽中断

非屏蔽中断包括内存校验错,IO校验错。这种错误必须无条件加以处理,由于其特殊性,统一中断号为2.一般此类错误属于严重错误。

INTR:可屏蔽中断

这类中断的特点有二:1.数量多 2.可被屏蔽

由于处理器只有一个INTR引脚,需要一个代理来判断中断的优先程度传送给处理器。在单处理器系统中,用的最多的是8259芯片,也称:中断控制器或者可编程中断控制器。

intel允许256个中断,8259负责提供其中的15个,但是中断号是不固定的。

8259芯片结构如下
在这里插入图片描述

注意:优先级是主片IR0>IR1>IR2以此类推。从图中可以直观地看出为什么接受15个而不是16个中断号

屏蔽方式:当处理器IF标志位为0时,所有可屏蔽中断都会被忽略,反之接受

可以通过**cli(clear interrupt flag)和sti(set interrupt flag)**来控制IF寄存器

实模式下的中断向量表

中断向量表(interrupt vecior table,IVT),也就是在程序碰到中断时,处理器会做的事。一共256个中断,被集中存放到物理地址0x00000~0x003ff处。这就是中断向量表。IVT中每个中断占两个字(4字节)

处理器从8259芯片获取中断号,接着会执行以下内容:

  1. 保护现场:压栈FLAGS,CS,IP寄存器。清除IF和TF位
  2. 执行中断处理程序:拿到中断号之后,由于中断号*4=该中断在中断向量表中的偏移(4字节的原因),之后从中获取中断程序的偏移地址和段地址,开始跳转到中断处
  3. 返回到原始程序:执行iret(每个中断程序的最后一条指令),恢复IP,CS和FLAGS的内容,跳转到主程序接着执行

中断向量表初始化由BIOS完成,BIOS会将每一个中断指向一个位置IRET.之后的修改需要交给操作系统

实时时钟

计算机中集成了RTC(real time clock)电路。他依靠全天工作的石英振荡器来确定标准时间

日期和时间信息保存在CMOS RAM中。其中包含时间信息以及对时间信息操作的寄存器。由于这一部分比较繁琐,不再列出。

初始化

这里我们要做的是:安装中断向量。

我们应该先找到中断向量的物理位置。这里是9.2让我们寻找的。凭借常识可以得到答案是段地址:0x00,偏移地址:0x110(4*70),因为每个中断占据两个字,后续用bochsdbg可以验证

这里主要工作是设置RTC的ABCD寄存器。主要工作:设置RTC工作状态,使其产生中断信号发送给中断控制器

之后转到显存位置,屏幕上显示一个字符@

之后在这里进行了时钟中断的具体发出中断-接收中断的循环过程。不在这里详细解释了。因为感觉了解始终具体是如何工作的细节对于理解os意义不大。

内部中断

内部中断发生在处理器内部。比如:

0号中断:除数为0或者结果溢出

6号中断:非法指令

软中断

此类中断不需要识别总线周期,由int指令给出

int3			;设置断点指令
int 0x80		;引发0x80号中断
into			;如果标志寄存器OF位为1,引发4号中断

BIOS中断

属于一种特殊的软中断。在进入主引导扇区之前,BIOS中就已经被建立起来了。功能是:为了方便的使用最基本的硬件访问功能。例如访问键盘服务:

int 0x16
mov ah,0x00			;从键盘读字符
int 0x16			;键盘服务,字符将保存到AL中

感觉还是有点难…这里勉强能把程序看明白,自己写估计要费老大劲。
所以作业就没有做

那么,欢迎来到下一章,保护模式的世界

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值