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

来源:互联网 发布:网络电子老虎机技巧 编辑:程序博客网 时间:2024/05/24 01:52

每个能够发出中断请求的硬件设备控制器都有一条名为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变量


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

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


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

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

0 0
原创粉丝点击