第七章 中斷和中斷處理

1. 異常和中斷

  • 異常:必須考慮與處理器時鐘同步,由軟件產生,亦稱爲同步中斷。如除零異常和缺頁異常
  • 中斷:由硬件產生的異步中斷

2. 中斷處理程序

  • 中斷處理程序是被內核調用來響應中斷的,運行與中斷上文。中斷上下文又稱原子上下文,該上下文的執行代碼不可阻塞。
  • 最起碼,中斷處理程序要負責通知硬件設備中斷已被接受:嗨,硬件,我聽到你了,現在回去工作吧!

3. 上半部和下半部

  • 中斷處理程序是上半部(top half)——接收到一個中斷,它就立即開始執行,但只做有嚴格時限的工作,例如對接受的中斷進行應答或者復位硬件,這些工作都是在所有中斷被禁止的情況下完成的。能夠被運行稍後完成的工作會推遲到下半部(bottom half)去。此後,在合適的時機,下半部會開中斷執行。

4. 在註冊中斷時IRQF_SHARED和dev的作用

  • IRQF_SHARED:表示在多個中斷處理程序之間共享中斷線,共享中斷線的中斷處理程序會存放在同一個中斷對應的鏈表中,用dev來區分,且dev全局唯一。在內核接受一個中斷後,它將依次調用在該中斷線上註冊的每一個中斷處理程序,在中斷處理程序中需要通過查詢硬件設備提供的狀態寄存器或者其他機制來確定這個中斷是否爲共享這個中斷線的其他設備發出的中斷,如果是,就不用處理,立即退出。
  • dev:如果是共享中斷線,必須設置這個標誌,而且必須全局唯一。在執行中斷處理函數時會將dev傳遞給中斷處理程序。在釋放共享中斷時,也會用到dev,用來指定需要刪除那個中斷處理函數。對於非共享中斷線的情況,dev參數可以用來區分共享同一個中斷處理程序的多個設備。
  • IRQF_DISABLED: 如果設置了,內核在處理中斷處理程序程序本身期間,有禁止當前CPU的所有其他的中斷。否則,中斷處理程序可以與除本身外的其他任何中斷同時運行。在最新的kernel中已經沒有這個標誌了。

5. request_irq() 函數可能會睡眠,故不能用在中斷上下文以及其他不允許阻塞的代碼中

6. 初始化硬件註冊中斷處理程序的順序必須正確,以防止中斷處理程序在設備初始化完成之前就開始執行。

7. 中斷處理程序的可重入性:

  • Linux中的中斷處理程序是無需重入的,當一個給定的中斷中斷處理程序正在執行時,相應的中斷線在所有的處理器上都會被屏蔽掉,以防止在同一中斷線上接收另一個新的中斷。通常情況下,所有的其他中斷都是打開的,所以這些不同中斷線上的其他中斷都能被處理,但是當前中斷線總是被禁止的。
  • 如果是多個中斷線共享同一個中斷處理程序就需要考慮可重入性了。

8. 在進程上下文可以通過current宏關聯當前進程。在中斷上下文中,current宏指向被中斷的進程。

9. 中斷上下文不能睡眠,進程上下文可以睡眠。

10. 中斷處理程序棧:

  • 共享所中斷進程的內核棧,內核棧大小爲兩個連續的物理頁。對於32位系統爲8KB,對於64位系統是16KB。

11. /proc/interrupts

存放的是系統中與中斷相關的統計信息。如果:

  1.           CPU0       CPU1       CPU2       CPU3      
  2. 14:        424          0          0          0  s3c-timer  1-wire TimerTick
  3. 16:         30          0          0          0  s3c-uart  s5pv210-uart
  4. ...
  5. 98:          0          0          0          0       GIC  s3c-pl330.0
  6. ...
  7. 126:          0          0          0          0       GIC  s3c2440-i2c.4
  8. 129:          0          0          0          0       GIC  s3c2440-i2c.7
  9. 134:       6425          0          0          0       GIC  ehci_hcd:usb1, ohci_hcd:usb2

說明: 第一列是中斷線,沒有顯示沒有安裝處理程序的中斷線

第二、三、四、五列是這個中斷線在對應的cpu上的接收數目

第六列是處理這個中斷的中斷控制器

第七列是與這個中斷相關的設備名字,這個名字是通過參數devname提供給函數request_irq的

