博客网址:www.shicoder.top
微信:18223081347
欢迎加群聊天 :452380935
这一次我们来对中断中的外中断进行讲解,先给下中断的分类和中断号分配把。
中断号 | 分类 |
---|---|
0x0-0x20 | 异常和非屏蔽中断 |
0x20-0x30 | I/O设备引发的可屏蔽中断,比如键盘、时钟等外中断 |
0x30-0xff | 软中断,比如常说的int 80系统调用 |
前面对异常进行了讲解,这次对外中断进行说明。我们下面以时钟中断举例,首先我们要知道的是,时钟中断是操作系统自己发生的,比如我们在执行一段代码时候,可能不知道啥时候,就会触发时钟中断,我们为了体现触发了时钟中断,我们就打印一句话就行。
同样我们给每个外中断号定义一个入口函数
INTERRUPT_HANDLER 0x20, 0; clock 时钟中断
INTERRUPT_HANDLER 0x21, 0; 键盘中断
INTERRUPT_HANDLER 0x22, 0
INTERRUPT_HANDLER 0x23, 0
INTERRUPT_HANDLER 0x24, 0
INTERRUPT_HANDLER 0x25, 0
INTERRUPT_HANDLER 0x26, 0
INTERRUPT_HANDLER 0x27, 0
INTERRUPT_HANDLER 0x28, 0
INTERRUPT_HANDLER 0x29, 0
INTERRUPT_HANDLER 0x2a, 0
INTERRUPT_HANDLER 0x2b, 0
INTERRUPT_HANDLER 0x2c, 0
INTERRUPT_HANDLER 0x2d, 0
INTERRUPT_HANDLER 0x2e, 0
INTERRUPT_HANDLER 0x2f, 0
在这个函数中,同样设置一个具体的函数
void idt_init()
{
// 初始化ENTRY_SIZE个中断处理函数
for (size_t i = 0; i < ENTRY_SIZE; i++)
{
gate_t *gate = &idt[i];
// gate->offset0 = (u32)interrupt_handler & 0xffff;
// gate->offset1 = ((u32)interrupt_handler >> 16) & 0xffff;
handler_t handler = handler_entry_table[i];
gate->offset0 = (u32)handler &