版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
01了解中断概念与分类02理解中断系统架构和中断函数了解中断概念与分类PART01
中断是计算机中非常重要的功能,其重要性不亚于人的神经系统和脉搏。在Linux操作系统中,中断同样重要,在本项目中就带领大家了解中断的概念,掌握Linux操作系统中断的机制。【职业能力目标】
1.了解中断的概念。
2.了解中断系统架构。
3.掌握中断的常用API函数。【素质目标】
1.通过深入了解Linux操作系统中断系统架构和内核机制,促进学生对科技领域的兴趣和热情。
2.通过学习Linux操作系统中断系统架构和内核机制,培养学生的系统思维能力。7.1.1中断的概念中断是指CPU在执行程序的过程中,出现了某些突发事件亟待处理,CPU必须暂停当前程序的执行,转去处理突发事件,处理完毕后又返回源程序被中断的位置继续执行。一个完整的设备中,与中断相关的硬件可以划分为三类,它们分别是:设备、中断控制器和CPU本身,图7-1-1展示了一个SMP系统中的中断硬件的组成结构。7.1.1中断的概念7.1.1中断的概念设备是发起中断的源,当设备需要请求某种服务的时候,它会发起一个硬件中断信号,通常该信号会连接至中断控制器,由中断控制器做进一步的处理。在现代的移动设备中,发起中断的设备可以位于SoC(System-on-Chip,片上系统)芯片的外部,也可以位于SoC的内部,因为目前大多数SoC都集成了大量的硬件IP,例如I2C、SPI、DisplayController等。1.设备7.1.1中断的概念中断控制器负责汇总所有中断源产生的中断。当前市场上几乎所有中断控制器均具备可编程特性。通过对中断控制器进行编程,我们可以设定各个中断源的优先级、中断电平类型,并实现对特定中断源的开启与关闭。在对称多处理器(SMP)系统中,我们还能够指定某个中断源应由哪个处理器进行处理。针对ARM架构的系统级芯片(SoC),常用的中断控制器是VIC(VectorInterruptController,向量中断控制器)。而随着多核处理器的普及,GIC(GeneralInterruptController,通用中断控制器)的应用也逐渐增多。2.中断控制器7.1.1中断的概念作为最终响应中断的部件,CPU通过编程操作可编程中断控制器,实现对系统中断的管理与控制。当中断控制器判定某个中断可处理时,根据预先设定,通知单个或多个CPU处理相应中断。尽管中断控制器可同时通知多个CPU处理同一中断,但实际上,仅有一个CPU会响应中断请求,而具体哪个CPU响应则可能随机。这一特性在硬件层面得到保障,但仍取决于操作系统对中断系统的软件实现。在SMP系统中,CPU之间通过IPI(处理器间中断)进行通信。3.CPU7.1.1中断的概念中断类别及其行为,见表7-1-1。7.1.2Linux操作系统中断在Linux操作系统系统中,中断是Linux内核很重要的一部分,它能够让操作系统做出实时响应和异常处理,相比普通的轮询机制它还能在最大限度地节约操作系统的资源。
Linux操作系统中断机制由三部分组成:
(1)中断子系统初始化:内核自身初始化过程中对中断处理机制初始化,例如中断的数据结构以及中断请求等。
(2)中断或异常处理:中断整体处理过程。
(3)中断API:为设备驱动提供API,例如注册、释放和激活等。中断处理过程:设备产生中断,并通过中断线将中断信号送往中断控制器。如果中断没有被屏蔽,则会到达CPU的INTR引脚,CPU立即停止当前工作,根据获得中断向量号从IDT中找出中断描述符,并执行相关中断程序。7.1.2Linux操作系统中断异常处理过程:异常是在CPU内部发生的,所以不会通过中断控制器,CPU直接根据中断向量号从IDT中找出对应描述符,并执行相关中断程序。中断控制器处理主要有5个步骤:中断请求→中断响应→优先级比较→提交中断向量→中断结束。
CPU处理流程主要有6个步骤:确定中断或异常的中断向量→通过INTR寄存器找到IDT→特权检查→特权级发生变化,进行堆栈切换→如果是异常,则将异常代码压入堆栈,如果是中断,则关闭可屏蔽中断→执行中断服务程序或异常。7.1.3中断处理原则1.不能嵌套
在MCU中中断都是可以嵌套的,但是在Linux操作系统中是不支持中断的嵌套的,当执行中断程序时需要将数据和各种寄存器的值保存到栈中,栈的大小不是无限的,当中断不断地嵌套时就可能会发生爆栈,导致系统崩溃,所以在Linux操作系统中直接禁止了中断嵌套。2.越快越好
在中断处理过程中CPU是无法进行调度的,假如中断执行的时间非常长,那么将导致系统卡死,所以中断的处理越快越好。7.1.4硬件中断和软件中断硬件中断是由计算机硬件设备(如网卡、键盘、鼠标等)发出的信号,用于通知处理器某个特定事件已发生,需要进行相应的处理。当硬件设备发生中断时,它会向处理器发送一个中断请求(IRQ),处理器会立即中断当前正在执行的任务,并跳转到预定义的中断处理程序(InterruptServiceRoutine,ISR)中去处理这个中断事件。在Linux操作系统中,硬件中断的处理是通过使用中断控制器(InterruptController)来实现的。中断控制器负责接收和分发硬件中断请求,将中断请求映射到相应的中断处理程序中。如图7-1-2所示,可以简单认为有一个硬件中断数组,里面存放着不同硬件中断处理函数的指针。当发生A号中断时,对应的irq_function_A()函数被调用。1.硬件中断7.1.4硬件中断和软件中断7.1.4硬件中断和软件中断软件中断是通过在内核空间中执行特定的代码来处理的,这些代码被称为中断处理程序(ISR)。软件中断通常用于系统内核与用户空间的交互、系统调度、异常处理、定时器事件等。软件中断通常使用特定的中断向量或中断号来标识不同的中断事件。当一个软件中断被触发时,处理器会从当前执行的指令切换到相应的中断处理程序,处理完中断后再返回到原来的指令继续执行。如图7-1-3所示,也可以简单地认为有一个软件中断数组,里面存放着不同软件中断处理函数的指针。当发生软件中断X号中断时,对应的irq_function_X()函数被调用。软件中断的产生由flag决定,只要在软件中将其置为1就表示发生了该中断。2.软件中断7.1.4硬件中断和软件中断7.1.4硬件中断和软件中断
如图7-1-4所示,软件中断也有很多类型,我们比较常用的就是TASKLET_SOFTIRQ,它表示中断的下半部。7.1.4硬件中断和软件中断
硬件中断和软件中断都是为了处理异步的事件和请求而设计的,它们允许处理器在遇到事件发生时能够及时响应,提高了系统的实时性和并发性。在Linux操作系统中,硬件中断和软件中断共同工作,处理各种系统事件、设备请求和用户程序的需求,保证了系统的正常运行和高效性能。7.1.5中断的上半部和下半部7.1.5中断的上半部和下半部1.上半部(TopHalf)
上半部是中断处理的第一阶段,也称为中断服务例程(InterruptServiceRoutine,ISR)。
它是在中断事件发生后,立即运行的处理程序。上半部通常负责执行关键的、时间敏感的处理操作,需要尽快完成。这可能包括保存关键数据、更新硬件状态、响应设备、处理紧急任务等。上半部需要尽量快速地执行完毕,以确保及时响应其他中断事件和保持系统的实时性。因此,上半部通常采用较短的执行路径和简单的操作。7.1.5中断的上半部和下半部2.下半部(BottomHalf)下半部是中断处理的第二阶段,也称为延迟处理或后半部(DeferredProcessing)。它是在中断处理的延迟情况下执行的处理程序。下半部通常负责执行相对较慢、复杂或可能阻塞的操作,如长时间的计算、I/O操作、内存分配等。下半部的触发可以有多种方式,例如软中断、任务队列、工作队列等。这些机制允许在适当的时机,将需要处理的任务推迟到稍后执行,以避免在中断上下文中执行耗时操作和阻塞。上半部和下半部的划分可以使中断处理过程更加高效和灵活。上半部负责进行及时的关键处理,尽量缩短中断响应时间,而下半部则负责较为复杂和耗时的处理任务,通过延迟执行来降低对实时性的影响。详情请见教材详情请见教材理解中断系统架构和中断函数PART02
通过之前的学习,相信大家已经对Linux操作系统中断有了基本的了解和认识,在本任务中将会介绍中断的系统架构以及Linux操作系统内核中断机制等,带领大家更深入地认识Linux操作系统中断、中断的API函数。【职业能力目标】
1.掌握中断的系统架构。
2.了解Linux操作系统内核中断机制。
3.掌握Linux操作系统中断的常用函数。【素质目标】
1.引导学生深入研究Linux操作系统中断机制,鼓励他们通过团队合作和知识分享来共同探索和解决问题。
2.鼓励学生积极参与技术社区,分享他们的知识和经验,与他人共同学习和进步。
3.通过学习Linux操作系统中断的API函数和相关知识,培养学生对计算机底层原理的尊重和理解。
4.在学习中断的API函数和相关知识的过程中,培养学生倡导对计算机安全和稳定性的重视。7.2.1中断系统中重要的数据结构7.2.1中断系统中重要的数据结构中断结构如图7-2-2所示,产生中断时:
●外部设备1~外部设备n共享一个GPIO中断B,该中断是GPIO中的某一个引脚。●多个GPIO中断汇聚到GIC(通用中断控制器)的A号中断。●GIC再去中断CPU,来处理中断源。7.2.1中断系统中重要的数据结构CPU处理中断时:
●先读取GIC中的寄存器获得中断号A。●再从GPIO中得到中断号B。●最后判断是哪一个外部设备发生了中断。7.2.2中断系统下的数组与结构体irq_desc数组中的每一个元素都是irq_desc结构体。irq_desc结构体的定义如图7-2-3所示,irq_desc数组中的每一项都有一个函数指针handle_irq,还有一个action链表。1.irq_desc数组7.2.2中断系统下的数组与结构体CPU在处理中断时,中断处理函数的来源有三个。
(1)GIC的中断处理函数●CPU根据GIC中的寄存器,确定了中断号A,从而去调用中断处理函数irq_desc[A].handle_irq。●该函数会读取GPIO控制器中的寄存器,确定是哪个引脚发生了中断,从而确定中断号B,再去调用irq_desc[B].handle_irq函数。●中断A是CPU感受到的顶层中断。7.2.2中断系统下的数组与结构体
(2)GPIO模块的中断处理函数对于GPIO模块的中断B,BSP开发人员会设置对应的处理函数,一般是:
●handle_level_irq:电平触发处理函数。●handle_edge_irq:边沿触发处理函数。但是此时中断B是一个共享中断,该引脚上的外部设备1~外部设备n都可能产生中断,可能是一个设备,也可能是多个设备。所以irq_desc[B].handle_irq需要判断是哪个外部设备产生的中断。如图7-2-4所示,此时就会遍历irq_desc[B]结构体中的action链表,链表中的每一项都能代表一个外部设备,并且有外部设备的中断处理函数。●从链表中能找到产生中断的外部设备,进而调用外部设备的中断处理函数。●遍历寻找和调用同样是由BSP开发人员实现的。7.2.2中断系统下的数组与结构体
(3)外部设备提供的中断处理函数外部设备可能是芯片,也可能总是简单的按键,它们的中断处理函数由自己的驱动程序提供,因为:
●它是最熟悉这个设备的主体。●它知道如何判断设备是否发生了中断。●它知道发生了中断后该如何处理。7.2.2中断系统下的数组与结构体7.2.2中断系统下的数组与结构体
所以对于共享中断B,它的irq_desc[B]结构体中的action链表中就会存放多个外部设备的中断处理函数。一旦irq_desc[B].handle_irq中断处理函数确定是哪个外部设备产生了外部中断,就会调用外部设备的中断处理函数。根据上面分析,虽然GIC中断控制器和GPIO中断控制器有上下级之分,但是它们所包含的中断号都在irq_desc数组中。7.2.2中断系统下的数组与结构体iqr_desc[B]中的链表action里,每一项都是irqaction结构体变量。irqaction结构体的定义如图7-2-5所示,当外部设备的驱动程序调用request_irq和request_threaded_irq注册中断处理函数时,内核就会构造一个irqaction结构体变量,而且会初始化name、dev_id等成员。2.irqaction结构体7.2.2中断系统下的数组与结构体只用request_irq注册中断处理函数时,注册的就是上半部,意味着完全由上半部来处理。最重要的是handler和thread_fn以及thread三个成员:
●handler:是中断处理函数的上半部,用来处理紧急的事情。●thread_fn:是内核线程中断处理函数的下半部,用来处理不紧急且耗时的事情。●thread:是用来处理中断下半部的内核线程,当handler执行完毕后,Linux会唤醒该内核线程,执行thread_fn中断下半部处理函数。7.2.2中断系统下的数组与结构体7.2.2中断系统下的数组与结构体至于dev_id成员,是在调用request_irq时传入的,该成员有两个作用:
●中断处理函数执行时,能够用得上dev_id。●卸载中断时要传入dev_id,这样才能在action链表中根据dev_id找到对应项。所以在共享中断中必须提供dev_id,非共享中断可以不提供。7.2.2中断系统下的数组与结构体在irq_desc数组中的每个成员,如irq_desc[A]中,除了有structiqraction类型的链表action外,还有类型为structiqr_data的成员irq_data。irq_data结构体的定义如图7-2-6所示,它就是个中转站,里面有irq_chip指针和irq_domain指针,都是指向别的结构体。3.irq_data结构体7.2.2中断系统下的数组与结构体7.2.2中断系统下的数组与结构体7.2.2中断系统下的数组与结构体我们在驱动程序中使用request_irq和request_threaded_irq注册中断处理函数的时候,传入的irq参数就是这个虚拟的软件中断号。
irq_data中的irq_domain成员会建立hwirq和irq之间的映射关系,将hwirq映射为全局的irq。●irq:软件中断号(虚拟中断号)。●hwirq:硬件中断号。7.2.2中断系统下的数组与结构体如图7-2-7所示,irq_domain结构体中有一个irq_domain_ops结构体成员,里面存放有xlate()函数和map()函数。●xlate()函数:用来解析设备树中的中断属性,提取出hwirq、type等信息。●map()函数:把hwirq转化为irq。4.irq_domain结构体7.2.2中断系统下的数组与结构体
假设现在有gpio1_5和gpio2_5两个引脚是中断源,此时这两组使用的硬件中断号hwirq都是5,只通过hirq是无法区别这两个引脚的。此时就需要根据gpio1和gpio2各自的irq_domain结构体使用xlate()函数来区分了,并且使用map()函数将这两个硬件中断号转化成两个不同的软件中断号。将转化后的hwirq和irq的映射关系存放到linear_revmap成员数组中,就能根据硬件中断号hwirq直接找到映射出来的软件中断号irq了。7.2.2中断系统下的数组与结构体irq_chip结构体的定义如图7-2-8所示,这个结构体跟芯片息息相关,作用就是对GPIO等中断控制器模块中的中断源进行使能等操作。●irq_enable:使能中断。●irq_disable:清除使能。●irq_mask:屏蔽中断。●irq_unmask:解除屏蔽。5.irq_chip结构体7.2.2中断系统下的数组与结构体7.2.2中断系统下的数组与结构体
在request_irq注册了中断后,并不需要手工去使能中断,原因就是系统会调用irq_chip里的函数帮我们使能。提供的中断处理函数中,也不需要执行主芯片相关的清除中断操作,也是因为系统会帮我们调用irq_chip中的相关函数来处理。但是对于外部设备相关的清除中断操作,还是需要我们自己做的。就像图7-2-2的外部设备1~n,因为外设备千变万化,内核里可没有对应的清除中断操作。7.2.3常用的中断标志●#defineIRQF_SHARED0x00000080●#defineIRQF_TRIGGER_NONE0x00000000//无触发●#defineIRQF_ONESHOT0x00002000//单次中断,中断执行一次就结束●#defineIRQF_TRIGGER_RISING0x00000001//上升沿触发●#defineIRQF_TRIGGER_FALLING0x00000002//下降沿触发●#defineIRQF_TRIGGER_HIGH0x00000004//高电平触发●#defineIRQF_TRIGGER_LOW0x00000008//低电平触发7.2.4中断的常用API函数(1)申请中断irq,如图7-2-9所示。7.2.4中断的常用API函数●irq:要申请的硬件中断号。●handler:向内核注册的中断处理函数,相当于中断处理机制中的上半部。●flags:中断的触发方式。●name:中断名字。●dev:传递给中断服务函数的私有数据,一般设置为设备结构体,如果flags设置的是共享中断,则用来区分不同的中断。●返回值:返回0表示申请成功,-EINVAL表示中断号无效或中断处理函数为NULL,-EBUSY表示中断已经被占用。图7-2-10的申请中断irq()函数,不需要在出错处理和驱动出口函数中显式地释放中断。7.2.4中断的常用API函数7.2.4中断的常用API函数(2)释放irq()函数,如图7-2-11所示。此函数和request_irq相对应。●irq:要释放的硬件中断号。●dev_id:如果释放的是共享中断,则dev_id用来区分具体的中断。7.2.4中断的常用API函数(3)使能和屏蔽中断函数,如图7-2-12所示。从名字就能看出函数的意思,disable_irq_nosyn表示屏蔽的中断会立刻返回,而disable_irq表示屏蔽的中断会等待中断执行完成再返回,比如在3号中断中执行disable_irq(3)则会造成死锁。enable_irq表示使能中断。详情请见教材详情请见教材01掌握Linux操作系统裁剪操作02解析Linux操作系统移植原理掌握Linux操作系统裁剪操作PART01随着计算机技术的不断发展,Linux操作系统在开源领域中已经成为一款非常流行的操作系统,它有着强大的功能和稳定的性能,可以广泛应用于各种场景中。然而,在一些特定的环境下,我们并不需要Linux的全部功能,这时可以选择对Linux进行裁剪,使它更适合我们的需要。本任务将带领大家学习Linux操作系统针对嵌入式平台的裁剪操作。【职业能力目标】
1.了解Linux操作系统裁剪的原理。
2.掌握Linux操作系统裁剪的方法。【素质目标】
1.通过学习Linux操作系统针对嵌入式平台的裁剪操作,倡导技术适用性和可定制化,培养学生对技术的灵活使用。
2.在学习Linux操作系统针对嵌入式平台的裁剪操作的过程中,促进技术创新和应用拓展。
3.在学习Linux操作系统裁剪操作的过程中,培养学生积极参与开源社区和行业合作,弘扬开放共享和合作精神。8.1.1U-Boot概念
U-Boot全称是UniversalBootLoader,是遵循GPL条款的开放源码项目,由德国DENX公司开发。U-Boot是一款开源的引导加载程序(Bootloader),可用于嵌入式操作系统中。8.1.1U-Boot概念U-Boot具有以下特点:
●开放源码;
●支持多种嵌入式操作系统内核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;
●支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale;
●较高的可靠性和稳定性;
●高度灵活的功能设置,适合不同引导要求、产品发布等;
●丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
●较为丰富的开发调试文档与强大的网络技术支持。8.1.2U-Boot的由来
U-Boot最初是由德国开发者MagnusDamm(马格努斯·达姆)发起的一个项目,该项目基于8xxROM的源码创建,后由WolfgangDenk(沃尔夫冈·登克)接管并迁移至Source-F平台。由于SourceF的项目命名规则禁止以数字开头,原项目名称中的数字前缀被移除,更名为PPCBoot。该版本于2000年7月19日首次公开发布。实际上,U-Boot的技术演进可追溯至更早的开源项目,其核心代码继承自FADSROM、8xxROM和PPCBoot等早期引导程序。在持续迭代过程中,U-Boot凭借其模块化设计和跨平台支持特性,被广泛应用于各类SoC(SystemonChip,片上系统)开发中。作为专用集成电路的嵌入式系统解决方案,U-Boot完整集成了硬件初始化、启动管理和嵌入式软件加载功能,形成了“芯片级系统”的技术生态。8.1.2U-Boot的由来
得益于开源社区的持续贡献和主流芯片厂商的官方支持,U-Boot逐步确立了嵌入式领域引导程序的事实标准地位。经过二十余年的发展,其已成为当前绝大多数嵌入式设备的默认引导加载程序,涵盖消费电子、工业控制、网络通信等全产业链应用场景。8.1.3Linux操作系统裁剪的概念在嵌入式系统开发中,裁剪是一种常见的优化技术,旨在减少系统的内存占用和启动时间。在嵌入式Linux操作系统中,两个关键组件———Linux内核和U-Boot引导加载程序(Bootloader),也需要经过裁剪以满足特定应用场景的需求。8.1.3Linux操作系统裁剪的概念(1)裁剪方式●静态裁剪:静态裁剪是在编译Linux内核时根据实际需求选择性地包含或排除某些模块、功能和驱动程序。通过配置menuconfig或其他内核配置工具,可以手动选择要构建进内核的功能,并移除不需要的部分。●动态模块:另一种裁剪方式是将部分功能编译为动态模块,只在需要时进行加载。这样可以减少内核镜像的大小,但需要额外的动态加载机制支持。1.Linux内核的裁剪8.1.3Linux操作系统裁剪的概念
(2)裁剪目的●减少内存占用:删除不必要的功能、驱动程序或模块,使得内核更加精简,从而节省系统内存。●启动时间优化:裁剪后的内核启动速度更快,适合对启动响应速度有要求的嵌入式设备。8.1.3Linux操作系统裁剪的概念(1)裁剪方式●配置选项:U-Boot提供了丰富的配置选项,可以根据特定需求进行裁剪。通过配置文件(如include/configs/xxx.h)和编译选项,可以选择需要的功能和模块
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年避坑指南林业采伐安全培训内容
- 2026年潜水作业安全培训内容一次通关
- 2026年医院多媒体设备采购合同协议
- 2026年安全月安全培训教育内容核心要点
- 焦作市马村区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 钦州市钦南区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 石家庄市赵县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 齐齐哈尔市甘南县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 抚顺市清原满族自治县2025-2026学年第二学期六年级语文第四单元测试卷(部编版含答案)
- 抚顺市露天区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 浙江空调管理办法
- 小学动感中队活动方案
- 猪群周转培训课件
- 肺癌营养支持治疗
- 施工协调费协议书
- 皮肤生理学试题及答案
- 汽修厂应急预案
- 公司绩效考核方案制度范本
- 《资治通鉴》与为将之道知到课后答案智慧树章节测试答案2025年春武警指挥学院
- 配电柜拆除施工方案
- 银行客户满意度调查手册
评论
0/150
提交评论