读深入理解Linux内核 (前言和第一章)
来源:互联网 发布:苏州 青少年编程 编辑:程序博客网 时间:2024/05/20 21:22
前言
本书的价值
剖析操作系统的关键部分,重要算法,和重要数据结构,帮助您从海量的内核代码中找到路径,而不至于淹没其中。
要了解计算机究竟是怎么工作的,只了解计算机架构(处理器架构,总线,外设等)是不够的,本书讲述计算机硬件之上,软件核心,操作系统内核的实现。
本书不是乏味地陈述设计和展示代码,而是结合背景,历史和揭示设计背后的原因,所以是一本非常耐读的典藏。
每一章,先给出理论上的概述,然后讨论关键数据结构,再之后从最底层的函数讲到更高层的函数,直到支持应用程序的系统调用。
全书概貌
第二章:内存寻址,这是内存管理的基础(页表,虚存等),而内存管理是内核的核心
第三章:进程,以及用户态和内核态的切换
第四章:中断和例外,用户态和内核态切换的实现支撑
第五章:内核同步机制
第六章:时间(Timing)
第七章:进程的调度
第八章:内存管理
第九章:进程地址空间
第十章:系统调用
第十一章:信号
第十二章:虚拟文件系统
第十三章:I/O架构和设备驱动
第十四章:块设备驱动
第十五章:页高速缓冲,使用内存来减少硬盘的访问,极大提高系统性能
第十六章:文件访问
第十七章:页回收
第十八章:Ext2/Ext3文件系统
第十九章:进程间通信
第二十章:程序执行,解释用户程序如何执行
附A:Linux启动
附B:内核定制
第一章:介绍
严格来讲,Linux是操作系统内核,它不包含内核之外的操作系统组件,比如桌面,系统管理工具等。Linuxdistribution,比如Ubuntu,Fedora才是完整的操作系统。
Linux是类Unix操作系统,遵循POSIX(PortableOperating Systems based on Unix)标准。
1. Linux对比其它类Unix内核
Linux具备以下优秀商用Unix内核的优点:
1. 单内核
单内核是相对微内核而言(但是微内核不是更优秀么?),Linux是单内核
2. 动态加载模块,比如设备驱动
3. 内核线程
内核线程之间切换开销较小,因为在同一地址空间。Linux在很有限的几个方面用到内核线程(但为何这是优势?)。
4. 多线程支持
一个应用可以由很多轻量级进程(LWP– Lightweight process)组成,它们共享地址空间,打开的文件等。
大多数商业Unix,LWP是基于内核线程。而Linux中,LWP进程是最基本的执行单元,通过非标准的clone()系统调用产生。
5. 抢占式内核
可抢占式内核:即当进程位于内核空间时,有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程。
非抢占式内核:高优先级的进程不能中止正在内核中运行的低优先级的进程而抢占CPU运行。进程一旦处于核心态(例如用户进程执行系统调用),则除非进程自愿放弃CPU,否则该进程将一直运行下去,直至完成或退出内核
抢占式内核的意义:实时系统对响应时间有严格的限定,当一个实时进程被实时设备的硬件中断唤醒后,它应在限定的时间内被调度执行。事实上当内核执行长的系统调用时,实时进程要等到内核中运行的进程退出内核才能被调度,由此产生的响应延迟,在如今的硬件条件下,会长达100ms级。这对于那些要求高实时响应的系统是不能接受的。而可抢占的内核不仅对Linux的实时应用至关重要,而且能解决Linux对多媒体(video,audio)等要求低延迟的应用支持不够好的缺陷。
6. 多处理器支持
Linux系统支持多处理器,每个处理器可以运行任何任务,没有任何区别。这样系统可以自动把负载均衡到不同的CPU上。
7. 文件系统
面向对象的虚拟文件系统设计(VFS),使得Linux广泛支持各种文件系统
8. STREAMS (笔者按:没明白)
除此之外,Linux还具备以下优点:
1. 免费
2. 组件可选,内核可定制
3. 支持低端廉价的机器
4. 高效
5. 稳定,和优秀的Linux开发群体
6. 可定制到很小
7. 兼容,和广泛的硬件支持
8. 支持好,流行
2. 硬件支持
支持各种处理器架构
3. Linux版本
Linux2.5及2.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数据结构里,包括:
文件类型,硬链接个数,大小,设备Id,inode号,UID,Group ID,时间戳,权限
可以这么理解:目录里的文件名是硬链接,关联一个inode,inode指向文件的存储位置。而目录本身也是一个文件。
权限和文件模式
suid: 执行程序的进程是沿袭进程执行者的用户Id,还是沿袭文件的用户ID等。
sgid, sticky:类似
文件相关的系统调用
open(),read(),write(), lseek(), close(), rename(), unlink()
7. Linux内核概览
进程/内核模型
进程/内核模型:当进程需要一个内核服务,需要通过系统调用。系统调用通过cpu指令从用户态切换到内核态。
进程实现
每个进程有一个进程描述符。
进程切换时,内核保存当前进程状态:程序指针,栈指针,通用寄存器,等。
可重入内核
内核可重入指,一个进程进入内核后,另一个进程也可以进入内核。当一个进程调用某个系统调用阻塞在内核,另外一个进程依旧可以调用该系统调用。
内核控制路径(kernelcontrol path):内核响应系统调用,处理例外或中断时,这些情况下内核的执行路径。
可重入值,多个内核控制路径同时发生,而不需要等待之前的路径完成。
进程地址空间
每个进程运行在自己的地址空间。当进程运行在用户态,进程有自己的栈,数据和代码段。当运行在内核态,进程使用内核的数据和代码段,并且拥有另外一个私有的栈。
由于内核可重入,几个内核控制路径可以轮流执行。每个内核路径都有自己的内核栈。
所以内核程序还是不同于应用应用程序的,应用程序是main()入口,内核启动后,系统调用是其入口,中断也是其内部中断处理程序的入口。
同步和临界区域
实现可重入的内核需要同步技术。
竞态(racecondition)指多个进程共享资源,结果会因进程调度时序不同而差异时。
原子操作:比如读某个变量,然后变量减一;两个动作若在一个指令上完成,称为原子操作
临界区域:指某段代码区域,一次只能一个进程执行,否则可能产生竞态。
几种同步机制:
1. 关闭内核抢占
2. 禁止中断
3. 信号量
down(),当信号量为0,down()把当前进程加入到信号量的等待队列,然后调用内核调度器。。。
4. 自旋锁(spinlock)
spinlock,是一个无限循环不断查询锁是否打开,它是不让出CPU的。所以spinlock对单处理器是没有用的,必须需要另外一个处理器来解锁,而不是进入等待队列,让另外的进程来解锁。spinlock对多处理器才有用,比信号量更高效。
信号和进程间通信
信号:unix信号用于通知进程系统事件
信号可以是用户发给后台进程,如SIGKILL,也可以是内核发送某个例外,如SIGSEGV给进程。
信号可用于进程间通信。
信号的处理:进程可以处理信号,也可忽略。如果忽略该信号,内核会执行默认的动作,比如中止进程,挂起进程,或恢复进程。
其它进程间通信,SystemV IPC,POSIX消息队列。
进程管理
Unix严格区分进程和程序。fork()用于创建一个进程,而exec()用于装载和运行一个程序
“Copy on Write”:fork()的子进程会共享母进程的地址空间,当写入某区域时才申请新的页
僵尸进程
如果母进程没有通过wait4()回收子进程,终止的子进程在内核里变成僵尸进程,不运行,但对应的task_struct未释放。
母进程终止时,她的子进程会变成init的子进程,子进程终止时作为init的子进程而被回收。
进程组和登录会话
内存管理
虚拟内存
虚拟地址空间。虚拟内存是在应用程序内存和MMU之间的一层逻辑。
RAM使用
内核内存申请
Linux 采用Slab分配器
进程虚拟地址空间管理
进程地址空间
页高速缓存
提高块设备访问效率,尤其磁盘文件
设备驱动
内核对待所有设备采用统一方式,通过统一接口访问。
设备是被抽象成文件,因此设备驱动是挂在虚拟文件系统之下。
- 读深入理解Linux内核 (前言和第一章)
- 《深入理解Linux内核》读书笔记第一章 绪论(1)
- 《深入理解Linux内核》读书笔记 第一章 绪论(2)
- 《深入理解Linux内核》读书笔记 第一章 绪论(1) .
- 《深入理解Linux内核》读书笔记 第一章 绪论(2) .
- 【深入理解Linux内核】第一章 绪论
- 《深入理解Linux内核》学习笔记-第一章
- 《深入理解Linux内核》读书笔记:第一章 绪论
- 《深入理解linux内核》读书笔记 -- 第一章 绪论
- 深入理解Linux内核 第一章笔记
- 深入理解计算机系统001——前言和第一章
- 《深入理解Linux内核》学习笔记——第一章
- 深入linux内核架构-第一章-简介和概述
- 《深入Linux内核架构》读书笔记第一章简介和概述
- 深入理解LINUX内核
- 深入理解 Linux 内核
- 深入理解linux内核
- 深入理解 Linux 内核
- vs 生成时提示obj的exe被占用
- 提高SQL查询效率 的10大方法
- Android客户端代码保护技术-完整性校验
- Android入门教程 Service的用法
- Handler 和 Looper 来满足线程间的通信
- 读深入理解Linux内核 (前言和第一章)
- Inflate()---Android之Inflate()方法用途
- LeetCode—400. Nth Digit
- @RequestMapping注解方法返回值意义
- Centos7 Nexus Maven 开机启动
- Cocos2d-x下Lua调用自定义C++类和函数的最佳实践
- nodejs学习-post请求处理
- CSS:CSS概述与引用
- java自定义类加载器