惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
有赞技术团队
有赞技术团队
www.infosecurity-magazine.com
www.infosecurity-magazine.com
大猫的无限游戏
大猫的无限游戏
爱范儿
爱范儿
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threatpost
V
Visual Studio Blog
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - Franky
人人都是产品经理
人人都是产品经理
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
The Cloudflare Blog
N
News and Events Feed by Topic
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
AWS News Blog
AWS News Blog
S
SegmentFault 最新的问题
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Spread Privacy
Spread Privacy
J
Java Code Geeks
博客园 - 聂微东
T
Tor Project blog
宝玉的分享
宝玉的分享
博客园 - 叶小钗
Webroot Blog
Webroot Blog
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
H
Heimdal Security Blog
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
I
InfoQ
Security Latest
Security Latest
Martin Fowler
Martin Fowler
Hacker News: Ask HN
Hacker News: Ask HN
P
Privacy International News Feed
C
CERT Recently Published Vulnerability Notes
Latest news
Latest news
雷峰网
雷峰网
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
Cisco Blogs
H
Help Net Security
L
LINUX DO - 最新话题
L
LINUX DO - 热门话题

Kenvix's Blog

实现带有Nvidia GPU+Rootless Podman+Docker+Systemd+自动驱动注入支持的systemd nspawn容器 | Kenvix's Blog 手动保留常用端口,解决 Windows 端口被 Hyper-V / WinNAT 占用的问题 免Telent/TTL屏蔽运营商新版光猫的远控、TR069和RMS,获取动态随机超级管理员密码并固化权限 | Kenvix's Blog 利用Windows卷影副本(Volume Shadow)找回被覆盖和删除的数据 | Kenvix's Blog 在Windows下实现WireGuard动态DNS解析(DDNS)的正确方法:避免无意义的开销 | Kenvix's Blog OpenWRT/DNSMasq 配置DHCP静态路由主动推送 实现流量直达和旁路由流量零代价分载 | Kenvix's Blog 解决 Windows 打开视频/图片文件夹很慢的问题 | Kenvix's Blog AltA2DP - 向支持Sony LDAC协议的耳机提供Windows下蓝牙LDAC音频编码器支持 | Kenvix's Blog (2024更新)修复黑群晖 DSM7.0 + Btrfs 存储空间/磁盘损毁/堪用 的问题 校园网白嫖思路分享:局域网中转-不花钱、不认证、高速上网 | Kenvix's Blog 在 Windows 上配置网卡多个 VLAN、多个虚拟网卡、实现单线多拨网速叠加(无需驱动支持) | Kenvix's Blog 解决视频彩铃、语音通话自动转视频通话导致打电话自动挂断的问题 | Kenvix's Blog 超低成本廉价考研教程:如何用小于¥500甚至¥300的开销考个研 | Kenvix's Blog 在 Ubuntu 21.10 上启用蓝牙 LDAC/AAC/AptX 高质量音频编码支持 在 VMware Workstation 桥接模式的网卡上让虚拟机使用 VLAN 的正确方法 在 Windows 上设置 NAT 或网络共享的正确方法——避免Wi-Fi热点无法使用 自编译 红米 AC2100 OpenWRT R21.7.26 Java 快速读取文本 (算法竞赛适用) | Kenvix's Blog 利用 ThreadLocal + Lambda,实现有状态变量的单例模式 | Kenvix's Blog 状态压缩的动态规划问题:骨牌完全覆盖棋盘问题 | Kenvix's Blog 我的 Windows 10 2004 新增 Bug 解决办法记录 解决 Android Studio 及 IDEA 中 Gradle 错误信息乱码的问题 Kotlin 的那些骚操作 | Kenvix's Blog 在普通的 Gradle Java/Kotlin 项目中使用 BuildConfig 修复国行 MIUI 打开 Google Play 始终提示 DF-DFERH-01 的问题 解决 VSCode 持续调用 WMIC 导致一个 CPU 核心完全被占满的问题 扔鸡蛋问题 | Kenvix's Blog 计算机幻觉从入门到入土 | Kenvix's Blog Java 注解预处理 Annotation Processing & 代码生成 Ubuntu 上通过以太网分享网络连接(NAT) | Kenvix's Blog Windows 选择指定的网卡来开承载网络型热点 | Kenvix's Blog 修复升级 Windows10 版本后所有内置应用闪退+第三方应用参数错误的问题 | Kenvix's Blog 配置用于 Gradle6.x + MySQL 8 的 jOOQ 3.14 代码自动生成 (已更新) 修复 Windows 环境下的程序访问 WSL 中的 MySQL 提示 Access Denied 的问题 修复 WSL 下 PHP+FastCGI 卡死的问题 使用任意磁盘或路径保存 Windows 文件历史记录 | Kenvix's Blog [1.12.2+Mod] MoeCraft :: 自由开放的科技向公益 Mod 服务器 Kenvix's Blog 禁用使用Intel核显的Windows笔记本自动调节亮度功能 | Kenvix's Blog 真正实现Minecraft高级登录(外置登录)的几种方案 | Kenvix's Blog 谈谈神舟的两艘贼船,Z7M-KP7S1 / Z7M-KP7SC USBCopyer: 插上U盘自动按需复制文件 | Kenvix's Blog USBCopyer 回调功能详细说明 | Kenvix's Blog C# 实现自定义"应用程序设置"的配置文件(user.config)存储路径 | Kenvix's Blog Win10 资源管理器为所有格式激活“编辑”按钮并修改文本文件“编辑”按钮的编辑器 | Kenvix's Blog 留言板 | Kenvix's Blog 又一次 Hello world | Kenvix's Blog Java 学习笔记 (仍在更新) | Kenvix's Blog 在Win10 Pro下挂载NFS(网络文件系统) | Kenvix's Blog Nginx 反向代理 Aria2 JSONRPC | Kenvix's Blog (Android6.0~9.0) 清除锁屏密码 | Kenvix's Blog WordPress 更换站点地址后批量修改文章/评论中的旧地址 | Kenvix's Blog 修复一加3/3T因固件过老导致刷入ROM时提示错误7的问题 | Kenvix's Blog 修复Android DM-Verity 警告 | Kenvix's Blog 贴吧云签到 资源索引(下载|文档|插件) | Kenvix's Blog 继续监控!使用树莓派+Motion实现实时视频监控并通过浏览器查看 | Kenvix's Blog 自动获取Pixiv每日排行榜第一张图片(600x600 | 可用于博客背景图) | Kenvix's Blog 使用树莓派实现定时拍照监控并发送邮件到邮箱 | Kenvix's Blog 好压 V2.7 Beta1 绿色版——功能强大,良心的压缩软件 | Kenvix's Blog 任意语言实现读取压缩包注释 | Kenvix's Blog 自己实现QQ群自定义分享(管理员开启了群交易?) | Kenvix's Blog MoeCDN - 加速Gravatar/GoogleAPIs等无法在国内访问的资源 | Kenvix's Blog [Minecraft] WebLogin-连接到你的服务器来检查玩家是否可以登录 | Kenvix's Blog Android卡刷包提示This package is for device: ... this device is ...的解决方案 Kenvix's Blog 给EMLOG评论框加上复选框[√]防止垃圾评论 | Kenvix's Blog 欢迎使用emlog | Kenvix's Blog
Linux 内核结构和子系统简介 | Kenvix's Blog
2021-02-17 · via Kenvix's Blog

