《深入理解LINUX内核》笔记(四)

本文介绍了计算机系统中硬件设备如何通过IRQ线路发起中断请求,80x86微处理器支持的各种异常类型及其处理流程,包括异常处理程序的标准结构、内核抢占的概念及条件,以及中断描述符表(IDT)的作用等。同时,文中还提到了Linux系统中中断和异常的处理方式,并概述了内核同步机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每个能够发出中断请求的硬件设备控制器都有一条名为IRQiinterpretrequest)的输出线


80x86微处理器大约发布了约20种不同的异常,内核必须位每种异常提供一种专门的异常处理程序


对某些异常,CPU控制单元会在执行异常处理程序前产生一个硬件出错码(hardwareerror code),并且压入内核态堆栈


中断描述符表(itterruptdescriptortable,IDT)是一个系统表,它与每一个中断或者异常向量相联系,每一个向量在表中都有相应的中断或异常处理程序的入口地址


linux利用中断门处理中断,利用陷阱门处理异常


内核启用中断以前,必须把IDT表的初始地址装到itdr寄存器,并初始化表中的每一项


异常处理程序和宗有一个标准的结构,由3部分:

1.在内核态堆栈中保存大多数寄存器的内容(这部分用汇编语言实现)

2.用高级的C函数处理异常

3.通过ret_from_exception()函数从异常处理程序退出


中断类型LI/O中断、时钟中断、处理器间中断


自旋锁保护不同CPU的并发访问


第五章内核同步


抢占内核的主要优点是:一个在内核态运行的进程可能在执行一个函数期间被另一个进程取代


只有当内核正在处理异常处理程序(尤其系统调用),而且内核抢占没有被显式的禁用时,才可能抢占内核。此外,本地CPU必须打开本地中断


只有在开中断的情况下,才可能发送内核控制路径的嵌套

通过在访问共享数据结构时金庸内核抢占功能实现临界区


中断处理程序、软中断和tasklet既不可以被抢占也不能被阻塞,所以不能长时间处于挂起状态


软中断和tasklet不能在以份额CPU上交错执行


同一个tasklet不能同时在几个CPU红色那个执行


内核使用的各种同步技术 说明

CPU变量(pre-cpu variable) CPU之间复制数据结构

原子操作 对一个计数器原子的“读-修改-写”的指令

内存屏障 避免指令重新排序

自旋锁 加锁时

信号量 加锁时阻塞等待(睡眠)

顺序锁 基于访问计数器的锁

本地中断的禁止 禁止单个CPU上的中断处理

本地软中断的禁止 禁止单个CPU上的可延迟函数处理

-拷贝-更新(RCU 通过指针而不是锁来访问数据结构


,每CPU变量主要时数据结构的数组,每个CPU对应数组的一个元素。

内核控制路径应该在禁用抢占的情况下访问CPU变量


汇编语言指令访问存储单元两次,第一次读原值,第二次写新值

在串处理系统中,永远都不会发生内存总线窃用的情况


指令不一定按源代码顺序执行,编译器可能会以使寄存器最优的方式重新安排汇编指令

所有的同步原语起优化和内存屏障的作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值