源代码的获取:
Linux操作系统是完全开源的,只要下载就可以进行学习, 源码下载地址:www.kernel.org
源码阅读工具为:source inlight 软件。
一些发布版本,Linux源代码安装在/usr/src/linux 目录下。
Linux与其他内核的比较:
Linux2.6内核版本目标是遵循IEEE POSIX,即,基于UNIX的可移植操作系统。包括现代Unix操作系统的全部特点:如 虚拟存储,虚拟文件系统,轻量级进程,Unix信号量,
SVR4进程间通信,支持对称多处理器系统。
Linux与一些著名的商用Unix内核如何竞争:
单块结构的内核
编译并静态连接的传统Unix内核:大部分现代操作系统内核可以动态地装载和卸载部分内核代码,同常把这部分代码称为模块。Linux对模块的支持很好。
内核线程:内核线程是一个能被独立调度的执行环境;线程之间的上下文切换比普通进程之间的上下文切换代价要少的多,因为前者在同一个地址空间执行。Linux以一种十分有限的方式使用内核线程来周期性地执行几个内核函数,但是它不代表基本的执行上下文的切换。
多线程应用程序支持:一个多线程用户程序由很多轻量级进程(LWP)组成,这些进程可能对共同的地址空间,共同的物理内存页,共同的打开文件等等进行操作。Linux定义了自己的轻量级进程版本。当LWP的所有商用Unix变体都基于内核线程时,Linux却把轻量级进程当做基本的执行上下文,通过非标准的clone()系统调用来处理。
抢占式内核
多处理器支持
文件系统
Linux的优势
Linux是免费的。
Linux所有的成分都可以充分的定制:通过内核编译选项
Linux可以运行在低档便宜的平台上面
Linux是强大的:充分挖掘了硬件部分的特点,是的Linux系统速度非常快。Linux的主要目标是效率。
Linux与很多通用操作系统高度兼容。
硬件的依赖性:
Linux试图在硬件无关的源代码与硬件相关的源代码之间保持清晰的界限。为了这点,在arch和include目录下包含了23个子目录,以对应Linux所支持的不同的硬件平台。
Linux的版本
第一位版本号2,从1996年开始。第二位表示内核的类型,如果为偶数,表示稳定的内核,否则表示开发中的内核。从2.6开始,发生变化,第四位表示带有补丁的内核版本。
操作系统的基本概念
计算机系统基本程序的集合,最重要的程序称为内核(kernel)。操作系统启动,内核被装入RAM,经常使用操作系统作为内核的同义词。
操作系统的两个主要目标:与硬件交互,为运行在计算机的应用程序提供环境。
现代操作系统禁止用户与底层硬件部分交互。硬件为CPU引入用户程序的非特权模式和内核的特权模式,即用户态和内核态。
一些相关的基本概念:
多用户系统:多用户系统就是一台能并发和独立地执行分别属于两个或多个用户的若干应用程序的计算机。并发意味着几个应用程序能同时处于活动状态并竞争各种资源。
用户和组:多用户系统,OS必须保证用户空间的私有部分仅仅对其拥有者可见。所有用户有一个唯一的标识符UID。为了和其他用户有选择的共享资料,每个用户是一个或多个用户组的一名成员,组有唯一标识符。 root用户几乎无所不能,因为OS对它不适用通常的保护机制。
进程:程序执行时的一个实例。允许进程并发的系统称为多到程序系统或者多处理系统。抢占式CPU。
内核体系结构:为了达到微内核理论上的优点,Linux内核提供了模块。模块是一个目标文件,其代码可以在运行时连接到内核或从内核解除连接。与微内核不同,模块不是作为一个特殊的进程执行的,与其他静态的内核连接库函数一样,代表当前进程在内核态下执行。
UNIX文件系统概述
硬链接和软链接:
硬链接($ln file filelink),限制:不允许用户给目录创建硬链接。只有在同一文件系统的文件之间才可以。
软链接($ln -s file filelink):可以指向任意文件或目录,甚至可以指向不存在的文件。
文件类型
普通文件;目录;符号链接;面向块的设备文件;面向字符的设备文件;管道和命名管道;套接字。后两种是进程间通信的特殊文件,设备文件是与I/O设备与集成到内核中的设备驱动程序相关。
文件描述符与索引节点
文件系统处理文件需要的所有信息包含在一个名为索引节点(iNode)的数据结构中。文件系统 的索引节点标识文件。属性包括(类型,硬链接个数,字节为单位的文件长度,设备标识符,索引节点号,文件拥有者的UID,文件的用户组ID,时间戳,访问权限和文件模式)
访问权限和文件模式
suid:拥有者的UID。
sgid:进程执行一个文件时,保持进程组的用户组ID。
文件操作的系统调用
文件系统是硬盘分区物理组织的用户级视图。文件操作必须在内核态下进行,UNIX定义了几个文件操作系统调用。
进程只能访问打开的文件,进程调用系统调用:fd=open(path,flag,mode);
文件描述符表示进程与打开文件之间的交互。当几个进程同时打开时,每个进程具有单独的文件描述符。UNIX文件系统对同一文件上发出的IO操作之间不提供同步机制,而同步机制是通过几个系统调用,如flock(),可用来让进程在整个文件或部分文件上对IO操作实施同步。
访问打开的文件
可顺序访问,可随机访问。
设备文件和命名管道文件只能顺序访问。
顺序访问:read和write()系统调用,从文件指针当前文职开始读或写。初始偏移量为0,文件开头。lseek()移动指针。
UNIX内核概述
进程/内核模式
CPU可以运行在用户态下,也可以运行 在内核态下。实际上,一些CPU可以有两种以上的状态,如intel 80x86微处理器有四种不同状态,但所有标准的Unix内核都仅用两种。
当一个程序在用户态下执行,它不能直接访问内核数据结构或内核的程序。
进程是动态的实体。内核本身不是一个进程,而是进程的管理者。
除用户进程外,Unix系统还包括几个所谓的内核线程的特权进程,特点如下:以内核态运行在内核地址空间;不予用户直接交互,因此不需要终端设备;通常在系统启动时创建,一直处于活跃状态知道系统关闭。
可以有几种方式激活内核例程:进程调用系统调用;正在执行进程的CPU发出一个异常信号;外围设备向CPU发出一个中断信号;内核线程被执行。
进程实现
每个进程对应一个进程描述符。包含有关进程当前状态信息:程序计数器和栈指针寄存器;通用寄存器;浮点寄存器;处理器状态字;跟踪进程对RAM访问的内存管理寄存器。
可重入内核
所有的Unix内核都是可重入的,意味着若干进程可以同时在内核态下执行。
如果 一个硬件中断发生,可重入内核能挂起当前正在执行的进程,即使进程处于内核态。
进程和地址空间
每个进程运行在它的私有地址空间。每个内核控制路径都引用它自己的私有内核栈。
有时进程之间也共享不跟地址空间。
Linux支持mmap()系统调用,该调用允许存放在块设备上的文件或信息的一部分映射到进程的部分地址空间。
同步和临界区
实现可重入内核需要利用同步机制。以下讨论同步内核控制路径。
非抢占式内核:但是非抢占能力在多处理器系统是低效的,因为运行在不同的CPU上的两个内核控制路径本可以并发地访问相同的数据结构。
禁止中断:在进入一个临界区之前禁止所有硬件中断,离开再重新启动。然而在临界区较大的情况下,硬件活动长期处于冻结状态。
信号量:广泛使用的是信号量机制。它在单处理器系统和多处理器系统都有效。
自旋锁:多处理器系统中,信号量并不是最佳方案。系统不允许在不同CPU上运行的内核控制路径同时访问内核数据结构,如果要修改数据结构所需的时间较短,信号量则很低效。 多处理器系统使用了自旋锁,自旋锁没有进程链表,当一个进程发现锁被另一个进程锁着时,它就不停地“旋转”,执行循环指令知道锁打开。
避免死锁:涉及到内核涉及,所有内核信号量数量较多时,死锁问题突出。有一些操作系统,包括Linux,通过按规定的顺序请求信号量来避免死锁。
信号和进程间通信
每种事件都有自己的信号编号,通常是一个符号常量表示。POSIX定义了约20种不同信号。
共享内存为进程之间交换和共享数据提供了最快的方式。 通过调用shmget()系统调用来创建一个新的共享内存。
进程管理
fork()和_exit()分别为创建和终止进程。
进程有父指针也有子指针。他们都能找到对方。
进程组和登录会话
现代UNIX 引入了进程组的概念,表示一种job作业的抽象。
内存管理
Unix内核中最复杂的活动。
虚拟内存
虚拟内存作为一种逻辑层,处于应用程序的内存请求与硬件内存管理单元(MMU)之间。内核和MMU协同定位内存中实际物理位置用途和优点:
若干进程并发执行;
应用程序所需内存大于物理内存也可运行;
程序部分代码装入内存可执行;
每个进程可访问可用物理内存的子集;
程序可重定位;
程序员不需要考虑物理内存结构编写代码。
RAM的使用
RAM划分为两部分,其中若干兆字节专门用于存放内核映像(内核代码,内核静态数据结构)。其余部分通常由虚拟内存系统来处理。
内核内存分配器KMA
试图满足系统中所有部分对内存的请求。应具有特点:快;减少内存浪费;减轻内存的碎片问题;能与其他管理子系统合作。
基于各种不同的算法技术,已经提出了几种KMA,包括:
资源图分配算法;
2的幂次方空闲链表;
Mckusick-karels分配算法
伙伴系统
mach的区域分配算法
dynix分配算法
Solaris的slab的分配算法
进程虚拟地址空间处理
所有现代Unix系统都采用了所谓请求调页的内存分配策略。有了它,进程可以在它的页还没有在内存时就可以执行。当进程访问页不存在,MMU产生异常,异常处理程序找到受影响的内存区,分配空闲的页,并初始化。
当进程通过调用malloc()或brk()动态请求内存时,内核仅仅修改进程的堆内存的大小。只有试图引用进程的虚拟内存地址而产生异常时,才给进程分配页框。
设备驱动程序
内核通过设备驱动程序与IO设备交互。设备驱动程序包含在内核中。
关系如下图: