Linux---架构概览
一、Linux 架构分层的深度解析
1. 用户空间(User Space)
用户空间是应用程序运行的环境,与内核空间隔离,确保系统稳定性。
-
应用程序层:
- 用户程序:如
edge、vim,通过调用标准库(如glibc)间接使用系统调用。 - 动态链接:程序依赖共享库(
.so文件),由动态链接器(ld-linux.so)加载。 - 执行权限:通过
execve()系统调用启动程序,结合文件权限(如rwx)控制执行。
- 用户程序:如
-
系统工具链:
- GNU Coreutils:提供基础命令(
ls、cp),通过 Shell 脚本组合实现复杂功能。 - Shell 工作原理:
- 解析命令为
argv参数,调用fork()创建子进程,再通过exec()执行命令。 - 管道(
|)通过匿名管道(pipe())实现进程间通信。
- 解析命令为
- 图形界面:
- X11/Wayland 协议负责窗口管理,GNOME/KDE 等桌面环境运行在显示服务器之上。
- GNU Coreutils:提供基础命令(
2. 内核空间(Kernel Space)
内核直接管理硬件,提供系统服务,代码运行在特权模式(Ring 0)。
-
系统调用接口(SCI):
- 系统调用表:每个系统调用对应唯一编号(如
__NR_read),通过syscall指令触发软中断(如int 0x80)。 - 参数传递:通过寄存器(x86)或堆栈传递参数,返回值存入
eax寄存器。 - 示例:
open("/file", O_RDWR)触发sys_open(),返回文件描述符(fd)。
- 系统调用表:每个系统调用对应唯一编号(如
-
内核子系统协作:
- 进程调度:当进程通过
sched_yield()主动让出 CPU,或时间片耗尽时触发调度。 - 中断处理:硬件中断(如键盘输入)触发中断服务程序(ISR),通过
irq_handler处理。
- 进程调度:当进程通过
二、核心子系统深度剖析
1. 进程管理
-
进程与线程的实现:
- 进程描述符(task_struct):内核用此结构体管理进程的所有信息(PID、内存映射、打开文件等)。
- 线程实现:线程共享进程的地址空间,通过
clone()系统调用创建,标志位指定共享资源(如CLONE_VM共享内存)。 - 轻量级进程(LWP):Linux 线程本质是 LWP,由内核调度,与 POSIX 线程库(pthread)配合使用。
-
调度器(CFS):
- 红黑树与 vruntime:所有可运行进程按
vruntime(虚拟运行时间)排序,CFS 选择最小vruntime的进程执行。 - 时间片计算:
vruntime增长速率与进程优先级成反比(高优先级进程vruntime增长更慢)。 - 实时调度类:
SCHED_FIFO:进程一直运行直到主动让出或更高优先级进程就绪。SCHED_RR:相同优先级进程按时间片轮转。
- 红黑树与 vruntime:所有可运行进程按
-
进程间通信(IPC):
- 共享内存:通过
shmget()创建共享内存段,shmat()映射到进程地址空间。 - 信号量(Semaphore):控制对共享资源的访问,通过
semop()实现 P/V 操作。 - 消息队列:
msgget()创建队列,msgsnd()和msgrcv()发送/接收消息。
- 共享内存:通过
2. 内存管理
-
虚拟内存机制:
- 页表与多级分页:x86_64 使用 4 级页表(PGD、PUD、PMD、PTE),MMU 将虚拟地址转换为物理地址。
- 缺页异常:访问未映射的页时触发缺页中断,内核可能从磁盘加载数据(如交换区或文件映射)。
-
内存分配器:
- Buddy 算法:
- 将物理内存划分为 2^n 大小的块,分配时拆分,释放时合并相邻空闲块。
- 解决外部碎片问题,但可能产生内部碎片。
- Slab 分配器:
- 针对小对象(如
inode、task_struct),预分配内存池,减少内存分配开销。 - 每个 Slab 包含多个对象,通过缓存(
kmem_cache)管理。
- 针对小对象(如
- Buddy 算法:
-
Swap 管理:
- 页面换出:当物理内存不足时,
kswapd内核线程将不活跃页写入交换分区。 - 交换优先级:通过页面标志(如
PG_active、PG_referenced)判断页面活跃度。
- 页面换出:当物理内存不足时,
3. 文件系统
-
虚拟文件系统(VFS):
- 抽象接口:
file_operations结构体定义文件操作(如read()、write())。dentry缓存目录项,加速路径查找。
- 挂载点:通过
mount()系统调用将文件系统挂载到目录树。
- 抽象接口:
-
Ext4 文件系统:
- 日志(Journal):
- 写操作先写入日志,再提交到磁盘,确保崩溃后可通过日志恢复一致性。
- 日志模式:
journal(记录元数据和数据)、ordered(仅记录元数据,数据先写)。
- 延迟分配(Delayed Allocation):文件写入时先缓存数据,分配物理块推迟到刷新时,减少碎片。
- 日志(Journal):
-
设备文件:
- 字符设备:如
/dev/tty,通过read()/write()逐字节访问。 - 块设备:如
/dev/sda,数据以块为单位读写,由 I/O 调度器合并请求。
- 字符设备:如
4. 网络子系统
-
TCP/IP 协议栈:
- 数据包处理流程:
- 链路层:网卡驱动接收帧,解析 MAC 地址。
- 网络层:IP 协议处理路由(通过路由表
fib_table),分片与重组。 - 传输层:TCP 协议维护连接状态(
struct sock),处理重传与拥塞控制(如 CUBIC 算法)。
- 套接字(Socket):
- 通过
socket()创建,类型包括SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)。 - 绑定端口后通过
listen()等待连接,accept()接受新连接。
- 通过
- 数据包处理流程:
-
Netfilter 框架:
- 五个钩子点:
NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_FORWARD、NF_IP_LOCAL_OUT、NF_IP_POST_ROUTING。 - iptables 规则示例:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许 SSH 连接
- 五个钩子点:
5. 设备驱动
-
驱动模型:
- 设备树(Device Tree):描述硬件资源配置(如 ARM 平台),替代传统的硬编码配置。
- sysfs 文件系统:通过
/sys目录暴露设备信息(如/sys/class/net/eth0)。
-
模块加载:
- 编译与加载:驱动代码编译为
.ko文件,通过insmod加载,rmmod卸载。 - 依赖管理:
modprobe自动处理模块依赖关系。
- 编译与加载:驱动代码编译为
三、Linux 启动流程的详细步骤
-
BIOS/UEFI 阶段:
- 硬件自检(POST):检测 CPU、内存、外设。
- 引导设备选择:按 BIOS 设置顺序(如硬盘、USB)寻找引导扇区。
-
Bootloader(GRUB):
- 引导菜单:加载
grub.cfg,显示可启动内核列表。 - 加载内核:读取
vmlinuz和initramfs到内存,移交控制权。
- 引导菜单:加载
-
内核初始化:
- 解压与启动:解压内核镜像,初始化核心子系统(内存管理、进程调度)。
- 挂载根文件系统:
initramfs提供临时根文件系统,加载真实根文件系统驱动(如 Ext4)。
-
用户空间初始化:
- init 进程:
- Systemd:并行启动服务单元(
.service文件),管理依赖关系。 - 运行级别:
systemctl isolate multi-user.target切换运行模式。
- Systemd:并行启动服务单元(
- init 进程:
四、Linux 设计哲学的实践体现
-
一切皆文件:
- /proc 文件系统:通过
/proc/<pid>/status查看进程状态,/proc/cpuinfo获取 CPU 信息。 - 伪终端(PTY):通过
/dev/pts/0实现终端会话,SSH 连接依赖此机制。
- /proc 文件系统:通过
-
模块化设计:
- 热插拔支持:插入 USB 设备时,内核自动加载
usb-storage.ko驱动。 - 自定义内核:通过
make menuconfig裁剪不需要的模块,编译专属内核。
- 热插拔支持:插入 USB 设备时,内核自动加载
-
KISS 原则的典型应用:
- 文本处理流水线:
grep "error" log.txt | awk '{print $1}' | sort | uniq -c组合多个工具完成任务。
- 文本处理流水线:
五、安全机制的实现细节
-
Capabilities 机制:
- 细分特权:传统 root 权限被拆分为数十种能力(如
CAP_NET_BIND_SERVICE允许绑定低端口)。 - 设置能力:通过
setcap cap_net_bind_service=+ep /usr/bin/myapp赋予程序特定权限。
- 细分特权:传统 root 权限被拆分为数十种能力(如
-
LSM 框架:
- SELinux:
- 强制访问控制(MAC),基于安全上下文(如
user_u:role_r:type_t)限制进程访问资源。 - 策略规则示例:
allow httpd_t var_log_t:file { read write };。
- 强制访问控制(MAC),基于安全上下文(如
- SELinux:
-
命名空间(Namespaces):
- PID 命名空间:容器内进程 PID 从 1 开始,与宿主机隔离。
- 网络命名空间:每个容器拥有独立网络栈,通过 veth pair 连接宿主机。
六、性能优化技术详解
-
I/O 调度器选择:
- Deadline 调度器:为每个请求设置截止时间,防止饿死(适合数据库负载)。
- Kyber:针对 NVMe SSD 设计,基于队列深度动态调整。
-
内存优化:
- 透明大页(THP):自动合并 2MB 大页,减少 TLB 未命中次数(需内核配置
CONFIG_TRANSPARENT_HUGEPAGE)。 - 内存压缩(zswap):将不活跃页压缩后存入内存,而非写入交换区。
- 透明大页(THP):自动合并 2MB 大页,减少 TLB 未命中次数(需内核配置
-
eBPF 的高级应用:
- 动态追踪:通过
bpftrace脚本监控内核函数调用。 - 网络加速:XDP(eXpress Data Path)在网卡驱动层处理数据包,实现 DDoS 防护。
- 动态追踪:通过
总结与学习建议
Linux 的复杂性源于其广泛的应用场景和高度优化的设计。要深入理解:
-
实践方法:
- 使用
strace跟踪系统调用:strace -f -o log.txt gcc hello.c。 - 通过
/proc和/sys实时查看内核状态:cat /proc/meminfo。
- 使用
-
源码学习:
- 阅读内核源码(如进程调度代码在
kernel/sched/目录)。 - 使用 QEMU + GDB 调试内核启动流程。
- 阅读内核源码(如进程调度代码在
-
性能分析工具:
perf:分析 CPU 热点(perf record -g ./program)。ftrace:跟踪内核函数调用链。
通过结合理论、代码和工具,可以逐步掌握 Linux 的核心机制,为系统级开发和运维打下坚实基础。
人的精神思想方面的优势越大,给无聊留下的空间就越小。 —叔本华
相关文章:
Linux---架构概览
一、Linux 架构分层的深度解析 1. 用户空间(User Space) 用户空间是应用程序运行的环境,与内核空间隔离,确保系统稳定性。 应用程序层: 用户程序:如 edge、vim,通过调用标准库(如 …...
2501,20个窗口常用操作
窗口是屏幕上的一个矩形区域.窗口分为3种:覆盖窗口,弹窗和子窗口.每个窗口都有由系统绘画的"非客户区"和应用绘画的"客户区". 在MFC中,CWnd类为各种窗口提供了基类. 1,通过窗柄取得CWnd指针 可调用Cwnd::FromHandle函数,通过窗柄取得Cwnd指针. void CD…...
[论文总结] 深度学习在农业领域应用论文笔记14
当下,深度学习在农业领域的研究热度持续攀升,相关论文发表量呈现出迅猛增长的态势。但繁荣背后,质量却不尽人意。相当一部分论文内容空洞无物,缺乏能够落地转化的实际价值,“凑数” 的痕迹十分明显。在农业信息化领域的…...
蓝桥杯例题一
不管遇到多大的困难,我们都要坚持下去。每一次挫折都是我们成长的机会,每一次失败都是我们前进的动力。路漫漫其修远兮,吾将上下而求索。只有不断努力奋斗,才能追逐到自己的梦想。不要害怕失败,害怕的是不敢去尝试。只…...
WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理
WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理 一、前言二、WPF 事件基础概念2.1 事件的定义与本质2.2 常见的 WPF 事件类型 三、路由事件3.1 路由事件的概念与原理3.2 路由事件的三个阶段3.3 路由事件的标识与注册3.4 常见的路由事件示例 四、自定义事件处…...
C++封装红黑树实现mymap和myset和模拟实现详解
文章目录 map和set的封装map和set的底层 map和set的模拟实现insertiterator实现的思路operatoroperator- -operator[ ] map和set的封装 介绍map和set的底层实现 map和set的底层 一份模版实例化出key的rb_tree和pair<k,v>的rb_tree rb_tree的Key和Value不是我们之前传统意…...
洛谷P11464 支配剧场
支配剧场 题目背景 May all the beauty be blessed. 题目描述 布洛妮娅和符华在寻找琪亚娜的途中,被支配之律者困在了支配剧场的高塔回廊之中。布洛妮娅敏锐地发现,虚无回廊是由一些支配之律者生成的积木构成的,只要击碎其中一些积木&#…...
自动化数据备份与恢复:让数据安全无忧
友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…...
如何用matlab画一条蛇
文章目录 源代码运行结果代码说明结果 源代码 % 画蛇的代码 % 2025-01-28/Ver1 % 清空环境 clc; clear; close all;% 定义蛇的身体坐标 t linspace(0, 4*pi, 100); % 参数化变量 x t; % x坐标 y sin(t) 0.5 * sin(3*t); % y坐标,形成更复…...
DVC - 数据版本和机器学习实验的命令行工具和 VS Code 扩展
文章目录 一、关于 DVC二、快速启动三、DVC的工作原理四、VS代码扩展五、安装Snapcraft(Linux)Chocolatey (Windows)Brew (mac OS)Anaconda (Any platform)PyPI(Python)Package (Platform-specific)Ubuntu / Debian (deb)Fedora /…...
理解神经网络:Brain.js 背后的核心思想
温馨提示 这篇文章篇幅较长,主要是为后续内容做铺垫和说明。如果你觉得文字太多,可以: 先收藏,等后面文章遇到不懂的地方再回来查阅。直接跳读,重点关注加粗或高亮的部分。放心,这种“文字轰炸”不会常有的,哈哈~ 感谢你的耐心阅读!😊 欢迎来到 brain.js 的学习之旅!…...
Maui学习笔记- SQLite简单使用案例02添加详情页
我们继续上一个案例,实现一个可以修改当前用户信息功能。 当用户点击某个信息时,跳转到信息详情页,然后可以点击编辑按钮导航到编辑页面。 创建项目 我们首先在ViewModels目录下创建UserDetailViewModel。 实现从详情信息页面导航到编辑页面…...
typescript 简介
可选链操作符 可选链操作符( ?. ) 允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(nullish ) (null 或者 undefined) 的情况下不会引起错误&a…...
selenium定位网页元素
1、概述 在使用 Selenium 进行自动化测试时,定位网页元素是核心功能之一。Selenium 提供了多种定位方法,每种方法都有其适用场景和特点。以下是通过 id、linkText、partialLinkText、name、tagName、xpath、className 和 cssSelector 定位元素的…...
Autogen_core 测试代码:test_cache_store.py
目录 原始代码测试代码代码中用到的typing注解 原始代码 from typing import Dict, Generic, Optional, Protocol, TypeVarT TypeVar("T")class CacheStore(Protocol, Generic[T]):"""This protocol defines the basic interface for store/cache o…...
变压器的漏感
测量变压器漏感的时候需要将次级绕组短路: 测量变压器初级线圈的电感方法很简单,直接用LCR测量就可,无需像测量漏感那样将次级绕组短接:...
【新春特辑】2025年春节技术展望:蛇年里的科技创新与趋势预测
🔥【新春特辑】2025年春节技术展望:蛇年里的科技创新与趋势预测 📅 发布日期:2025年01月29日(大年初一) 在这个辞旧迎新的美好时刻,我们迎来了充满希望的2025年,也是十二生肖中的蛇…...
cursor软件的chat和composer分别是什么
Cursor 是一款基于人工智能的代码编辑器,集成了类似 ChatGPT 的功能,旨在帮助开发者更高效地编写代码。以下是 Cursor 中 Chat 和 Composer 的具体功能: 1. Chat Cursor 中的 Chat 是一个基于 AI 的聊天功能,类似于 ChatGPT&…...
从ChatGPT热潮看智算崛起
2025年1月7日,科智咨询发布《2025年IDC产业七大发展趋势》,其中提到“ChatGPT开启生成式AI热潮,智能算力需求暴涨,算力供给结构发生转变”。 【图片来源于网络,侵删】 为何会以ChatGPT发布为节点呢?咱们一起…...
攻克 AI 幻觉难题
当下,AI 已经成为我们生活中不可或缺的一部分。无论是智能语音助手,还是对话式的AI模型,它们凭借强大的算法和海量的数据,为我们答疑解惑、出谋划策。 然而,小编今天向AI提问:上山打老虎。他却回答&#x…...
格式化时间的插件
1.安装dayjs包 npm i dayjs 2.组件中的应用...
自创《艺术人生》浅析
艺术是生活的馈赠,艺术是苦痛的呻吟。 笔记模板由python脚本于2025-01-29 00:01:11创建,本篇笔记适合喜欢写诗读诗诵诗的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 …...
【Python-办公自动化】实现自动化输出json数据类型的分析报告和正逆转换
分析报告 import json from pprint import pprint, PrettyPrinterdef analyze_energy_data(file_path):"""能源数据分析与结构查看函数参数:file_path (str): JSON文件路径功能:1. 加载并解析JSON数据2. 显示数据结构概览3. 交互式结构探索"""…...
防御保护第一次实验:安全策略配置
一、实验拓扑 二、实验要求 三、需求分析 1.创建两个vlan 2.在ENSP中配置基于时间的ACL实现对于办公区PC访问OA Server的时间限制(工作日早8到晚6)。 3.通过配置基于MAC地址的ACL来实现对于生产区PC访问Web Server的限制(除PC3外不能访问&am…...
【Pytest】生成html报告中,中文乱码问题解决方案
链接上一篇文章:https://blog.csdn.net/u013080870/article/details/145369926?spm1001.2014.3001.5502 中文乱码问题,python3,Python3.7后,还一个文件就是result.py 因为中文可以在内容中,也可能在文件名,类名&…...
【ollama通过命令行启动后如何在网页端查看运行】
ollama通过命令行启动后如何在网页端查看运行 http://localhost:11434/...
Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin
Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.RectF …...
Jetpack Compose 和 Compose Multiplatform 还有 KMP 的关系
今天刚好看到官方发布了一篇文章,用于讨论 Compose Multiplatform 和 Jetpack Compose 之间的区别,突然想起之前评论区经常看到说 “Flutter 和 CMP 对于 Google 来说项目重叠的问题”,刚好可以放一起聊一聊。 最近写的几篇内容写的太干&…...
基于STM32的智能宠物喂食器设计
目录 引言系统设计 硬件设计软件设计 系统功能模块 定时喂食模块远程控制与视频监控模块食物存量检测与报警模块语音互动与用户交互模块数据记录与智能分析模块 控制算法 定时与手动投喂算法食物存量检测与低存量提醒算法数据记录与远程反馈算法 代码实现 喂食控制代码存量检测…...
python生成图片和pdf,快速
1、下载安装 pip install imgkit pip install pdfkit2、wkhtmltopdf工具包,下载安装 下载地址:https://wkhtmltopdf.org/downloads.html 3、生成图片 import imgkit path_wkimg rD:\app\wkhtmltopdf\bin\wkhtmltoimage.exe # 工具路径,安…...
