内核开发常备手册翻译(一)

内核开发常备手册

基于前面实现高精度定时器版本时,内核常常崩溃。在翻到此内核开发文档时,答疑解惑和常阅手册;

https://www.kernel.org/doc/html/latest/kernel-hacking/index.html

CPU

任意时刻,系统中的CPUs 可能处于以下几种状态:

  1. 与进程无关联,服务一个硬中断 hardware interrupt(处于中断上下文)
  2. 与进程无关联,服务一个软中断 softirq 或者tasklet (中断上下文)
  3. 进程内核空间 (进程上下文)
  4. 进程用户空间 (进程上下文)

在以上几种状态有严格的顺序, 3和4 允许互相 preempt (抢占) ,但是 1和2 有严格的hierarchy(层次)结构:只允许高层次的抢占低层次的;比如 当softirq 在某一个CPU 上允许,则其他的softirq 不会抢占该CPU 执行,但是硬中断可以。任意其他CPUs 独立运行,同时 我们可以实现用户上下文(block)禁止中断,并不可被抢占

硬中断 Hard IRQs

执行时机:时钟 tick、网络包、键盘输入 可能在任意时刻产生硬中断,

中断处理函数 服务硬件中断请求;内核可以保证中断处理函数绝对不会重入,当相同的中断请求到达时,需要排队处理或者丢弃。因为中断处理函数会关闭中断interrupts ,这些处理函数必须被快速执行: 经常它仅仅只处理 应答 中断处理请求,并标记 一个 软中断 延后处理然后退出。由于中断处理函数需要关闭中断或者抢占,如果长时间关闭中断不利于整个系统的响应能力,因此需要区分中断上部分和下部分

 in_irq() 返回 true 时 表示处于硬中断中,如果中断被关闭 返回false
软中断上下文: Softirqs and Tasklets

执行时机: 当一个系统调用即将返回用户空间、硬中断处理函数即将退出,(kernel/softirq.c)

许多需要实时处理的任务将在软中断中处理, Early in the transition to SMP, there were only ‘bottom halves’ (BHs), which didn’t take advantage of multiple CPUs. Shortly after we switched from wind-up computers made of match-sticks and snot, we abandoned this limitation and switched to ‘softirqs’.

include/linux/interrupt.h 列举了不同的软中断号, include/linux/timer.h 中 timer 软中断 也是一个非常重要的软中断号。Sostirqs 软中断通常难以处理,因为相同的软中断可能在同时并行跑在多个CPU 上(这里指相同类型?)。 Tasklets include/linux/interrupt.h 更常被使用,它们可以被动态注册,你可以注册任意个,并且保证一个Tasklet 任意时刻只在一个CPU 上执行,当然不同的Tasklet 可能在不同的CPU 上并行。

in_softirq() 表明正处于一个软中断中

(未完待续)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值