1.1 Linux 系统的三层抽象模型
Linux 系统可以分成三个主要层级:
硬件层 (Hardware)
最底层,包括 处理器 (CPU)、主内存 (RAM) 、磁盘、网络接口等物理设备。这是所有计算的基础。
内核层 (Kernel)
中间层,是操作系统的核心。它负责管理硬件资源,并为上层程序提供统一接口。内核运行在“内核模式”,拥有最高权限,能直接访问所有硬件和内存。
用户空间层 (User Space)
最顶层,是我们日常使用的程序所在的地方,比如浏览器、终端、编辑器等。这些程序运行在“用户模式”,权限受限,不能随便碰硬件或别人的数据。
1.2 主内存 (Main Memory) ——系统的“工作台”
主内存就是电脑里的 RAM,它是所有正在运行的程序和数据的临时存放地。
- 所有进程 (包括内核线程如
kthreadd、kblockd) 都住在内存里。 - CPU 不从硬盘读指令,而是从内存里取指令和数据。
- 输入输出设备的数据也要先经过内存再传给 CPU。
1.3 内核的四大职责
内核不是干活的工人,它是调度员 + 安全员 + 翻译官 + 管理员。它的核心任务围绕内存展开,具体分为四个方面:
1.3.1 进程管理 (Process Management)
进程管理的职责是决定哪个进程能用 CPU、什么时候用、用多久。
多任务是怎么实现的?
即使只有一个 CPU 核心,也能同时跑多个程序 (比如边看网页边听音乐) ,这靠的是“时间片轮转” + “上下文切换”。
- 每个进程被分配一小段时间 (time slice) ,比如几毫秒。
- 时间到了,CPU 中断当前进程,保存它的状态 (寄存器、内存指针等) ,然后加载下一个进程的状态继续执行。
- 这个过程叫 context switch,由内核完成。
✅ 可以在终端里做个尝试:
# 查看当前有哪些进程在运行
ps aux | head -n 5
# 观察 CPU 使用情况 (按 q 退出)
top
# 创建一个后台进程模拟占用 CPU
yes > /dev/null &
# 终端显示
# Hello@OmniLinux:~$ yes > /dev/null &
# [1] 2596
# 就表明成功创建后台进程,且 yes 进程的 PID 是 2596
# 再看 top,你会发现有一个 yes 进程占用了接近 100% 的 CPU当你输入 kill 2596 终止 yes 时,内核就会做一次 context switch,把 CPU 控制权交还给 shell。
1.3.2 内存管理 (Memory Management)
内存管理需要确保每个进程都有属于自己的内存区域,互不干扰;此外,它还要支持共享内存、虚拟内存等功能。
关键规则:
- 内核有自己的私有内存区,用户进程进不去。
- 每个用户进程有独立内存段。
- 用户进程之间默认不能互相访问对方内存。
- 允许某些内存只读 (比如代码段) 。
- 可以用磁盘当“扩展内存” (swap space) ,这就是虚拟内存。
虚拟内存 & MMU
现代 CPU 有个叫 MMU (Memory Management Unit) 的部件,它让每个进程以为自己独占整台机器的内存。
实际上,MMU 会把进程看到的“虚拟地址”翻译成真实的“物理地址”。这个映射关系保存在一个叫 页表 (page table) 的数据结构里。
# 查看系统总内存和已用内存
free -h
# 查看某个进程的内存使用详情 (替换 <pid> 为真实 PID)
cat /proc/<pid>/status | grep Vm
# 查看交换分区使用情况
swapon --show
# 手动触发一次 swap 写入 (谨慎操作!)
echo 3 > /proc/sys/vm/drop_caches1.3.3 设备驱动管理 (Device Drivers and Management)
硬件千差万别,但内核要给用户提供统一的接口。比如不同品牌的网卡,对用户来说都是“网络设备”,可以通过相同的命令配置。
设备驱动通常以内核模块形式存在,它们运行在内核态,因为直接操作硬件很危险 (比如误关电源会导致死机) 。
# 列出当前加载的内核模块
lsmod
# 查看某个模块的信息 (比如 ext4 文件系统驱动)
modinfo ext4
# 动态加载/卸载模块 (需要 root 权限)
sudo modprobe usb_storage # 加载 USB 存储驱动
sudo rmmod usb_storage # 卸载
# 查看硬件设备列表
lspci # PCI 设备
lsusb # USB 设备
lshw # 更详细的硬件信息 (需安装 lshw) 1.3.4. 系统调用与支持 (System Calls and Support)
用户程序想做事 (比如打开文件、创建进程) ,必须通过“系统调用”请求内核帮忙。
两个最重要的系统调用:
fork():复制当前进程,生成一个几乎一模一样的子进程。exec():用新程序替换当前进程的内容。
实践代码:
# 使用 strace 跟踪系统调用 (非常有用!)
strace ls
# 输出片段示例:
execve("/bin/ls", ["ls"], ...) = 0
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
read(3, "...", 832) = 832
...自己写个小程序测试 fork/exec (C 语言)
#include <unistd.h>
#include <stdio.h>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
execlp("date", "date", NULL); // 执行 date 命令
} else {
// 父进程
wait(NULL); // 等待子进程结束
printf("Child finished.\n");
}
return 0;
}编译运行:
gcc -o test_fork test_fork.c
./test_fork你会看到日期输出后打印 “Child finished.” —— 这就是 fork+exec 的经典用法!
1.4 伪设备 (Pseudodevices) ——软件模拟的“假硬件”
有些功能不适合做成真正的硬件,但又希望像设备一样被访问,于是就有了“伪设备”。
下面是些著名的例子:
/dev/random和/dev/urandom:随机数生成器/dev/null:黑洞,写入即丢弃/dev/zero:无限零流/dev/tty:当前终端
虽然它们看起来像设备文件,其实是内核里的软件实现。
# 从 /dev/urandom 读取 10 字节随机数据
dd if=/dev/urandom of=random.bin bs=1 count=10
# 把任意内容扔进 /dev/null (相当于删除)
echo "hello" > /dev/null
# 生成一个 1MB 的全零文件
dd if=/dev/zero of=zeros.bin bs=1M count=1
# 查看当前终端设备名
tty1.5 用户空间 (User Space) ——我们的活动舞台
用户空间是指所有非内核程序的集合,也叫 “userland”。这里包含了你每天打交道的东西:图形界面、Web 浏览器、命令行工具、服务器软件等等。
根据功能复杂度,用户空间组件大致可分为三层:
- **顶层 (应用层) **:直接面向用户的程序,如 Firefox、VSCode、Steam。
- **中间层 (服务层) **:支撑应用的后台服务,如 DNS 缓存、数据库、邮件服务器。
- **底层 (基础服务层) **:靠近内核的小型实用程序,如网络配置、日志记录、通信总线。
✅ 操作示例:
# 查看系统中运行的所有用户进程
ps -ef | grep -v "$$" | grep -v "PID"
# 查看某个进程所属的服务层级 (粗略判断)
systemctl status nginx # 如果是 systemd 管理的,可能是服务层
htop # 可视化查看进程树和资源占用
# 查看日志服务是否运行
journalctl -u rsyslog --since today # systemd 日志
tail -f /var/log/syslog # 传统 syslog 日志1.6 用户与权限体系 —— 安全的第一道防线
Linux 是多用户系统,每个用户都有唯一的 ID (UID) ,而不是用户名。内核只认 UID,不认识 “alice” 或 “bob”。
核心概念:
- 普通用户:只能操作自己的文件和进程。
- **root 用户 (UID=0) **:超级管理员,可以做任何事情 (包括删库跑路 😱) 。
- **组 (Group) **:一组用户的集合,用于批量授权文件访问权限。
✅ 操作示例:
# 查看当前用户是谁
whoami
# 查看当前用户的 UID/GID
id
# 切换到 root (需要密码)
sudo su -
# 或者临时以 root 身份执行一条命令
sudo rm -rf /tmp/testdir
# 创建新用户
sudo useradd -m alice
sudo passwd alice
# 将用户加入某个组
sudo usermod -aG sudo alice # 加入 sudo 组,获得提权能力
# 查看某个文件的属主和权限
ls -l /home/alice/.bashrc附录:常用诊断命令速查表
| 目的 | 命令 |
|---|---|
| 查看进程 | ps, top, htop |
| 查看内存 | free, vmstat |
| 查看磁盘 | df, du, iostat |
| 查看网络 | ip, ss, netstat |
| 查看系统调用 | strace, ltrace |
| 查看内核模块 | lsmod, modinfo |
| 查看硬件 | lspci, lsusb, lshw |
| 查看日志 | journalctl, dmesg, tail |

