操作系统实现-外中断

本文探讨了操作系统中的外中断,以时钟中断为例,详细解释了中断分类、中断号分配,以及如何处理中断。通过设置中断入口函数、中断处理函数和结束中断的函数,阐述了中断处理流程。在main函数中打开中断,并通过中断控制器设置,允许时钟中断的发生。实验结果显示,未设置中断控制器时只能接收一次中断,设置后能连续响应。对于键盘中断,需要编写相应的处理和结束中断函数以正常工作。
摘要由CSDN通过智能技术生成

博客网址:www.shicoder.top
微信:18223081347
欢迎加群聊天 :452380935

这一次我们来对中断中的外中断进行讲解,先给下中断的分类和中断号分配把。

image-20220516124531798

中断号 分类
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 &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值