操作系统概念
操作系统属于软件范畴,负责管理系统的硬件资源。OS具备的功能:1.为应用程序提供执行环境。2.为多用户和应用程序管理计算机的硬件资源。3.虚拟化功能。4.支持并发。
宏内核与微内核架构
宏内核:所有的内核代码都编译成二进制文件并运行在一个大内核地址空间中,整体架构如下:
微内核:把操作系统分成多个独立的功能模块,每个功能模块之间的访问需要通过“消息”来完成,因此效率没有宏内核架构高:
宏内核的优点:设计简洁,性能好
微内核的优点:模块化的特点更具实时性
工程实践中,linux不断融入微内核的精华到内核中,例如模块化设计思想,动态加载内核模块等,因此linux内核支持模块化开发,许多功能都可以编译为一个模块,并且支持动态的加载和卸载(例如许多设备的驱动程序),这一点上宏内核架构就做不到,宏内核类似于静态编译的结果而不支持动态取舍。
OS允许CPU运行在用户态和内核态,而 linux 使用ring0和ring3两种模式实现内核态和用户态。
linux内核为内核态和用户态的切换提供机制:系统调用(本质是中断,中断是进入内核态的唯一方法)
用户程序可能大部分运行在用户态,但可能需要使用系统资源(例如磁盘),此时需要通过系统调用的方法进入内核空间。
体系结构Arch抽象层:
linux内核支持多种架构,例如ARM,X86等,目前已经支持几十种体系结构,而Arch抽象层抹去了不同架构之间的硬件差异,做了一层统一的抽象。在linux内核5.6.18版本的源码中,直接把不同架构做一个分目录操作,以提供对各个架构的支持。
内核在操作系统中的位置
- 用户进程:用户应用程序是运行在 Linux 操作系统最高层的一个庞大的软件集合。当一个用户程序在操作系统之上运行时,它成为操作系统中的一个进程。
- 系统调用接口:在应用程序中, 可通过系统调用来调用操作系统内核中特定的过程, 以实现特定的服务。系统调用本身也是由若干条指令构成的过程。但它与一般的过程不同,主要区别是:系统调用是运行在内核态(或叫系统态),而一般过程是运行在用户态。在 Linux 中,系统调用是内核代码的一部分。
- Linux内核:内核是操作系统的灵魂,它负责管理磁盘上的文件、内存,负
责启动并运行程序,负责从网络上接收和发送数据包等。简言之,内核实际是抽象的资源操作到具体硬件操作细节之间的接口。 - 硬件
Linux内核抽象结构
linux内核有五大主要子系统,他们之间的关系如下:
(1)进程调度(SCHED)控制着进程对 CPU 的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际是仅等待 CPU 资源的进程,如果某个进程在等待其他资源,则该进程是不可运行进程。Linux 使用了比较简单的基于优先级的进程调度算法选择新的进程。
(2)内存管理(MM)允许多个进程安全地共享主内存区域。Linux 的内存管理支持虚拟内存,即在计算机中运行的程序,其代码、数据和堆栈的总量可以超过实际内存的大小,操 作系统只将当前使用的程序块保留在内存中,其余的程序块则保留在磁盘上。必要时,操作系统负责在磁盘和内存之间交换程序块。
内存管理从逻辑上可以分为硬件无关的部分和硬件相关的部分。硬件无关的部分提供了进程的映射和虚拟内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。
(3)虚拟文件系统(Virtul File System,VFS)隐藏了各种不同硬件的具体细节,为所有设备提供了统一的接口,VFS 还支持多达数十种不同的文件系统,这也是 Linux 较有特色的一部分
虚拟文件系统可分为逻辑文件系统和设备驱动程序。逻辑文件系统指 Linux 所支持的文件系统,如 ext2,fat 等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
(4)网络接口(NET)提供了对各种网络标准协议的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序两部分。网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱动程序。
(5)进程间通信(IPC) 支持进程间各种通信机制。
Linux内核源码组织
为了深入地了解Linux的实现机制,还必须阅读Linux的内核源代码,下面是对有关源代码的介绍。内核源代码的版本多,对不同的内核版本,系统调用一般是相同的。新版本也许可以增加一个新的系统调用,在大多数情况下,设备文件将仍然相同,而另一方面,版本之间的内部接口有所变化。
- arch目录:不同平台体系相关代码;
- block目录:块驱动设备
- certs目录:与认证和签名相关代码
- crypto目录:内核常用加密、压缩算法等代码;
- Documentation目录:描述模块功能与协议规范代码;
- Drivers目录:驱动程序(USB总线、PCI总线、显卡驱动等等);
- firmware目录:主要是一些二进制固件;
- fs目录:虚拟文件系统代码;
- include目录:内核源码依赖绝大部分头文件;
- init目录:内核初始化代码,联系到内存各组件入口;
- ipc目录:进程间通信,比如共享内存、信号量匿名管道等等;
- kernel目录:内核核心代码,包括进程管理、IRQ、时间等等;
- lib目录:C标准库的子集;
- mm目录:内存管理相关实现;
- net目录:网络协议代码,比如TCP、IPv6、WiFi、以太网实现等等;
- samples目录:内核实列代码;
- scripts目录:编译和配置内核所需脚本;Perl/bash
- security目录:内核安全模型相关代码;如selinux
- sound目录:声卡驱动源码;
- tools目录:与内核交互;
- usr目录:用户打包和压缩内核的实现源码;
- virt目录:/kvm虚拟化目录相关支持实现。
- COPYING:许可和授权信息。Linux内核在GPLv2许可证下授权。该许可证授予任何人有权免费去使用、修改、分发和共享源代码和编译代码。然而,没有人可以出售源代码。
- CREDITS : 贡献者列表
- Kbuild : 这是一个设置一些内核设定的脚本。打个比方,这个脚本设定一个 ARCH变量,这是开发者想要生成的内核支持的处理器类型。
- Kconfig: 这个脚本会在开发人员配置内核的时候用到
- MAINTAINERS : 这是一个目前维护者列表,他们的电子邮件地址,主页,和他们负责开发和维护的内核的特定部分或文件。当一个开发者在内核中发现一个问题,并希望能够报告给能够处理这个问题的维护者时,这是是很有用的。
- Makefile :这个脚本是编译内核的主要文件。这个文件将编译参数和编译所需的文件和必要的信息传给编译器。
- README : 这个文档提供给开发者想要知道的如何编译内核的信息。
- REPORTING-BUGS : 这个文档提供如何报告问题的信息。