其中第9行中表示“ehci_hcd:usb1”與“ohci_hcd:usb2”是共享中斷線

12. 中斷控制

  • 控制中斷系統的原因:需要提供同步
    • 通過禁止中斷,可以確保某個中斷處理程序不會搶佔當前的代碼
    • 禁止中斷還可以禁止內核搶佔。(系統滴答中斷被禁,調度程序無法自發選擇下一個進程調度)
    • 禁止中斷和禁止內核搶佔,都不能法制來自其他CPU的併發訪問。
    • 內核代碼一般通過獲取某種鎖防止來自其他CPU對共享數據的併發訪問。在獲取這些鎖的同時也伴隨着禁止本地中斷。
    • 鎖提供的保護機制,防止來自其他CPU的併發訪問,而同時禁止中斷提供保護機制,則是防止來自其他中斷處理程序的併發訪問。(可以參考中斷處理程序的可重入性)
  • 禁止本地中斷
    • 用於禁止當前CPU上的本地中斷
    • local_irq_disable() 和 local_irq_enable()
      • 這兩個函數不能恢復被調用前當前CPU的中斷禁止使能狀態,並且不受次數影響。
    • 下面的local_irq_save和local_irq_restore,用法:
      1. unsignedlong flags;
      2. local_irq_save(flags);
      3. ...
      4. local_irq_restore(flags);
      • 需要注意: local_irq_save和local_irq_restore必須在同一個函數中進行
    • 注:上面的四個函數即可用於中斷上下文,也可用於進程上下文
    • 上面的函數操作的是某個CPU內部寄存器,其他CPU不受影響,系統中斷控制器也不受影響
  • 禁止指定中斷線
    • 只禁止整個系統(所有CPU)中的一條特定的中斷線
    • 涉及到如下四個函數:
      1. void disable_irq(unsignedint irq);
      2. void disable_irq_nosync(unsignedint irq);
      3. void enable_irq(unsignedint irq);
      4. void synchronize_irq(unsignedint irq);
      • disable_irq只有在被禁止的中斷線上的所有處理程序完成後才能返回。不僅要確保不在指定的中斷線上傳遞新的中斷,而且還要確保所有已經開始執行的處理程序已經完全退出
      • disable_irq_nosync不會等待當前中斷處理程序已經退出,只需要確保不在指定的中斷線上傳遞新的中斷
      • synchronize_irq等待一個特定的中斷處理程序退出。如果該處理程序正在執行,那麼該函數必須退出後才能返回
      • 在實現上,disable_irq調用了disable_irq_nosync和synchronize_irq,如下:
        1. void disable_irq(unsignedint irq)
        2. {
        3. if(!__disable_irq_nosync(irq))
        4. synchronize_irq(irq);
        5. }
      • 對disable_irq或diable_irq_nosync的每次調用,都需要相應的調用一個enable_irq。只有在enable_irq完成最後一次調用後,才真正重新激活了中斷線
      • 注:上面的四個函數既可用於中斷上下文,也可以用於進程上下文
      • 上面的disable_irq和enable_irq控制的都是中斷控制器上指定的中斷線,即禁止或者使能給定中斷向系統中所有CPU的傳遞,而不是操作CPU內部的寄存器

13. 中斷系統的狀態

  • irqs_disabled() : 如果本地中斷被禁止,返回非0,否則返回0
  • in_interrupt() : 如果正在執行中斷處理程序或者正在執行下半部處理程序,則返回非0。否則返回非0
  • in_irq(): 如果正在執行中斷處理程序,則返回非0,否則返回0

完。

来自为知笔记(Wiz)

时间: 2024-10-01 07:01:05

第七章 中斷和中斷處理的相关文章

[摘录]第七章 在自我批判中持续改善

1.用自我批判成为强者(1).用“鸡毛掸子”掸掉思想灰尘:(2).用自我批评克服“幼稚病”:(3).活下去,并活的更好:(4).如何自我批判:自我批判误区:A.自我批判不是自卑,而是自信:B.自我批判是一种武器,也是一种精神:C.提倡自我批判,但不提倡批判他人: 2.在比较中分享和成长(1).满足当下,不攀比:(2).在绩效公示后学习A.以开放的心态面对:B.分享与学习: 3.每天都要有一点进步(1).自觉的学习:(2).谦虚的学习:(3).坚持不懈的学习: 4.允许犯错误,但要有进步(1).包

