Linux---架构概览

一、Linux 架构分层的深度解析

1. 用户空间(User Space)

用户空间是应用程序运行的环境,与内核空间隔离,确保系统稳定性。

  • 应用程序层

    • 用户程序:如 edgevim,通过调用标准库(如 glibc)间接使用系统调用。
    • 动态链接:程序依赖共享库(.so 文件),由动态链接器(ld-linux.so)加载。
    • 执行权限:通过 execve() 系统调用启动程序,结合文件权限(如 rwx)控制执行。
  • 系统工具链

    • GNU Coreutils:提供基础命令(lscp),通过 Shell 脚本组合实现复杂功能。
    • Shell 工作原理
      • 解析命令为 argv 参数,调用 fork() 创建子进程,再通过 exec() 执行命令。
      • 管道(|)通过匿名管道(pipe())实现进程间通信。
    • 图形界面
      • X11/Wayland 协议负责窗口管理,GNOME/KDE 等桌面环境运行在显示服务器之上。
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:相同优先级进程按时间片轮转。
  • 进程间通信(IPC)

    • 共享内存:通过 shmget() 创建共享内存段,shmat() 映射到进程地址空间。
    • 信号量(Semaphore):控制对共享资源的访问,通过 semop() 实现 P/V 操作。
    • 消息队列msgget() 创建队列,msgsnd()msgrcv() 发送/接收消息。
2. 内存管理
  • 虚拟内存机制

    • 页表与多级分页:x86_64 使用 4 级页表(PGD、PUD、PMD、PTE),MMU 将虚拟地址转换为物理地址。
    • 缺页异常:访问未映射的页时触发缺页中断,内核可能从磁盘加载数据(如交换区或文件映射)。
  • 内存分配器

    • Buddy 算法
      • 将物理内存划分为 2^n 大小的块,分配时拆分,释放时合并相邻空闲块。
      • 解决外部碎片问题,但可能产生内部碎片。
    • Slab 分配器
      • 针对小对象(如 inodetask_struct),预分配内存池,减少内存分配开销。
      • 每个 Slab 包含多个对象,通过缓存(kmem_cache)管理。
  • Swap 管理

    • 页面换出:当物理内存不足时,kswapd 内核线程将不活跃页写入交换分区。
    • 交换优先级:通过页面标志(如 PG_activePG_referenced)判断页面活跃度。
3. 文件系统
  • 虚拟文件系统(VFS)

    • 抽象接口
      • file_operations 结构体定义文件操作(如 read()write())。
      • dentry 缓存目录项,加速路径查找。
    • 挂载点:通过 mount() 系统调用将文件系统挂载到目录树。
  • Ext4 文件系统

    • 日志(Journal)
      • 写操作先写入日志,再提交到磁盘,确保崩溃后可通过日志恢复一致性。
      • 日志模式:journal(记录元数据和数据)、ordered(仅记录元数据,数据先写)。
    • 延迟分配(Delayed Allocation):文件写入时先缓存数据,分配物理块推迟到刷新时,减少碎片。
  • 设备文件

    • 字符设备:如 /dev/tty,通过 read()/write() 逐字节访问。
    • 块设备:如 /dev/sda,数据以块为单位读写,由 I/O 调度器合并请求。
4. 网络子系统
  • TCP/IP 协议栈

    • 数据包处理流程
      1. 链路层:网卡驱动接收帧,解析 MAC 地址。
      2. 网络层:IP 协议处理路由(通过路由表 fib_table),分片与重组。
      3. 传输层:TCP 协议维护连接状态(struct sock),处理重传与拥塞控制(如 CUBIC 算法)。
    • 套接字(Socket)
      • 通过 socket() 创建,类型包括 SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)。
      • 绑定端口后通过 listen() 等待连接,accept() 接受新连接。
  • Netfilter 框架

    • 五个钩子点NF_IP_PRE_ROUTINGNF_IP_LOCAL_INNF_IP_FORWARDNF_IP_LOCAL_OUTNF_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 启动流程的详细步骤

  1. BIOS/UEFI 阶段

    • 硬件自检(POST):检测 CPU、内存、外设。
    • 引导设备选择:按 BIOS 设置顺序(如硬盘、USB)寻找引导扇区。
  2. Bootloader(GRUB)

    • 引导菜单:加载 grub.cfg,显示可启动内核列表。
    • 加载内核:读取 vmlinuzinitramfs 到内存,移交控制权。
  3. 内核初始化

    • 解压与启动:解压内核镜像,初始化核心子系统(内存管理、进程调度)。
    • 挂载根文件系统initramfs 提供临时根文件系统,加载真实根文件系统驱动(如 Ext4)。
  4. 用户空间初始化

    • init 进程
      • Systemd:并行启动服务单元(.service 文件),管理依赖关系。
      • 运行级别:systemctl isolate multi-user.target 切换运行模式。

