Linux内核设计与实现 - 第7章 中断处理

在这里插入图片描述

中断概念

什么是中断

  • 硬件与CPU通信的异步机制
  • 打断当前执行流程,处理紧急事件
  • 分类:外部中断、异常、软中断

中断号(IRQ)

  • 唯一标识中断源的数字
  • /proc/interrupts中查看分配情况

中断处理流程

// 典型中断处理函数原型
irqreturn_t handler(int irq, void *dev_id);
  1. 硬件触发中断信号
  2. CPU保存当前上下文
  3. 跳转到中断向量表指定位置
  4. 调用对应中断服务程序(ISR)
  5. 恢复被中断的上下文

上半部与下半部

特性上半部(Top Half)下半部(Bottom Half)
执行时机立即响应延迟执行
允许操作必要硬件操作复杂处理
中断状态禁用中断启用中断
实现机制中断处理函数tasklet/workqueue等

中断上下文

  • 原子性:不能睡眠/调度
  • 栈限制:使用独立中断栈(x86_64通常16KB)
  • 注意事项
    • 不能调用可能阻塞的函数
    • 不能与用户空间交互
    • 处理时间应尽可能短

中断API

// 注册中断
int request_irq(unsigned int irq, irq_handler_t handler, 
                unsigned long flags, const char *name, void *dev);

// 释放中断
void free_irq(unsigned int irq, void *dev_id);

// 禁用本地CPU中断
local_irq_disable();
local_irq_enable();

中断共享

实现要点:

  1. 注册时指定IRQF_SHARED标志
  2. 每个处理程序必须验证设备是否触发中断
  3. 使用dev_id参数区分设备

实践案例

按键中断驱动

static irqreturn_t button_isr(int irq, void *dev_id)
{
    struct timeval tv;
    do_gettimeofday(&tv);
    printk("Button pressed at %ld.%06ld\n", tv.tv_sec, tv.tv_usec);
    return IRQ_HANDLED;
}

// 模块初始化时:
request_irq(IRQ_BUTTON, button_isr, IRQF_SHARED, "my_button", NULL);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arm精选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值