《深入Linux内核架构》
内核的任务
技术层面:通俗的讲,内核是硬件和软件/程序之间沟通的桥梁,属于两者之间的中间层,有点像Android的HAL硬件抽象层。举个例子就是,复制一份数据,再硬件层是磁盘扇区之间的数据复制,需要从扇区A到内存,再从内存到扇区B,对于程序而言,只是一个复制数据的命令而已,不涉及对硬件的直接操作,间接的对硬件数据进行了修改。
系统层面:内核是资源管理器,管理系统中的所有资源,包括CPU时间、磁盘、网络、内存等。
程序开发层面:内核为程序开发提供了一系列的标准库,通过对库的调用,实现对系统软硬件的操作。
内核的实现策略-两种范式
微内核:把不同的功能分为不同的微内核(组件),优点是清楚的划分,缺点是个组件间通讯需要消耗额外的时间片。
宏内核:把微内核的各个组件打包到同一个内核文件中,不同组件之间可以直接相互访问,提高效率,缺点是组件间可能产生嵌套引用。Linux内核的模块话,侧面的也实现了微内核的组件划分效果。
内核的各个组成部分
进程切换与调度
Linux是多任务系统,但是同时只能运行不超过CPU数目的进程,内核会按照很短的时间在不同进程直接切换执行(用户感知不到),此部分概念与《操作系统》中一种,属于CPU时间片概念。
调度就是,不同进程有优先级之分,重要进程得到的CPU时间更多一点。
Unix 进程
Unix的进程是一种层次结构,每个进程都依赖于一个父进程,内核的启动程序init作为第一个进程,PID为0
创建进程的方式
- fork
fork会创建当前进程的副本,新进程与当前进程pid不同,当前进程的内存内容会被复制给新进程,Linux采用COW(写时复制)技术使新进程在写入内存数据之前,先与当前进程共享内存页。 - exec
exec讲新程序加载到当前进程的内存中执行,覆盖现在执行程序的内存页数据。
线程
又称为轻量级进程,与fork类似,但是只为新进程创建需要创建的资源,其余的与父进程共享,且减少了不同进程间的资源切换时间,此部分内容看《操作系统》一书更加易理解。
命名空间
命名空间就是一个进程所能看到的系统视图,是对全局资源的分组,使得属于不同命名空间的不同进程所看到的系统属性资源不同。虚拟化、容器都使用了此技术。
虚地址空间
虚拟地址空间的特权级别
内核把虚拟地址空间分为两个部分:核心态和用户态,使之彼此隔离,保护各个系统进程。可以对某些系统调用进行限制。
虚拟和物理地址空间
讲进程的虚地址空间映射到物理空间中,一个小方格代表一个页帧。