C++_第七章函数的基本知识_求阶乘的子函数_ 函数参数类型为数组_ 求数组内所有元素和、部分元素和的方法_实现了先从键盘输入到一个数组中,再用for循环取读出数组中的元素 for循环也可以用break来结束循环的

/* 第七章函数的基本知识 */ /*01)c++对于返回值有一定的限制:可以是常量.变量.指针.结构对象或表达式,但不可以是数组02)c++返回数组的方法:将数组作为结构会对象组成部分来返回03)函数遇到return则结束该函数04)如果一个函数的两房额参数类型相同,则必须分别制定每个参数的类型,而不能像声明常规变量那样,将声明组合在一起05)*/ //本代码注意double类型的写法以及double和int类型数据的转换 1 #include <iostream> 2 3 void che

NodeJs&gt;-------&gt;&gt;第二章:Node.js中交互式运行环境--------REL

第二章:Node.js中交互式运行环境--------REL 一:REPL运行环境概述 1 C:\Users\junliu>node 2 > foo = 'bar' ; 3 'bar' 4 > 二:在REPL运行环境中操作变量 1 C:\Users\junliu>node 2 > foo='bar' 3 'bar' 4 > var foo='bar' 5 undefined 6 > 1 console.log("foo='bar'"); //控

第十一章:WEB浏览器中的javascript

客户端javascript涵盖在本系列的第二部分第10章,主要讲解javascript是如何在web浏览器中实现的,这些章节介绍了大量的脚本宿主对象,这些对象可以表示浏览器窗口.文档树的内容.这些章节同样涵盖重要的web应用所需要的网络编程API.本地存储和检索数据.画图等.主要包含内容有以下章节: web浏览器中的javascript / window对象 /  脚本化文档 /  脚本化css / 事件处理 / 校本化http / jQuery类库 / 客户端存储  /  多媒体和图形编程 /

第12章-Swing编程 --- Swing中的特殊容器--JSplitPane

(一)使用JSplitPane JSplitPane用于创建一个分割板,它可以将一个组件(通常是一个容器)分割成两个部分,并提供一个分割条.用户可以拖动该分隔条来调整两个部分的大小.分隔面板的实质是一个特殊容器,该容器只能容纳两个组件,而且分割面板又分为上下分割.左右分割两种情形. 创建分割面板的代码如下: new JSplitPane(方向,左/上组件,右/下组件); JSplitPane分割面板提供了如下几个方法: (1)setDividerLocation(double proportio

Javascript高级程序设计——第二章:在HTML中使用Javascript

第二章:在HTML中使用Javascript <script>元素 向HTML页面中插入Javascript的主要方法,就是使用<script>元素,<script>元素有六个属性: async:可选.表示应该立即下载脚本,但不妨碍页面的其他操作,比如下载其他资源或等待加载其他脚本,只针对外部脚本有效. defer:可选.表示脚本可以延迟到文档完全被解析和显示之后再执行.只针对外部脚本有效. src:可选.表示包含要执行代码的外部文件. type:可选.表示编写代码使用

《从0到1》笔记 第六章 成功不是中彩票

第六章 成功不是中彩票----长期规划及其重要 初创公司的创立者只有在对公司没有确切规划的时候才会主动卖掉公司.2006年7月,当雅虎公司出价10亿要收购Facebook时,我认为如果是我们,至少会考虑一下.但是马克.扎克伯格在会议上宣布:“好了,伙计们,这个会议只是走个程序,10分钟也不用,我们显然不会把Facebook卖掉”马克清楚他能够领导公司开创出怎样的未来,而雅虎不清楚. 初创企业是你可以明确掌握最大努力的机会.在这里,你不只拥有自己生命的代理权,还拥有这个世界上某个重要角落的代理权.

《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架,它支持3种不同的技术来创建websites(网站)和Web应用:他们分别是,Web Pages,Web Forms,和MVC.虽然MVC是一种非常流行的,有完整的用于软件开发模式理论的技术,但它在ASP.NET中却是一种新的技术. 目前最新的版本是2012年发布的ASP.NET MVC4.自从2008年发布

“全栈2019”Java第八十五章:实现接口中的嵌套接口

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第八十五章:实现接口中的嵌套接口 下一章 "全栈2019"Java第八十六章:嵌套接口可以多继承吗? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小组