本文是对 Anatomy of the Linux kernel 的部分翻译。

操作系统是计算机技术不可或缺的组成部分,是硬件设备在应用领域的延展与扩充,能够有效规划和设计计算机的工作流程,保证资源的合理配置和科学管理,确保用户能够便捷自如地操作计算机,满足多层面的任务需要。[1]在计算机上配置操作系统,主要是为了方便用户使用;提高系统资源利用率、提高系统吞吐量;方便增添新的功能和模块;遵循世界标准规范。一个没有配置操作系统的计算机几乎是无法使用的。

自计算机产生以来,人们就开始关注操作系统的研究。本文将就目前在移动端、桌面端、服务器使用较为广泛的操作系统内核Linux展开论述。

Linux 内核简介

图 1 Linux 基本体系结构

如图所示。用户和应用程序空间位于顶部。此处执行用户应用程序。用户空间下面是内核空间。Linux内核运行在此处。

另有GNU C库(glibc)。它提供连接到内核的系统调用接口(System call
interface),并提供了在用户空间(user-space)的应用程序和内核之间转换的功能。因为内核和用户应用程序占用不同的受保护地址空间。并且,尽管每个用户空间进程都占用其自己的虚拟地址空间,但内核仅占用一个地址空间。[2]

Linux内核可以进一步分为三个级别。顶部是系统调用接口,该接口实现诸如读取和写入之类的基本功能。在系统调用接口下方的是内核代码,是与体系结构无关的内核代码。该代码是Linux支持的所有处理器体系结构的通用代码。在此之下是与体系结构相关的代码,该代码通常称为BSP(Board
Support Package,
板级支持包)。该代码用作特定体系结构的处理器和特定平台的代码。

Linux内核分为许多不同的子系统。
Linux也可以看作是一个整体,因为它将所有基本服务集中到内核中(宏内核)。这与微内核体系结构不同,在微体系结构中,内核提供基本服务,例如通信,I/O,内存和进程管理,而更具体的服务则进入微内核层。

