本专栏,用于记录我对Linux内核源码的学习,就像STL源码的那个专栏一样,我知道阅读源码对我的意义。 愿者上钩咯,共同进步。
Linux克隆了Unix,但Linux不是Unix。 Linux是一个非商业化的产品,它的代码是开源的,这也给了我们无限机会。
用户界面是操作系统的外在表象,内核才是操作系统的内在核心。系统其他部分必须依靠内核这部分软件提供的服务,像管理硬件设备,分配系统资源等等。内核有时候被称作是超级管理者或者是操作系统核心。通常一个内核由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序。负责管理进程地址空间的内存管理程序和网络、进程间通信等系统服务程序共同组成。对于提供保护机制的现代系统来说,内核独立于普通应用程序,它一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限。这种系统态和被保护起来的内存空间,统称为内核空间。相对的,应用程序在用户空间执行。它们只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,不能直接访问硬件,还有其他些使用限制。当内核运行的时候,系统才进入内核空间。
内核还要负责管理系统的硬件设备。现有的几乎所有的体系结构,包括全部Linux支持的体系结构,都提供了中断机制。当硬件设备想和系统通信的时候,它首先要发出个异步的中断信号去打断内核正在执行的工作。中断通常对应着个中断 号,内核通过这个中断号查找相应的中断服务程序,并调用这个程序响应和处理中断。举个例子,当你敲击键盘的时候,键盘控制器发送-一个中断信号,告知系统键盘缓冲区有数据到来。内核注意到这个中断对应的中断号,调用相应的中断服务程序。该服务程序处理键盘数据然后通知键盘控制器可以继续输人数据了。为了保证同步,内核可以停用中止一既可以停止所有的中断也可以有选择的停止某个中断号对应的中断。许多操作系统的中断服务程序都不在进程上下文中执行。它们在一个与所有进程都无关的、专门的中断上下文中运行。之所以存在这样一个专门的执行环境,就是为了保证中断服务程序能够在第一时间响应和处理中断请求,然后快速的退出。
当Linus和其他内核开发者设计Linux内核时,他们并没有完全彻底地与Unix诀别。他们充分地认识到,不能忽视Unix的底蕴(特别是Unix的API).而由于Linux并没有基于某种特定的Unix,Linus 和他的伙伴们对每个特定的问题都可以选择已知最理想的解决方案一在有些时候,当然也可以创造一些新的方案。以下是对Linux 内核与Unix各种变体的内核特点所作的分析比较:
●Linux支持动态加载内核模块。尽管Linux内核也是整体式结构,可是允许在需要的时候动态地卸除和加载部分内核代码。
●Linux支持对称多处理(SMP)机制,尽管许多Unix的变体也支持SMP.但传统的Unix并不支持这种机制。
●Linux内核可以抢占(preemptive). 与传统的Unix不同,Linux内核具有允许在内核运行的任务优先执行的能力。在其他各种Unix产品中,只有Solaris和IRIX支持抢占。
●Linux对线程支持的实现比较有意思:内核井不区分线程和其他的一般进程。对于内核来说,所有的进程都-一样一只不过其中的一 些共享资源而已。
Linux内核有两种:稳定的和处于开发中的。稳定的内核具有工业级的强度,可以广泛的应用和部署。新推出的稳定内核大部分都只是修正了一些Bug或是加入了一些新的设备驱动程序。相反地,处于开发中的内核中许多东西变化得都很快。而且由于开发者不断试验新的解决方案,内核常常发生剧烈的变化。
Linux通过一个简单的命名机制来区分稳定的和处于开发中的内核(参考图1-2)。这种机制使用三个用“.”分隔的数字来代表不同内核。第一个数字是主版本号,第二个数字是从版本号,第三个数字是修订版本号。从版本号可以反映出该内核是一个稳定版本还是一个处于开发中的版本:该数字如果是偶数,那么此内核就是稳定版,如果是奇数,那么它就是开发版。举例来说,版本号为2.6.0的内核,它就是一个稳定版。这个内核的主板本号是2,从版本号是6,修订版本号是0。”头两个数字在一起描述了“内核系列”一在这个例子中,就是2.6版内核系列。
1、内核源码通常安装在 /usr/src/linux下。 2、去Linux内核开发者社区找,只要你的英文水平够高。
如果一个用户程序视图进行一次非法的内存访问,内核会发现这个错误并结束整个进程(段错误,核心已转储)。
内核很容易产生竞争条件。和单线程的用户空间程序不同,内核的许多特性都要求能够并发的访问共享数据,这就要求有同步机制保证不出现竞争条件,特别是:
●Linux内核支持多处理器并发处理。所以,如果没有适当的保护,在两个或两个以上的处理器上运行的代码很可能会同时访问共享的同一个资源。
●中断是异步到来的,完全不顾及当前正在执行的代码。也就是说,如果不加以适当的保护,中断完全有可能在代码访问共享资源的当间到来,这样,中段处理程序就有可能访问同- -资源。
●Linux内核可以抢占。所以,如果不加以适当的保护,内核中一 段正在执行代码可能会被另外一段代码抢占,从而有可能导致几段代码同时访问相同的资源。
常用的解决竞争的办法是自旋锁和信号量。