读深入理解Linux内核 (前言和第一章)

来源:互联网 发布:苏州 青少年编程 编辑:程序博客网 时间:2024/05/20 21:22

前言

本书的价值

剖析操作系统的关键部分,重要算法,和重要数据结构,帮助您从海量的内核代码中找到路径,而不至于淹没其中。


要了解计算机究竟是怎么工作的,只了解计算机架构(处理器架构,总线,外设等)是不够的,本书讲述计算机硬件之上,软件核心,操作系统内核的实现。


本书不是乏味地陈述设计和展示代码,而是结合背景,历史和揭示设计背后的原因,所以是一本非常耐读的典藏。


每一章,先给出理论上的概述,然后讨论关键数据结构,再之后从最底层的函数讲到更高层的函数,直到支持应用程序的系统调用。


全书概貌

第二章:内存寻址,这是内存管理的基础(页表,虚存等),而内存管理是内核的核心

第三章:进程,以及用户态和内核态的切换

第四章:中断和例外,用户态和内核态切换的实现支撑

第五章:内核同步机制

第六章:时间(Timing)

第七章:进程的调度

第八章:内存管理

第九章:进程地址空间

第十章:系统调用

第十一章:信号

第十二章:虚拟文件系统

第十三章:I/O架构和设备驱动

第十四章:块设备驱动

第十五章:页高速缓冲,使用内存来减少硬盘的访问,极大提高系统性能

第十六章:文件访问

第十七章:页回收

第十八章:Ext2/Ext3文件系统

第十九章:进程间通信

第二十章:程序执行,解释用户程序如何执行


A:Linux启动

B:内核定制


第一章:介绍

严格来讲,Linux是操作系统内核,它不包含内核之外的操作系统组件,比如桌面,系统管理工具等。Linuxdistribution,比如Ubuntu,Fedora才是完整的操作系统。

Linux是类Unix操作系统,遵循POSIXPortableOperating Systems based on Unix)标准。



1. Linux对比其它类Unix内核

Linux具备以下优秀商用Unix内核的优点:

1. 单内核

单内核是相对微内核而言(但是微内核不是更优秀么?),Linux是单内核

2. 动态加载模块,比如设备驱动

3. 内核线程

内核线程之间切换开销较小,因为在同一地址空间。Linux在很有限的几个方面用到内核线程(但为何这是优势?)。

4. 多线程支持

一个应用可以由很多轻量级进程(LWP– Lightweight process)组成,它们共享地址空间,打开的文件等。

大多数商业UnixLWP是基于内核线程。而Linux中,LWP进程是最基本的执行单元,通过非标准的clone()系统调用产生。

5. 抢占式内核

可抢占式内核:即当进程位于内核空间时,有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程。

非抢占式内核:高优先级的进程不能中止正在内核中运行的低优先级的进程而抢占CPU运行。进程一旦处于核心态(例如用户进程执行系统调用),则除非进程自愿放弃CPU,否则该进程将一直运行下去,直至完成或退出内核

抢占式内核的意义:实时系统对响应时间有严格的限定,当一个实时进程被实时设备的硬件中断唤醒后,它应在限定的时间内被调度执行。事实上当内核执行长的系统调用时,实时进程要等到内核中运行的进程退出内核才能被调度,由此产生的响应延迟,在如今的硬件条件下,会长达100ms级。这对于那些要求高实时响应的系统是不能接受的。而可抢占的内核不仅对Linux的实时应用至关重要,而且能解决Linux对多媒体(videoaudio)等要求低延迟的应用支持不够好的缺陷。

6. 多处理器支持

Linux系统支持多处理器,每个处理器可以运行任何任务,没有任何区别。这样系统可以自动把负载均衡到不同的CPU上。

7. 文件系统

面向对象的虚拟文件系统设计(VFS),使得Linux广泛支持各种文件系统

8. STREAMS (笔者按:没明白)



除此之外,Linux还具备以下优点:

1. 免费

2. 组件可选,内核可定制

3. 支持低端廉价的机器

4. 高效

5. 稳定,和优秀的Linux开发群体

6. 可定制到很小

7. 兼容,和广泛的硬件支持

8. 支持好,流行



2. 硬件支持

支持各种处理器架构



3. Linux版本

Linux2.52.5之前,Linux版本由3个数字组成,比如2.6.10,前两个是版本,最后一个是发布号。中间的数字,偶数代表稳定版本,奇数代表开发版本。

然而Linux2.6之后,中间的数字不再区分稳定或开发版本,新的发布(release)都是不稳定的,补丁(patch)版本才是稳定的。也就是增加了一个patch号。比如:2.6.11.12,其中2.6.11是发布版本,最后的12是该版本的补丁版本。



4. 基本的操作系统概念

操作系统实际包含内核和其它一些基本的程序,因为内核是最重要和关键的,所以这里用操作系统指代内核。

操作系统(内核)主要功能:

1. 和硬件交互,驱动硬件平台组件

2. 提供应用程序运行环境

大多数操作系统隔离低层硬件,应用程序访问硬件必须通过内核,由内核来管理权限,和仲裁。

为了保护这种机制,现代处理器架构引入两种CPU执行模式,应用程序运行在非特权模式,内核运行在特权模式。



除此之外,还有以下需求或概念影响操作系统的设计。

多用户系统



用户和组



