操作系统内核是什么?Linux 内核又是什么?读完这篇文章,我终于知道了
什么是操作系统 OS
操作系统(简称为 OS)是一种软件平台,可创建一个环境,用户可以在该环境中在计算设备上运行不同的应用程序。 操作系统充当软件程序和系统硬件组件之间的桥梁。 它被移动设备,标签,台式机,Web 服务器,视频游戏机等不同的设备所利用。市场上有各种操作系统可用,例如 Windows,Linux,Unix 和 Mac OSX。
操作系统的的组成
Bootloader:它负责设备的启动过程。
Shell:Shell 是一种编程语言,它可以控制其他文件,进程以及所有其他程序。
Kernel:它是操作系统的主要组件,管理内存,CPU 和其他相关组件。
Desktop Environment:这是用户通常与之交互的环境。
Graphical server(图形服务器):它是操作系统的子系统,用于在屏幕上显示图形
Applications: 这些是执行不同用户任务(例如 word,excel 等)的程序集。
Daemons : 后台服务提供商。
什么是内核 kernel
内核是操作系统的关键组件。 它借助进程间通信和系统调用,在硬件级别上充当应用程序和数据处理之间的桥梁。
每当将操作系统加载到内存中时,首先,将加载内核并将其保留在那里,直到操作系统关闭。 内核负责处理低级任务,例如任务管理,内存管理,风险管理等。
内核的任务
用于应用程序执行的流程管理。
内存和 I / O(输入/输出)管理。
系统调用控制(内核的核心行为)。
借助设备驱动程序进行设备管理。
内核空间,用户空间是什么?
内核空间
内核处于提升的系统状态,其中包括受保护的内存空间以及对设备硬件的完全访问权限。 此系统状态和内存空间统称为内核空间。 在内核空间内,对硬件和系统服务的核心访问进行管理,并作为服务提供给系统的其余部分。
用户空间
用户空间或用户域是在操作系统内核环境之外运行的代码,用户空间定义为操作系统用来与内核连接的各种应用程序或程序或库。
用户的应用程序是在用户空间中执行的,它们可以通过内核系统调用访问计算机可用资源的一部分。 通过使用内核提供的核心服务,可以创建用户级别的应用程序,例如游戏或办公软件。
PS:彻底掌握 Linux 内核内存管理,学习知识点内容:
第一天 剖析 Linux 内核内存管理(一)
1.1 内存泄漏/栈溢出
1.2 虚拟地址布局/内存映射
1.3 内存模型/页分配器
1.4 伙伴分配器/块分配器
第二天 剖析 Linux 内核内存管理(二)
2.1 kmalloc/vmalloc 系统调用
2.2 高速缓存/内存屏障
2.3 页表缓存/页回收机制
2.4 缺页中断/反碎片技术
内核的操作
内核是任何操作系统的心脏,因为它控制系统中的所有其他程序。 当设备启动时,内核会经历一个初始化的过程,例如检查内存。 它负责内存分配部分,并创建了一个运行应用程序的环境,而没有任何干扰。
内核充当服务提供者,因此程序可以请求内核完成多项任务,例如请求使用磁盘,网卡或其他硬件,并且内核为 CPU 设置中断以启用多任务处理。 它不让错误的程序进入其他程序的操作功能,从而保护了计算环境。 它通过不允许存储空间来阻止未经授权的程序进入入口,并限制它们消耗的 CPU 时间。
内核的分类
通常有三类内核:
Monolithic kernel: 它包含许多设备驱动程序,可在设备的硬件和软件之间创建通信接口。
它是操作系统广泛使用的内核。 在单片架构中,内核由可以动态加载和卸载的各种模块组成。 这种体系结构将扩展 OS 的功能,并允许轻松扩展内核。
使用单片式体系结构,内核的维护变得容易,因为当需要修复特定模块中的错误时,它允许相关模块进行加载和卸载。 因此,它消除了繁琐的工作,即降低并重新编译整个内核以进行很小的更改。 在单片内核中,卸载不再使用的模块更加容易。
Micro kernel: 它只能执行基本功能。
微内核已经发展成为单片内核的替代产品,以解决单片内核无法做到的内核代码不断增长的问题。 这种体系结构允许某些基本服务(例如协议栈,设备驱动程序管理,文件系统等)在用户空间中运行。 这样可以以最少的代码增强 OS 的功能,提高安全性并确保稳定性。
它通过使系统的其余部分正常运行而不会造成任何中断,从而限制了对受影响区域的损坏。 在微内核体系结构中,所有基本 OS 服务都可以通过进程间通信(IPC)提供给程序。 微内核允许设备驱动程序和硬件之间的直接交互。
Hybrid kernel: 它结合了单片内核和微内核的各个方面。
混合内核可以决定要在用户模式和主管模式下运行什么。 通常,在混合内核环境中,设备驱动程序,文件系统 I / O 之类的内容将在用户模式下运行,而服务器调用和 IPC 则保持在管理者模式下。 它提供了两个世界的最佳体验。
Linux 操作系统
Linux 是 Linus Torvalds 在 1991 年开发的开源平台。 它在各种设备中用作操作系统,例如在计算机,服务器,移动设备,大型机和其他嵌入式设备中。 由于它是开源软件,因此用户可以根据需要自定义此操作系统。 它支持几乎所有主要的计算机平台,例如 ARM,x86,SPARK 等。Linux 的最常见用法是用于 Server,但也用于台式机,电子书阅读器,智能手机等。
Linux 内核
内核是任何基于 Linux 的操作系统的核心组件。 它代表了台式机和服务器的 Linux 发行版的核心方面。 它具有整体架构,并且操作系统完全在内核空间中运行。 整体内核不仅包围中央处理器,IPC 和内存,而且具有系统服务器调用,设备驱动程序和文件系统管理。 Linux 内核充当设备软件和硬件之间的一层。
内核可以是单片,微内核或混合内核(例如 OS X 和 Windows 7)。 Linux 内核是类似于 UNIX 系统的单片计算机操作系统内核。 Linux 操作系统系列(通常称为 Linux 发行版)基于此内核。与微内核不同,单块内核不仅包含中央处理单元,内存和 IPC,还具有设备驱动程序,系统服务器调用和文件系统管理。他们最擅长与硬件通信并同时执行多项任务。由于这个原因,此处的过程反应速度很快。
但是,很少的挫折是所需的巨大安装和内存占用空间以及安全性不足,因为一切都以管理员模式运行。相反,随着用户服务和内核的分离,微内核对应用程序调用的反应可能会很慢。因此,与整体内核相比,它们的尺寸更小。微内核很容易扩展,但是编写微内核需要更多代码。 Linux 内核是用 C 和 Assembly 编程语言编写的。
内核源码结构
在 Linux 系统中查看内核源码,如图所示
arch 特定体系结构的代码
block 块设备 I/O 层
crypo 加密 API
Documentation 内核源码文档
drivers 设备驱动程序
firmware 使用某些驱动程序而需要的设备固件
fs VFS 和各种文件系统
include 内核头文件
init 内核引导和初始化
ipc 进程间通信代码
kernel 像调度程序这样的核心子系统
lib 同样内核函数
mm 内存管理子系统和 VM
net 网络子系统
samples 示例,示范代码
scripts 编译内核所用的脚本
security Linux 安全模块
sound 语音子系统
usr 早期用户空间代码(所谓的 initramfs)
tools 在 Linux 开发中有用的工具
virt 虚拟化基础结构
这份是基于 Linux 内核 4.0 版本的内核学习路线思维导图,下面有 Linux 内核相关视频学习资料:
Linux 内核相关学习视频,清晰版导图可以点击:学习资料 获取
Linux 内核与硬件的关系
内核可以通过所谓的中断来管理系统的硬件。 当硬件要与系统接口时,会发出一个中断,中断处理器,从而对内核执行相同的操作。 为了提供同步,内核可以禁用中断,无论是单个中断还是全部中断。 但是,在 Linux 中,中断处理程序不是在进程上下文中运行,而是在不与任何进程相关联的中断上下文中运行,这种特殊的中断上下文仅是为了让中断处理程序快速响应单个中断然后最终退出而存在 。
是什么使 Linux 内核与其他经典 Unix 内核不同?
Linux 内核和经典 Unix 内核之间存在显着差异,如下所示:
Linux 支持内核模块的动态加载
Linux 内核是抢占式的
Linux 具有对称的多处理器支持
Linux 具有开放软件特性,因此是免费的
Linux 忽略了内核开发人员称为“设计不良”的某些标准 Unix 功能
Linux 提供了带有设备类,可热插拔事件和用户空间设备文件系统的面向对象的设备模型
Linux 内核无法区分线程和正常进程
Linux 内核架构
内核仅仅是资源管理器。 被管理的资源可以是进程,内存或硬件设备。 它管理和仲裁多个竞争用户之间对资源的访问。 Linux 内核存在于用户空间下方的内核空间中,该空间是执行用户应用程序的位置。 为了使用户空间与内核空间进行通信,已合并了一个 GNU C 库,该库为系统调用接口提供了一个论坛,以连接到内核空间并允许转换回用户空间。
Linux 内核可以分为三个主要级别:
系统调用界面:这是最高层,并承担诸如读取和写入之类的基本操作。
内核代码:它位于系统调用接口下方,这是 Linux 支持的所有处理器体系结构的共同点,有时也定义为与体系结构无关的内核代码。
依赖于体系结构的代码:它在独立于体系结构的代码下,形成通常称为板级支持程序包(BSP)的程序-该程序包包含一个称为引导加载程序的小程序,它将操作系统和设备驱动程序放入内存。
Linux 内核的体系结构主要包括:系统调用接口,进程管理,虚拟文件系统,内存管理,体系结构和设备驱动程序,这些称为 Linux 内核的主要子系统。
系统调用界面(System call interface)
简单来说,系统调用就是用户程序和硬件设备之间的桥梁。用户程序在需要的时候,通过系统调用来使用硬件设备。系统调用是一种编程过程,用于承担从用户空间到内核的函数调用,其中程序从操作系统内核请求服务。 该接口可能取决于体系结构。它包括各种硬件服务,例如与硬件设备连接以及在内核的各个组成部分之间创建通信接口。 系统调用在操作系统和进程之间创建有效的接口。
进程管理 (Process management)
执行进程,内核负责创建和删除不同的进程,并监视它们与外部世界的连接。例如输入和输出。 它通过信号,进程间通信原语或管道来处理不同方法之间的通信。 除了所有这些之外,它还有一个调度程序,用于控制共享 CPU 的进程。
内存管理(Memory management)
内存是操作系统的重要组成部分,内存在所谓的页面中进行管理以提高效率。 Linux 包括管理可用内存的方法以及用于物理和虚拟映射的硬件机制,还提供交换空间。内存管理不仅仅管理 4KB 缓冲区,还远远不止于此。 Linux 还提供了 4kb 缓冲区以外的抽象(称为 slab 分配器)。 Slab 分配器使用 4kb 缓冲区作为基础,然后通过监视诸如页面已满,为空和部分使用之类的内容从内部分配结构。 这使方案可以动态增长,并可以支持系统的更重要需求。
虚拟文件系统(Virtual file system)
虚拟文件系统(VFS)是内核的重要组成部分,它为文件系统提供了标准的接口抽象。 它提供了系统调用接口和内核支持的文件系统之间的切换层。 VFS 在内核支持的文件系统和 SCI(系统调用接口)之间创建一个交换层。除了上述内容之外,Linux 还支持各种类型的文件系统,这些文件系统需要以不同的方式组织数据以物理格式存储。 例如,可以使用常用的 FAT 文件系统,Linux 标准 ext3 文件系统或其他几种格式来格式化磁盘。
设备驱动(Device drivers)
内核的大部分源代码存储在设备驱动程序中,这使特定的硬件设备可用。 Linux 提供了一个驱动程序子目录,该子目录又分为支持的各种设备,例如 I2 蓝牙,串行等。
体系结构(Architecture-dependent code)
即使大多数 Linux 在其独立体系结构上运行,也应考虑某些因素以提高体系结构效率和正常运行。 Linux 有许多子目录,每个体系结构子目录有许多其他子目录。 而且,这些子目录专注于内核的特定任务,例如内存管理,引导,内核等。
接口
系统调用和中断(System calls and Interrupts)
应用程序通过系统调用将信息传递给内核。 库包含应用程序可以使用的功能。 然后,这些库通过系统调用界面指示内核执行应用程序所需的任务。
中断提供了一种通过 Linux 内核管理系统硬件的方法。 如果硬件必须与系统通信,则可以通过处理器上的中断来解决问题,并将其传递给 Linux 内核。
Linux 内核接口
Linux 内核为执行不同任务和具有不同属性的用户空间应用程序提供了不同的接口。
它由两个独立的应用程序编程接口(API)组成:一个是内核用户空间,另一个是内核内部。
Linux API 是内核用户空间 API, 它使用户空间中的程序可以访问内核的系统资源和服务, 它由系统调用接口和 GNU C 库中的子例程组成。
Linux ABI
指的是内核用户空间 ABI(Application Binary Interface), 它存在于程序模块之间,是两个二进制程序模块之间的接口:模块之一是操作系统工具或库,第二个模块是用户运行的程序。
比较 API 和 ABI 时,不同之处在于 ABI 用于访问已编译的外部代码,而 API 是用于管理软件的结构。 定义重要的 ABI 主要是 Linux 发行版的工作,而不是 Linux 内核。 应该为每个指令集定义一个特定的 ABI,例如 x86-64。 Linux 产品的最终用户对 ABI 而不是 API 感兴趣。
它不过是内核用户空间 ABI(应用程序二进制用户界面)。 它存在于程序模块之间。 ABI 用于访问已编译并准备使用的代码。 ABI 是两个二进制程序模块之间的接口:这些模块之一是操作系统工具或库,第二个模块是用户运行的程序。
模块化内核
以前版本的 Linux 内核的方式是将其所有部分静态固定为一个整体。 但是,现代 Linux 内核的大部分功能包含在动态放入内核的模块中。 与单片类型相反,这称为模块化内核。 这样的设置允许用户加载或替换正在运行的内核中的模块,而无需重新启动。
Linux 可加载内核模块 (The Linux Loadable Kernel Module (LKM) )
如果要向 Linux 内核添加代码,则要做的第一件事就是向内核源代码树中添加一些源文件。 在某些情况下,您可能需要在运行时向内核添加代码,此过程称为可加载内核模块。
LKM 的好处:
LKM 节省时间并避免错误
它有助于快速发现 bugs
LKM 可以节省内存,因为它们仅在需要时才加载到内存中
它提供了更快的维护和调试时间
评论