随着Linux的发展,Linux内核在内存和CPU使用率方面日渐高效,并且非常稳定。Linux最值得称道的方面是它的可移植性。可以将Linux编译为可在具有不同体系结构约束和需求的大量处理器和平台上运行。例如,许多家用路由器(例如小米、华硕、斐讯)都运行基于Linux的OpenWRT的厂商定制版。

Linux 主要子系统

操作系统的主要功能包括处理机管理、存储器管理、设备管理、文件管理、用户接口。处理机管理包括进程控制、进程同步、进程通信、调度。存储器管理包括内存分配、内存保护、地址映射、内存扩充。设备管理包括缓冲管理、设备分配、设备处理。文件管理:文件存储空间管理、目录管理、文件的读写管理和保护。用户接口包括联机用户接口、脱机用户接口、图形用户接口。[3]这正是Linux的主要子系统。

图 2 Linux的主要子系统

处理机管理: Linux 进程调度

进程(Process)调度负责进程的执行和管理。在内核中,这些进程称为”线程”,代表对处理器的一个虚拟化(virtualization)。。在用户空间中,虽然Linux并未将两个概念(进程和线程)分开,但我们仍然通常使用术语”进程(Process)”。内核通过SCI提供了一个应用程序接口(API)来创建新进程(fork,exec或其他
POSIX
函数),停止进程(强制结束(kill),退出(exit))以及在它们之间进行通信和同步(信号(signal)或其他POSIX机制)。此API通常被init程序(现在通常为systemd)调用来创建新进程。

在进程管理中,还需要在活动线程之间共享CPU。Linux内核实现了一种新颖的调度算法,该算法可在常数时间执行,而与争用CPU的线程数量无关。称为O(1)调度程序(O(1)
scheduler),表示调度一个线程和调度多个线程所花费的时间相同。O(1)调度程序还支持多个处理器(称为SMP(对称多处理))。

存储器管理: Linux 内存管理

内核管理的另一个重要事项是内存。为了提高效率,考虑到硬件管理虚拟内存的方式,内存以”页面”(对于大多数CPU体系结构,页大小为4KB)进行管理。
Linux存储器管理包括管理可用内存的方法,以及用于物理和虚拟内存映射的硬件机制。

但是内存管理不仅仅是管理4KB缓冲区。Linux还提供了4KB缓冲区(例如slab分配器)上的抽象。该内存管理方案使用4KB缓冲区作为基础,然后从内部分配结构,跟踪哪些页已满、哪些只使用了一部分、哪些为空。该方案能够根据更大系统的需求动态增长和收缩。

Linux支持多个内存”用户”,物理内存经常会耗尽。为了解决此问题,可以将页面移出内存并移至磁盘上。此过程称为交换(swapping),因为页面是从内存交换到硬盘上的。

文件管理: 虚拟文件系统(VFS)

图 3 VFS

虚拟文件系统(VFS)为文件系统提供了通用的接口抽象。
VFS在SCI和内核支持的文件系统之间提供了一个交换层(图3)。

VFS的顶部是通用的API的抽象,例如打开,关闭,读取和写入。
VFS的底部是文件系统的抽象,定义了如何实现上层功能。这些是给定文件系统的插件(内核有50个以上)。

文件系统层下面是缓冲区高速缓存,它为文件系统层提供了一组通用功能(独立于任何特定文件系统)。该缓存层通过将数据保留很短的时间(或预先推测性读取,以便在需要时可以使用数据)来优化对物理设备的访问。缓冲区高速缓存下方是设备驱动程序,这些驱动程序实现了特定物理设备的接口。

用户接口: 系统调用接口(SCI)

SCI是一个相当简单的”层”,提供了从用户空间到内核执行函数调用的方法。如前所述,即使在同一系列的处理器中,此接口也可能依赖于CPU体系结构。
SCI实际上是一种调用复用和解复用服务。

系统调用接口是为函数调用服务是一种特殊机制,主要完成从客户到内核数据的调用,并将源码储存起来。客户能够对进程进行控制,主要运用调用接口来实现,在各进程中能够完成实时通信。通信机制有多种,常使用的如signal等。

Linux 网络栈

Linux网络栈遵循根据协议本身建模的分层体系结构,例如OSI模型。在Linux网络栈中,IP协议仍是位于传输层(如TCP)之下的核心网络层协议。TCP之上是套接字(Socket)层,它是通过SCI调用的。

套接字(Socket)层是网络子系统的标准API,并为各种网络协议提供用户界面。包括原始IP协议数据单元(PDU)、TCP、UDP,套接字层提供了一套标准方法来管理连接并在端口之间传输数据。