2342 words
12 minutes
Linux 学习笔记 1 —— 系统架构与核心机制
首次发布: 2026-03-22
... 次访问

1.1 Linux 系统的三层抽象模型#

Linux 系统可以分成三个主要层级:

  1. 硬件层 (Hardware)

    最底层,包括 处理器 (CPU)、主内存 (RAM) 、磁盘、网络接口等物理设备。这是所有计算的基础。

  2. 内核层 (Kernel)

    中间层,是操作系统的核心。它负责管理硬件资源,并为上层程序提供统一接口。内核运行在“内核模式”,拥有最高权限,能直接访问所有硬件和内存。

  3. 用户空间层 (User Space)

    最顶层,是我们日常使用的程序所在的地方,比如浏览器、终端、编辑器等。这些程序运行在“用户模式”,权限受限,不能随便碰硬件或别人的数据。

1.2 主内存 (Main Memory) ——系统的“工作台”#

主内存就是电脑里的 RAM,它是所有正在运行的程序和数据的临时存放地。

  • 所有进程 (包括内核线程如 kthreaddkblockd) 都住在内存里。
  • 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_caches

1.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

# 查看当前终端设备名
tty

1.5 用户空间 (User Space) ——我们的活动舞台#

用户空间是指所有非内核程序的集合,也叫 “userland”。这里包含了你每天打交道的东西:图形界面、Web 浏览器、命令行工具、服务器软件等等。

根据功能复杂度,用户空间组件大致可分为三层:

  1. **顶层 (应用层) **:直接面向用户的程序,如 Firefox、VSCode、Steam。
  2. **中间层 (服务层) **:支撑应用的后台服务,如 DNS 缓存、数据库、邮件服务器。
  3. **底层 (基础服务层) **:靠近内核的小型实用程序,如网络配置、日志记录、通信总线。

✅ 操作示例:

# 查看系统中运行的所有用户进程
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
Linux 学习笔记 1 —— 系统架构与核心机制
https://adalovelemon.github.io/blog/en/posts/content/technotes/linux/linux1/
Author
Ada Lovelemon
Published at
2026-03-22

Comments Section