Linux---架构概览

server/2025/2/2 8:51:53/

一、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 的核心机制,为系统级开发和运维打下坚实基础。


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


http://www.ppmy.cn/server/164287.html

相关文章

C++ memset设置数组内容和memcpy拷贝数组内容的介绍与使用

目录 一.memset使用 设置数组内容&#xff1a; 错误使用&#xff1a; 二.memcpy拷贝数组内容 一.memset使用 函数原型如下&#xff1a; void * memset ( void * ptr, int value, size_t num ); 参数解释&#xff1a; ptr -- 指针&#xff1a;指向了要设置的内存块的起始位置…

HarmonyOS:状态管理最佳实践

一、概述 在声明式UI编程范式中&#xff0c;UI是应用程序状态的函数&#xff0c;应用程序状态的修改会更新相应的UI界面。ArkUI采用了MVVM模式&#xff0c;其中ViewModel将数据与视图绑定在一起&#xff0c;更新数据的时候直接更新视图。如下图所示&#xff1a; ArkUI的MVVM模式…

网络工程师 (8)存储管理

一、页式存储基本原理 &#xff08;一&#xff09;内存划分 页式存储首先将内存物理空间划分成大小相等的存储块&#xff0c;这些块通常被称为“页帧”或“物理页”。每个页帧的大小是固定的&#xff0c;例如常见的页帧大小有4KB、8KB等&#xff0c;这个大小由操作系统决定。同…

Day31-【AI思考】-深度学习方法论全解析——科学提升学习效率的终极指南

文章目录 深度学习方法论全解析——科学提升学习效率的终极指南**一、影子跟读法&#xff08;Shadowing&#xff09;——听力突破核武器****二、番茄工作法&#xff08;Pomodoro&#xff09;——时间管理手术刀****三、费曼技巧&#xff08;Feynman Technique&#xff09;——知…

堆的模拟实现(详解)c++

根据前两篇文章&#xff08;向上调整算法以及向下调整算法&#xff09;&#xff0c;堆的实现就变得巨简单了。 1 创建 创建⼀个⾜够⼤的数组充当堆&#xff1b; 创建⼀个变量 n&#xff0c;⽤来标记堆中元素的个数 const int N 1e6 10; int n; int heap[N]; 2 插⼊ 把新…

如何编写地信测绘信息相关的综述论文-总结版本

A. Hamissi, A. Dhraief, and L. Sliman, “A Comprehensive Survey on Conflict Detection and Resolution in Unmanned Aircraft System Traffic Management,” IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS, 2024 DEC 10, 2024. 摘要 痛点&#xff1a;Severa…

蓝桥杯python语言基础(1)——编程基础

目录 一、python开发环境 二、python输入输出 &#xff08;1&#xff09;print输出函数 print(*object&#xff0c;sep,end\n,......) &#xff08;2&#xff09;input输入函数 input([prompt]), 输入的变量均为str字符串类型&#xff01; input()会读入一整行的信息 ​编…

50. 正点原子官方系统镜像烧写实验

一、Windows下使用OTG烧写系统 1、在Windos使用NXP提供的mfgtool来向开发烧写系统。需要用先将开发板的USB_OTG接口连接到电脑上。 Mfgtool工具是向板子先下载一个Linux系统&#xff0c;然后通过这个系统来完成烧写工作。 切记&#xff01;使用OTG烧写的时候要先把SD卡拔出来&…