什么是 Linux 内核,怎么才能玩转它?
什么是操作系统 OS
操作系统(简称为 OS)是一种软件平台,可创建一个环境,用户可以在该环境中在计算设备上运行不同的应用程序。 操作系统充当软件程序和系统硬件组件之间的桥梁。 它被移动设备,标签,台式机,Web 服务器,视频游戏机等不同的设备所利用。市场上有各种操作系统可用,例如 Windows,Linux,Unix 和 Mac OSX。
视频教程推荐:
【鹅厂T8认证】2022年LinuxC/C++后台开发最强学习路线图
【备战秋招】互联网大厂秋招,嵌入式从入门到精通(小白零基础速学)
操作系统的的组成
Bootloader:它负责设备的启动过程。 Shell:Shell 是一种编程语言,它可以控制其他文件,进程以及所有其他程序。
Kernel:它是操作系统的主要组件,管理内存,CPU 和其他相关组件。
Desktop Environment:这是用户通常与之交互的环境。
Graphical server(图形服务器):它是操作系统的子系统,用于在屏幕上显示图形
Applications:这些是执行不同用户任务(例如 word,excel 等)的程序集。 Daemons : 后台服务提供商。
什么是内核 kernel
内核是操作系统的关键组件。 它借助进程间通信和系统调用,在硬件级别上充当应用程序和数据处理之间的桥梁。每当将操作系统加载到内存中时,首先,将加载内核并将其保留在那里,直到操作系统关闭。 内核负责处理低级任务,例如任务管理,内存管理,风险管理等。
内核的任务
用于应用程序执行的流程管理。
内存和 I / O(输入/输出)管理。
系统调用控制(内核的核心行为)。
借助设备驱动程序进行设备管理。
内核空间,用户空间是什么?
内核空间
内核处于提升的系统状态,其中包括受保护的内存空间以及对设备硬件的完全访问权限。 此系统状态和内存空间统称为内核空间。 在内核空间内,对硬件和系统服务的核心访问进行管理,并作为服务提供给系统的其余部分。
用户空间
用户空间或用户域是在操作系统内核环境之外运行的代码,用户空间定义为操作系统用来与内核连接的各种应用程序或程序或库。用户的应用程序是在用户空间中执行的,它们可以通过内核系统调用访问计算机可用资源的一部分。 通过使用内核提供的核心服务,可以创建用户级别的应用程序,例如游戏或办公软件。
内核的操作
内核是任何操作系统的心脏,因为它控制系统中的所有其他程序。 当设备启动时,内核会经历一个初始化的过程,例如检查内存。 它负责内存分配部分,并创建了一个运行应用程序的环境,而没有任何干扰。内核充当服务提供者,因此程序可以请求内核完成多项任务,例如请求使用磁盘,网卡或其他硬件,并且内核为 CPU 设置中断以启用多任务处理。 它不让错误的程序进入其他程序的操作功能,从而保护了计算环境。 它通过不允许存储空间来阻止未经授权的程序进入入口,并限制它们消耗的 CPU 时间。
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 内核该如何学习呢?
主要可以从七个模块来看:
操作系统原理
进程管理
线程管理
用户协议栈
设备驱动
内核组件
文件系统这里就分享给大家一份基于 Linux 内核 4.0 版本的内核学习路线思维导图和 Linux 内核相关视频文档学习资料
inux 内核与硬件的关系
内核可以通过所谓的中断来管理系统的硬件。 当硬件要与系统接口时,会发出一个中断,中断处理器,从而对内核执行相同的操作。 为了提供同步,内核可以禁用中断,无论是单个中断还是全部中断。 但是,在 Linux 中,中断处理程序不是在进程上下文中运行,而是在不与任何进程相关联的中断上下文中运行,这种特殊的中断上下文仅是为了让中断处理程序快速响应单个中断然后最终退出而存在 。
是什么使 Linux 内核与其他经典 Unix 内核不同?
Linux 内核和经典 Unix 内核之间存在显着差异,如下所示:
Linux 支持内核模块的动态加载
Linux 内核是抢占式的
Linux 具有对称的多处理器支持
Linux 具有开放软件特性,因此是免费的
Linux 忽略了内核开发人员称为“设计不良”的某些标准 Unix 功能
Linux 提供了带有设备类,可热插拔事件和用户空间设备文件系统的面向对象的设备模型
Linux 内核无法区分线程和正常进程
Linux 内核架构
内核仅仅是资源管理器。 被管理的资源可以是进程,内存或硬件设备。 它管理和仲裁多个竞争用户之间对资源的访问。 Linux 内核存在于用户空间下方的内核空间中,该空间是执行用户应用程序的位置。 为了使用户空间与内核空间进行通信,已合并了一个 GNU C 库,该库为系统调用接口提供了一个论坛,以连接到内核空间并允许转换回用户空间。
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 可以节省内存,因为它们仅在需要时才加载到内存中
它提供了更快的维护和调试时间
最后,给想了解学习 Linux 内核技术的朋友一个交流地,每天都会有内核技术的交流与教程,自学过程中的相关问题也可以互相解答探讨。
评论