四、Linux 设计哲学的实践体现

  1. 一切皆文件

    • /proc 文件系统:通过 /proc/<pid>/status 查看进程状态,/proc/cpuinfo 获取 CPU 信息。
    • 伪终端(PTY):通过 /dev/pts/0 实现终端会话,SSH 连接依赖此机制。
  2. 模块化设计

    • 热插拔支持:插入 USB 设备时,内核自动加载 usb-storage.ko 驱动。
    • 自定义内核:通过 make menuconfig 裁剪不需要的模块,编译专属内核。
  3. KISS 原则的典型应用

    • 文本处理流水线grep "error" log.txt | awk '{print $1}' | sort | uniq -c 组合多个工具完成任务。

五、安全机制的实现细节

  1. Capabilities 机制

    • 细分特权:传统 root 权限被拆分为数十种能力(如 CAP_NET_BIND_SERVICE 允许绑定低端口)。
    • 设置能力:通过 setcap cap_net_bind_service=+ep /usr/bin/myapp 赋予程序特定权限。
  2. LSM 框架

    • SELinux
      • 强制访问控制(MAC),基于安全上下文(如 user_u:role_r:type_t)限制进程访问资源。
      • 策略规则示例:allow httpd_t var_log_t:file { read write };
  3. 命名空间(Namespaces)

    • PID 命名空间:容器内进程 PID 从 1 开始,与宿主机隔离。
    • 网络命名空间:每个容器拥有独立网络栈,通过 veth pair 连接宿主机。

六、性能优化技术详解

  1. I/O 调度器选择

    • Deadline 调度器:为每个请求设置截止时间,防止饿死(适合数据库负载)。
    • Kyber:针对 NVMe SSD 设计,基于队列深度动态调整。
  2. 内存优化

    • 透明大页(THP):自动合并 2MB 大页,减少 TLB 未命中次数(需内核配置 CONFIG_TRANSPARENT_HUGEPAGE)。
    • 内存压缩(zswap):将不活跃页压缩后存入内存,而非写入交换区。
  3. eBPF 的高级应用

    • 动态追踪:通过 bpftrace 脚本监控内核函数调用。
    • 网络加速:XDP(eXpress Data Path)在网卡驱动层处理数据包,实现 DDoS 防护。

总结与学习建议

Linux 的复杂性源于其广泛的应用场景和高度优化的设计。要深入理解:

  1. 实践方法

    • 使用 strace 跟踪系统调用:strace -f -o log.txt gcc hello.c
    • 通过 /proc/sys 实时查看内核状态:cat /proc/meminfo
  2. 源码学习

    • 阅读内核源码(如进程调度代码在 kernel/sched/ 目录)。
    • 使用 QEMU + GDB 调试内核启动流程。
  3. 性能分析工具

    • perf:分析 CPU 热点(perf record -g ./program)。
    • ftrace:跟踪内核函数调用链。

通过结合理论、代码和工具,可以逐步掌握 Linux 的核心机制,为系统级开发和运维打下坚实基础。


人的精神思想方面的优势越大,给无聊留下的空间就越小。 —叔本华

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/961874.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新鲜速递:DeepSeek-R1开源大模型本地部署实战—Ollama + MaxKB 搭建RAG检索增强生成应用

在AI技术快速发展的今天&#xff0c;开源大模型的本地化部署正在成为开发者们的热门实践方向。最火的莫过于吊打OpenAI过亿成本的纯国产DeepSeek开源大模型&#xff0c;就在刚刚&#xff0c;凭一己之力让英伟达大跌18%&#xff0c;纳斯达克大跌3.7%&#xff0c;足足是给中国AI产…

用BGP的路由聚合功能聚合大陆路由,效果显著不?

正文共&#xff1a;666 字 11 图&#xff0c;预估阅读时间&#xff1a;1 分钟 之前我们统计过中国境内的IP地址和路由信息&#xff08;你知道中国大陆一共有多少IPv4地址吗&#xff1f;&#xff09;&#xff0c;不过数量比较多&#xff0c;有8000多条。截止到2021年底&#xff…

AI DeepSeek-R1 Windos 10 环境搭建

1、安装&#xff1a; 下载 Python |Python.org CUDA Drivers for MAC Archive | NVIDIA pip 和virtualenv Download Ollama on Windows 如下图 2、下载模型 deepseek-r1 ollama run deepseek-r1 或者可以ollama run deepseek-r1:8b 或 3、安装一个可视化对话Chatbox 下载 …

SOME/IP--协议英文原文讲解4

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.1.3 End…

工作总结:git篇

文章目录 前言基础Gerrit1.克隆2.新建本地分支和checkout3.添加到暂存区新增文件到暂存区修改已经添加到暂存区的文件取消添加到暂存区的文件 4.提交到本地仓库在不重复提交的情况下&#xff0c;修改本次提交 5.提交到远程仓库6.评审其他辅助命令 前言 目前也算是工作一段时间…

SpringCloud系列教程:微服务的未来(十七)监听Nacos配置变更、更新路由、实现动态路由

