一、处理器(CPU)管理

1. 对称多处理(SMP)设计

// Linux将CPU视为对等资源,任何进程可在任何CPU运行
struct task_struct {
    int cpu;                    // 当前运行的CPU
    cpumask_t cpus_allowed;      // 允许运行的CPU集合
    int prio;                    // 进程优先级
};

2. 核心设计哲学

  • 完全公平调度(CFS):以"理想多任务处理器"为模型

  • 负载均衡:动态平衡各CPU任务量

  • 中断亲和性:可绑定中断到特定CPU

// CFS调度核心思想:让每个进程获得公平的CPU时间
// 红黑树组织进程,键值为虚拟运行时间
struct sched_entity {
    struct rb_node run_node;      // 红黑树节点
    u64 vruntime;                 // 虚拟运行时间(核心指标)
    u64 sum_exec_runtime;         // 实际运行时间
};

二、内存管理

1. 虚拟内存抽象

// 每个进程拥有独立的虚拟地址空间
struct mm_struct {
    pgd_t *pgd;                    // 页全局目录
    unsigned long start_code;       // 代码段起始
    unsigned long start_data;       // 数据段起始
    unsigned long start_brk;        // 堆起始
    unsigned long brk;              // 当前堆结束
    struct vm_area_struct *mmap;    // 虚拟内存区域链表
};

2. 核心设计哲学

  • 按需分页:只有访问时才真正分配物理页

  • 写时复制(COW):fork时共享页,写入时才复制

  • LRU算法:最近最少使用页回收

  • 内存映射文件:统一文件与内存访问

// 虚拟内存区域结构
struct vm_area_struct {
    unsigned long vm_start;         // 起始地址
    unsigned long vm_end;           // 结束地址
    unsigned long vm_flags;          // 访问权限
    struct file *vm_file;            // 映射的文件(如果有)
    struct vm_operations_struct *vm_ops;
};

三、存储(文件系统)

1. 虚拟文件系统(VFS)

// 一切皆文件的抽象
struct file {
    struct path f_path;              // 文件路径
    struct inode *f_inode;           // 索引节点
    const struct file_operations *f_op;  // 文件操作函数
};

struct inode {
    umode_t i_mode;                   // 文件类型/权限
    uid_t i_uid;                       // 所有者
    gid_t i_gid;                       // 所属组
    loff_t i_size;                     // 文件大小
    struct super_block *i_sb;          // 超级块
};

2. 核心设计哲学

  • 分层架构:应用 -> VFS -> 具体文件系统 -> 块设备

  • 统一接口:open/read/write/close统一操作

  • Page Cache:缓存文件数据,加速访问

  • 异步IO:支持非阻塞文件操作

// VFS关键抽象
struct super_block {                   // 文件系统超级块
    struct file_system_type *s_type;
    struct list_head s_instances;
};

struct dentry {                         // 目录项缓存
    struct inode *d_inode;
    struct qstr d_name;
};

四、输入输出(设备管理)

1. 设备驱动模型

// 统一设备抽象
struct device {
    struct device *parent;
    struct device_private *p;
    struct kobject kobj;
    const char *init_name;
    struct bus_type *bus;           // 所属总线
    struct device_driver *driver;    // 绑定的驱动
};

struct device_driver {
    const char *name;
    struct bus_type *bus;
    int (*probe)(struct device *dev);
    int (*remove)(struct device *dev);
};

2. 核心设计哲学

  • 设备文件:通过/dev下的文件访问设备

  • 热插拔支持:动态加载/卸载驱动

  • udev:用户空间设备管理

  • 设备树:硬件描述与内核分离

// 设备文件操作
struct file_operations {
    ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);
    ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *);
    int (*mmap)(struct file *, struct vm_area_struct *);
    long (*unlocked_ioctl)(struct file *, unsigned int, unsigned long);
};

五、网络

1. 网络协议栈

// 套接字抽象
struct socket {
    socket_state            state;
    struct sock             *sk;        // 协议控制块
    const struct proto_ops *ops;         // 协议操作
};

struct sk_buff {                        // 网络数据包
    struct sock     *sk;
    unsigned int    len;
    unsigned int    data_len;
    sk_buff_data_t  transport_header;    // 传输层头
    sk_buff_data_t  network_header;       // 网络层头
    sk_buff_data_t  mac_header;           // 链路层头
};

2. 核心设计哲学

  • 套接字接口:统一网络编程接口

  • 协议分层:链路、网络、传输层分离

  • 零拷贝:减少数据复制

  • 异步IO:epoll等多路复用机制

// 网络协议注册
struct net_protocol {
    int (*handler)(struct sk_buff *skb);
    void (*err_handler)(struct sk_buff *skb, u32 info);
    unsigned int no_policy:1;
};

// TCP协议操作
struct proto tcp_prot = {
    .name           = "TCP",
    .connect        = tcp_v4_connect,
    .disconnect     = tcp_disconnect,
    .accept         = inet_csk_accept,
    .ioctl          = tcp_ioctl,
    .init           = tcp_v4_init_sock,
    .destroy        = tcp_v4_destroy_sock,
    .sendmsg        = tcp_sendmsg,
    .recvmsg        = tcp_recvmsg,
};

六、五大部件的统一设计哲学

1. 抽象与统一

// 一切皆文件 - 统一接口
// CPU: /proc/cpuinfo
// 内存: /proc/meminfo
// 存储: /dev/sda, /mnt/*
// 设备: /dev/*
// 网络: socket接口

2. 分层与模块化

  • 各层职责明确,接口清晰

  • 模块可动态加载/卸载

  • 避免功能耦合

3. 效率优先

  • O(1)算法:调度器、查找算法

  • 缓存利用:Page Cache、dentry缓存

  • 并发优化:RCU锁、无锁数据结构

4. 配置灵活性

// 编译时配置 (Kconfig)
config SMP
    bool "Symmetric Multi-Processing"
    help
      This enables support for systems with more than one CPU.

// 运行时参数 (/proc/sys)
/proc/sys/kernel/sched_min_granularity_ns
/proc/sys/vm/swappiness
/proc/sys/net/ipv4/tcp_congestion_control

5. 错误处理与容错

  • 优雅降级

  • 资源隔离

  • 异常恢复

七、总结

Linux内核针对五大部件的设计体现了以下核心思想:

  1. 资源抽象:每个部件都被抽象为统一的接口(文件、套接字等)

  2. 分层解耦:通过分层架构分离关注点

  3. 动态适应:支持运行时配置和热插拔

  4. 性能优先:关键路径采用最优算法和数据结构

  5. 兼容并包:支持多种硬件架构和协议

这些设计哲学使Linux成为一个稳定、高效、可扩展的操作系统,能够运行从嵌入式设备到超级计算机的各种硬件平台。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