进程(应用程序)

这里进程指的是,一个程序的运行实例,它可以包含多个共享地址空间的线程(LWP轻量级进程)。或者说一个程序运行的上下文。



5. 内核架构

微内核比单内核要慢些。

微内核理论上更有优势,主要是逻辑上更清晰。微内核更方便移植。

Linux虽然是单内核,但设计具备很多微内核的优点。Linux引入模块概念,模块可以动态加载或卸载。模块虽然不像微内核设计里的系统组件作为独立进程运行,模块的使用具备以下优点:

1. 促进软件模块化

2. 独立于处理器架构

3. 动态加载卸载,有利使用内存

4. 无性能损失(微内核模块间通信损失性能)



6. Linux文件系统概述

文件



硬链接和软链接

硬链接,即链接,一个文件可以有多个硬链接,删除了所有的硬链接才删除该文件。硬链接即文件名。

软链接,有点像快捷方式,删除软链接对文件没有任何影响,创建软链接,相当于创建了一个软链接的文件。

$ ln -s p1 p2



文件类型

1. 普通文件

2. 目录

3. 软链接

4. 块设备文件

5. 字符设备文件

6. 管道

7. 套接字(Socket)



文件描述符和Inode

Unix抽象里,文件信息和文件内容是分开放置的。

文件系统操作一个文件需要的信息,放在Inode数据结构里,包括:

文件类型,硬链接个数,大小,设备Idinode号,UID,Group ID,时间戳,权限

可以这么理解:目录里的文件名是硬链接,关联一个inodeinode指向文件的存储位置。而目录本身也是一个文件。



权限和文件模式

suid: 执行程序的进程是沿袭进程执行者的用户Id,还是沿袭文件的用户ID等。

sgid, sticky:类似



文件相关的系统调用

open()read(),write(), lseek(), close(), rename(), unlink()



7. Linux内核概览

进程/内核模型

进程/内核模型:当进程需要一个内核服务,需要通过系统调用。系统调用通过cpu指令从用户态切换到内核态。



进程实现

每个进程有一个进程描述符。

进程切换时,内核保存当前进程状态:程序指针,栈指针,通用寄存器,等。

可重入内核

内核可重入指,一个进程进入内核后,另一个进程也可以进入内核。当一个进程调用某个系统调用阻塞在内核,另外一个进程依旧可以调用该系统调用。

内核控制路径(kernelcontrol path):内核响应系统调用,处理例外或中断时,这些情况下内核的执行路径。

可重入值,多个内核控制路径同时发生,而不需要等待之前的路径完成。



进程地址空间

每个进程运行在自己的地址空间。当进程运行在用户态,进程有自己的栈,数据和代码段。当运行在内核态,进程使用内核的数据和代码段,并且拥有另外一个私有的栈。

由于内核可重入,几个内核控制路径可以轮流执行。每个内核路径都有自己的内核栈。

所以内核程序还是不同于应用应用程序的,应用程序是main()入口,内核启动后,系统调用是其入口,中断也是其内部中断处理程序的入口。



同步和临界区域

实现可重入的内核需要同步技术。

竞态(racecondition)指多个进程共享资源,结果会因进程调度时序不同而差异时。

原子操作:比如读某个变量,然后变量减一;两个动作若在一个指令上完成,称为原子操作

临界区域:指某段代码区域,一次只能一个进程执行,否则可能产生竞态。

几种同步机制:

1. 关闭内核抢占

2. 禁止中断

3. 信号量

down(),当信号量为0down()把当前进程加入到信号量的等待队列,然后调用内核调度器。。。

4. 自旋锁(spinlock)

spinlock,是一个无限循环不断查询锁是否打开,它是不让出CPU的。所以spinlock对单处理器是没有用的,必须需要另外一个处理器来解锁,而不是进入等待队列,让另外的进程来解锁。spinlock对多处理器才有用,比信号量更高效。



信号和进程间通信

信号:unix信号用于通知进程系统事件

信号可以是用户发给后台进程,如SIGKILL,也可以是内核发送某个例外,如SIGSEGV给进程。

信号可用于进程间通信。

信号的处理:进程可以处理信号,也可忽略。如果忽略该信号,内核会执行默认的动作,比如中止进程,挂起进程,或恢复进程。



其它进程间通信,SystemV IPCPOSIX消息队列。



进程管理

Unix严格区分进程和程序。fork()用于创建一个进程,而exec()用于装载和运行一个程序

“Copy on Write”fork()的子进程会共享母进程的地址空间,当写入某区域时才申请新的页



僵尸进程

如果母进程没有通过wait4()回收子进程,终止的子进程在内核里变成僵尸进程,不运行,但对应的task_struct未释放。

母进程终止时,她的子进程会变成init的子进程,子进程终止时作为init的子进程而被回收。



进程组和登录会话



内存管理

虚拟内存

虚拟地址空间。虚拟内存是在应用程序内存和MMU之间的一层逻辑。

RAM使用



内核内存申请

Linux 采用Slab分配器



进程虚拟地址空间管理

进程地址空间



页高速缓存

提高块设备访问效率,尤其磁盘文件



设备驱动

内核对待所有设备采用统一方式,通过统一接口访问。

设备是被抽象成文件,因此设备驱动是挂在虚拟文件系统之下。

0 0
原创粉丝点击