内核概述 Linux内核提供了应用程序可以运行的执行环境。因此,内核必须提供一组服务及相应的接口。 内核可以说是有一个个驱动模块和一些公用模块组成的。内核响应用户空间的请求,驱动硬件 提供相应的服务。更进一步可以说内核是由一系列函数和一些全局数据结构组成。 系统的运行 系统的运行是以一个个进程的方式进行的。内核本身并不是进程,而是进程的管理者。当进程 需要用到内核提供的服务是,它通过调用系统调用转到内核执行。Linux内核包括几个所谓的内 核线程。在单处理器系统中任何时候只有一个进程运行。如果进程运行在内核态,处理器就执 一些内核例程。 Linux内核的各个部分并不是严格按照顺序依次执行的,而是采用交错执行的方式。 激活内核例程的方式 1 进程调用系统调用 2 调度程序调度 3 中断产生 可重入内核 Linux内核是可重入的。提供可重入的一种方式是编写函数,以便这些函数只能修改局部变量,而 不能改变全局数据结构,这样的函数叫可重入函数-- 可以重复进入的函数,一般而言是不含static 数据结构,不访问全局变量,如果访问全局变量要用锁/信号量等加于保护。 可抢占内核 可抢占内核要保护临界区。 临界区保护的方式 1 禁止中断: 在进入临界区之前禁止所有中断,离开时再重新启用所有中断。这种技术不适用于大粒度 保护。也不适用于多处理器的保护。 2 信号量:对于小粒度的保护,信号量可能是低效的。 3 自旋锁:在单处理器环境下 -- 表示不可抢占但可被中断。在多处理器环境下,忙等待。 spin_lock()声明禁止内核抢占。 用spin_lock的上下文不能睡眠,因为睡眠表示让出CPU,这与用spin_lock的目的矛盾。 根据spin_lock的语意考虑为什么不用一个全局的spin_lock: 假设A 调用lock后被中断了, 进入B,这时候B申请锁,但锁被A占有,那么就发生死锁了。