zoukankan      html  css  js  c++  java
  • linux内核对中断的处理方式

    中断取代了轮询的通知方式,DMA取代了轮询的读写数据方式。

    分类
    软件指令造成的中断(又叫异常,同步中断)。    svc, und, abt
    硬件通过中断请求信号造成的中断(异步中断)。  irq,fiq

    向量中断和非向量中断
    采用向量中断的CPU通常为不同的中断分配不同的中断号,当检测到某中断号的中断到来后,就自动跳转到与该中断号对应的地址执行。不同中断号的中断有不同的入口地址。非向量中断的多个中断共享一个入口地址,进入该入口地址后再通过软件判断中断标志来识别具体是哪个中断。
    向量中断由硬件提供中断服务程序的入口地址,非向量中断由软件提供向量中断服务程序入口地址。


    中断的特点
    1)中断随机的。
    2)中断是可恢复的。
    3)中断是自动进行处理的。

    linux中断分为顶半部和底半部两部分。
    顶半部中断不可嵌套,中断被禁止。代码尽量短,处理重要事情,在中断处理函数asm_do_irq()中完成。
    底半部中断处理,可嵌套,有三种处理方式:
    1)SOFTIRQ (需重新编译内核,不推荐)。
    2)TASKLET小任务(中断上下文),不能睡眠。
    3)workqueue工作队列(进程上下文,可休眠)。

    中断处理函数以共享方式注册时,要设置设备id,否则设备注册不成功。
    独享方式时,设备id为NULL。

    共享中断返回IRQ_NONE, IRQ_HANDLED.
    do_irq()(x86)  <====> asm_do_irq() (arm)

    中断顶半部函数,禁止中断,不可嵌套(通过request_irq()申请)
    中断处理函数是被硬件请求执行的内核代码,所以它属于中断上下文。
    在中断上下文中绝对不允许出现睡眠或者可能睡眠的代码,否则会死机。
    睡眠代码:ssleep(), msleep()。
    可能造成睡眠的代码:
    kmalloc(2048, GFP_KERNEL);  //内存不足时可能睡眠,不能用于中断中。
    kmalloc(2048, GFP_ATOMIC);  //内存不足时不睡眠,直接返回错误码,可以用在中断中。
    copy_to_user(),copy_from_user(); //可能睡眠,不允许用在中断中。

    使能中断只能enable_irq().
    禁止中断disable_irq(), 中断内调用disbale_irq_nosync()。

    tasklet在linux/interrupt.h中定义,属中断上下文,不能访问0-3G空间,不能用copy_to_user()函数。

    工作队列属进程上下文,其执行晚于中断处理函数和tasklet,可休眠。
    工作队列workqueue被进程[events/0] PID=5调用。  0为CPU编号

    参考:

    http://webjs.blog.sohu.com/300913581.html

    tasklet_workqueue

  • 相关阅读:
    jQuery+ThinkPHP+Ajax实现即时消息提醒功能
    依赖注入(DI)
    控制反转(IoC)
    ajax以base64上传图片到django
    python 多进程、多线程、协程
    python3 实现tcp/udp局域网通信
    同源策略与跨域访问
    nginx+uwsgi阿里云ubuntu服务器上简单部署flask RESTful风格项目
    python3 实现 websocket server 解决中文乱码
    python IO 多路复用 epoll简单模型
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/6107878.html
Copyright © 2011-2022 走看看