前言 在微服务架构中&#xff0c;API 网关是各个服务之间的入口点&#xff0c;承担着路由、负载均衡、安全认证等重要功能。为了实现动态的路由配置管理&#xff0c;通常需要通过中心化的配置管理系统来实现灵活的路由更新&#xff0c;而无需重启网关服务。Nacos 作为一个开源…

WireShark4.4.2浏览器网络调试指南:数据统计(八)

概述 Wireshark 是一款功能强大的开源网络协议分析软件&#xff0c;被广泛应用于网络调试和数据分析。随着互联网的发展&#xff0c;以及网络安全问题日益严峻&#xff0c;了解如何使用 Wireshark进行浏览器网络调试显得尤为重要。最新的 Wireshark4.4.2 提供了更加强大的功能…

【2025年数学建模美赛E题】(农业生态系统)完整解析+模型代码+论文

生态共生与数值模拟&#xff1a;生态系统模型的物种种群动态研究 摘要1Introduction1.1Problem Background1.2Restatement of the Problem1.3Our Work 2 Assumptions and Justifications3 Notations4 模型的建立与求解4.1 农业生态系统模型的建立与求解4.1.1 模型建立4.1.2求解…

Eureka 服务注册和服务发现的使用

1. 父子工程的搭建 首先创建一个 Maven 项目&#xff0c;删除 src &#xff0c;只保留 pom.xml 然后来进行 pom.xml 的相关配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xs…

【PowerShell专栏】实现Terminal工具的安装

微软已经发布了Windows Terminal的版本,提供各个命令操作工具的集成环境,在Windows Terminal中,我们可以集中实现多页签的各个命令方式,相比传统的命令执行分离,着实方便了不少。图为Terminal 界面: 如何实现Windows Terminal的安装呢?有好几种方式可以实现Windows Term…

从0到1:C++ 开启游戏开发奇幻之旅(二)

目录 游戏开发核心组件设计 游戏循环 游戏对象管理 碰撞检测 人工智能&#xff08;AI&#xff09; 与物理引擎 人工智能 物理引擎 性能优化技巧 内存管理优化 多线程处理 实战案例&#xff1a;开发一个简单的 2D 射击游戏 项目结构设计 代码实现 总结与展望 游戏…

九大服务构建高效 AIOps 平台,全面解决GenAI落地挑战

最近,DevOps运动的联合创始人Patrick Debois分享了他对AI平台与软件研发关系的深刻见解,让我们一起来探讨这个话题。 在AI的落地过程中,我们面临着两个主要难题: 引入AI编码工具后的开发者角色转变:随着像GitHub Copilot这样的AI工具的普及,工程师的角色正在发生深刻变革…

LangChain概述

文章目录 为什么需要LangChainLLM应用开发的最后1公里LangChain的2个关键词LangChain的3个场景LangChain的6大模块 为什么需要LangChain 首先想象一个开发者在构建一个LLM应用时的常见场景。当你开始构建一个新项目时&#xff0c;你可能会遇到许多API接口、数据格式和工具。对于…

【浏览器 - Mac实时调试iOS手机浏览器页面】

最近开发个项目&#xff0c;需要在 Mac 电脑上调试 iOS 手机设备上的 Chrome 浏览器&#xff0c;并查看Chrome网页上的 console 信息&#xff0c;本来以为要安装一些插件&#xff0c;没想到直接使用Mac上的Safari 直接可以调试&#xff0c;再此记录下&#xff0c;分享给需要的伙…

【Rust自学】15.4. Drop trait:告别手动清理,释放即安全

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 15.4.1. Drop trait的意义 类型如果实现了Drop trait&#xff0c;就可以让程序员自定义当值…

C动态库的生成与在Python和QT中的调用方法

目录 一、动态库生成 1&#xff09;C语言生成动态库 2&#xff09;c类生成动态库 二、动态库调用 1&#xff09;Python调用DLL 2&#xff09;QT调用DLL 三、存在的一些问题 1&#xff09;python调用封装了类的DLL可能调用不成功 2&#xff09;DLL格式不匹配的问题 四、…

SpringBoot 整合 SSM

文章目录 SpringBoot 整合 SSM第一步&#xff1a;使用 Spring Initializr 创建项目第二步&#xff1a;现在配置类中配置数据库第三步&#xff1a;进行 MyBatis 相关操作编写数据表对应的实体类创建 mapper 接口利用 MyBaitsX 插件快速创建 xml 文件创建 Mapper 接口 SQL 实现在…

JVM 面试题相关总结

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

C++ unordered_map和unordered_set的使用,哈希表的实现

文章目录 unordered_map&#xff0c;unorder_set和map &#xff0c;set的差异哈希表的实现概念直接定址法哈希冲突哈希冲突举个例子 负载因子将关键字转为整数哈希函数除法散列法/除留余数法 哈希冲突的解决方法开放定址法线性探测二次探测 开放定址法代码实现 哈希表的代码 un…

JAVA实战开源项目:网上订餐系统(Vue+SpringBoot) 附源码

本文项目编号 T 039 &#xff0c;文末自助获取源码 \color{red}{T039&#xff0c;文末自助获取源码} T039&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…