linux
Linux
- Linux 是一个类 Unix 操作系统内核,最初由 Linus Torvalds 在 1991 年开发。
- “Linux”狭义上是指 内核(Kernel),它负责硬件管理(CPU、内存、磁盘、网络、外设等)、进程调度、内存管理、文件系统等。
- 广义上,人们常说的“Linux”指的是 基于 Linux 内核的操作系统(发行版,Distribution),比如 Ubuntu、Debian、Fedora、Arch Linux、CentOS 等。
Linux架构
Linux架构通常可以从两个层面来理解:宏观的体系结构和微观的代码结构
宏观体系结构(分层模型)
这是最经典、最易于理解的视角,它将Linux系统划分为多个层次,如下图所示
+-------------------------------------------------+
| 用户空间 |
| +--------------------+ +------------------+ |
| | 应用程序 App A | | 应用程序 App B | |
| +--------------------+ +------------------+ |
| | 运行时库 | | Shell/命令行 | |
| | (glibc, libc等) | | (bash, zsh等) | |
+-------------------------------------------------+
| 系统调用接口 (System Call Interface) |
+-------------------------------------------------+
| 内核空间 (Kernel Space) |
| +------------------------------------------+ |
| | 内核 (Kernel) | |
| | +----------+ +---------+ +------------+ | |
| | | 进程管理 | |内存管理 | | 文件系统 | | |
| | +----------+ +---------+ +------------+ | |
| | +----------+ +---------+ +------------+ | |
| | | 设备驱动 | |网络协议栈|| ...其他... | | |
| | +----------+ +---------+ +------------+ | |
+-------------------------------------------------+
| 硬件 (Hardware) |
| (CPU, 内存, 磁盘, 网卡, 键盘, 鼠标等) |
+-------------------------------------------------+
用户空间
这是用户应用程序运行的环境
- 应用程序:用户直接使用的程序,如Firefox、LibreOffice、ls、cp等
- 系统库:最核心的是C库(如glibc),它封装了系统调用,为应用程序提供丰富的、易于使用的API。此外,还有图形库(如OpenGL)、压缩库等
- Shell:命令解释器,是用户与系统交互的界面
关键点:用户空间的程序不能直接访问硬件,它们运行在CPU的非特权模式下
内核空间
这是操作系统的核心,拥有最高权限,运行在CPU的特权模式下
- 系统调用接口:这是一组非常精简的、定义明确的函数组合,是用户空间访问内核的唯一入口。例如
read,write,open,fork等。这保证了系统的稳定和安全 - 内核子系统
- 进程管理:
- 负责进程的创建、调度、终止和通信
- Linux内核的进程调度器非常高效,支持多任务、多用户
- 内存管理:
- 管理物理内存和虚拟内存
- 为每个进程提供独立的虚拟地址空间,通过分页机制实现
- 负责内存的分配与回收、换入换出等
- 文件系统:
- 提供了一个统一的虚拟文件系统接口,支持多种具体的文件系统,如Ext4, XFS, Btrfs, NTFS, FAT等
- 管理文件和目录,处理数据的读写
- 设备驱动:
- 包含了海量的、用于管理特定硬件设备的驱动程序
- 它将硬件的操作细节封装起来,向上层提供一个统一的接口
- 网络协议栈:
- 处理网络通信,实现了完整的TCP/IP协议栈
- 负责数据包的routing, filtering等
- 进程管理:
硬件
包括计算机的所有物理设备:CPU、内存、硬盘、网卡、显示器等
内核架构模式(单内核与微内核)
Linux采用的是单内核架构,单具备模块化设计
- 单内核:
- 特点:操作系统的大部分功能(进程管理、内存管理、文件系统、设备驱动等)都作为一个完整的程序运行在同一个内核地址空间中
- 优点:组件之间通信效率极高(直接函数调用),性能好
- 缺点:耦合度高,一个驱动或组件的崩溃可能导致整个系统崩溃;内核体积庞大
- 微内核:
- 特点:内核只保留最核心的功能(如进程调度、低级内存管理、进程间通信),其他功能(如文件系统、设备驱动)作为独立的服务运行在用户空间
- 优点:系统结构清晰,稳定性高(一个服务崩溃不会导致内核崩溃),易于扩展
- 缺点:服务之间需要通过消息传递进行通信,性能开销较大
Linux的折中方案:模块化单内核
Linux本质上是单内核,但它引入了可加载内核模块机制来解决单内核的缺点
- 核心内核:编译成一个单独的文件(如
/boot/vmlinuz-xxx),包含最核心的功能 - 内核模块:其他功能(尤其是设备驱动)可以编译成独立的模块文件(
.ko文件),在需要时动态加载到内核中,不需要时可以卸载 - 优势:既保持了单内核的高性能,又获得了微内核的灵活性和可扩展性,避免了内核过度膨胀
微观代码结构(源码目录)
如果想深入了解,可以查看Linux内核的源代码树,其目录结构清晰地反映了其架构
# 假设进入了Linux内核源码的根目录
linux/
├── arch/ # 体系结构相关代码 (如 x86/, arm64/, riscv/)
├── block/ # 块设备层(磁盘I/O调度)
├── crypto/ # 加密算法
├── drivers/ # 设备驱动程序 (这是最大最杂的目录)
├── fs/ # 文件系统 (如 ext4/, nfs/, fat/)
├── include/ # 头文件
├── init/ # 系统初始化代码
├── ipc/ # 进程间通信 (如信号量, 共享内存)
├── kernel/ # 核心子系统 (进程调度, 定时器)
├── lib/ # 内核通用库函数
├── mm/ # 内存管理
├── net/ # 网络协议栈 (如 ipv4/, ipv6/, wireless/)
├── samples/ # 示例代码
└── tools/ # 开发工具
总结
Linux架构的核心要点:
- 分层设计:清晰的用户空间和内核空间分离,通过系统调用作为桥梁
- 单内核模式:追求极致的性能,核心功能紧密集成
- 模块化设计:通过可加载内核模块弥补单内核的不足,实现高度的灵活性和可扩展性
- 子系统分工明确:进程、内存、文件、网络、设备驱动五大子系统各司其职,共同协作
组成部分
一个完整的 Linux 系统一般包含三部分:
- 内核(Kernel) → 硬件和软件的桥梁。
- GNU 工具链 → 提供基本命令(ls, cp, grep)、编译器(gcc)、shell(bash/zsh)。
- 软件生态 → 各种应用程序和库(GUI 桌面环境 GNOME/KDE,服务器软件 Nginx/MySQL,开发工具 Vim/VSCode 等)。
Linux也被称作 “GNU/Linux”,强调 GNU 工具在 Linux 系统中的重要性。
特点
- 开源(GPL 协议):任何人都可以查看源码、修改和分发。
- 稳定和安全:广泛用于服务器和嵌入式系统。
- 多用户、多任务:支持多个用户同时登录、同时运行不同进程。
- 高度可定制:从桌面环境到内核都可以裁剪和修改。
- 跨平台:运行在从手机(Android 内核就是 Linux)到超级计算机的各种设备上。
应用领域
- 服务器(占据全球大部分网站和云服务):Nginx、Apache、MySQL、Docker 等都跑在 Linux 上。
- 桌面操作系统:如 Ubuntu、Fedora、Linux Mint。
- 嵌入式系统:路由器、智能家居、电视盒子。
- 移动设备:Android 就是基于 Linux 内核。
- 超级计算机:全球前 500 台超级计算机几乎全部运行 Linux。
- 开发与科研:图形学、AI、编译器开发、操作系统学习等。
和其他系统对比
和 Windows:
- Windows 闭源、商业化,用户体验更友好。
- Linux 开源、灵活,命令行强大,开发者和服务器更喜欢。
和 macOS:
- macOS 也是 Unix-like 系统(基于 BSD),有漂亮的 UI。
- Linux 自由度更高、社区更活跃,但桌面软件生态不如 macOS/Windows。