行云

行至水穷处,坐看云起时。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
内核概述
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占有,那么就发生死锁了。
posted on 2011-08-17 13:46  windflying  阅读(320)  评论(0编辑  收藏  举报