PWT_PCD
#### CPU缓存
(1)CPU缓存位于是位于CPU与物理内存之间的临时存储器,
它的容量比内存小的多但是交换速度却比内存快的多。
(2)CPU缓存与TLB的区别:
TLB:线性地址<------>物理地址
CPU缓存:物理地址<---->内容
PWT:Page Write Through
PWT=1时,写Cache的时候也要将数据写入内存中。
PCD:Page Cache Disable
PCD=1时,禁止某个页写入缓存,直接写入内存。
比如,做页表用的页,已经存储在TLB中了,可能就不需要在缓存了。
中断与异常
#### 中断与异常
(1)中断通常是由CPU外部的输入输出设备(硬件)所触发的,
供外部设备通知CPU有事情要做,因此又叫中断请求(Interrupt Request)。
(2)中断请求的目的是希望CPU暂时停止当前正在执行的程序,
转去执行中断请求所应对的中断处理例程(中断处理程序在哪有IDT表决定)。
(3)80x86有两条中断请求线
非屏蔽中断线:称为NMI(NonMaskable Interrupt)
可屏蔽中断线:称为INTR(Interrupt Require)
非可屏蔽中断处理
(IDT表)中断号 | NMI | 说明
0x2 不可屏蔽中断 80x86中固定0x2
当非可屏蔽中断产生时,CPU在执行完当前指令后会进入中断处理程序,
非可屏蔽中断不受EFLAG寄存器中IF位的影响,一旦发生,
CPU必须立即处理非可屏蔽中断处理程序位于IDT表中2号位置。
可屏蔽中断
在硬件级,可屏蔽中断是由一块专门的芯片来管理的,
通常称为中断控制器,它负责分配中断资源和管理各个中断源发出的中断请求,
为了便于标识各个中断请求,中断管理器通常用IRQ(Interrupt Request)
后面加上数字来表示不同的中断。
比如:在Windows中,时钟中断的IRQ编号为0,也就是IRQ0。
查看中断号
(1)在设备管理器中选择设备右键。
(2)以显示适配器为例,单击属性。
(3)在设备属性页面中单击资源其中IRQ号便是中断号。
大多数操作系统时钟中断在10-100MS,Windows操作系统系列为10-20MS,
假设编写了一个死循环程序,但仍然不是真正的死循环,每过10-20MS
时钟中断便会触发,这个时候操作系统接管CPU是有机会制定他要执行的指令,
需要注意的是操作系统并不是通过时钟中断来实现线程切换的,只能说明
操作系统是能够通过时钟中断来获得控制权。
可屏蔽中断如何处理
(IDT表)中断号 | IRQ | 说明
0x30 IRQ0 时钟中断
0x31-0x3F IRQ1-IRQ15 其他硬件设备的中断
在IDT表中位于0x30位置的门便是时钟中断,中断的本质其实是改变了CPU执行的路线。
CLI指令和STI指令
如果自己的程序执行时不希望CPU去执行这些中断,可以
用CLI指令来清空EFLAG寄存器中的IF位,
用STI指令设置EFLAG寄存器中IF位
硬件中断与IDT表中的对应关系并非固定不变,可以参考APIC(高级可编程中断控制器)
异常
异常通常是CPU在执行指令时检测到某些错误,比如除0/访问页面无效等。
中断与异常的区别:
(1)中断来自于外部设备,是中断源(比如键盘发起的),CPU是被动的。
(2)异常来自于CPU本身,是CPU主动发起的。
(3)INT N 虽然被称为软中断,但其本质是异常,EFLAG的IF位对INT N无效。
异常处理
无论是由硬件设备触发的中请求还是由CPU产生的异常,
处理程序都在IDT表。
常见的异常处理程序:
错误类型 IDT表中断号
页错误 0XE
段错误 0XD
除零错误 0X0
双重错误 0X8