用 strings 来“学内核”并不是直接读源码,而是从已编译的内核镜像/模块里提取可读字符串,辅助你理解内核在做什么、支持什么、哪里可能有线索。下面按“能学到什么 → 怎么用 → 实战例子 → 学习路线”来讲。
strings 只是把二进制里的可打印字符串抓出来,但对内核学习很有用:
⚠️ 注意:
strings 看不到逻辑、控制流、函数关系,它只是“文本线索”。
strings /boot/vmlinuz-$(uname -r)
但 vmlinuz 是压缩的,通常要先解压:
# x86 常见
extract-vmlinux /boot/vmlinuz-$(uname -r) > vmlinux
strings vmlinux | less
(发行版一般带 extract-vmlinux)
strings btrfs.ko
你能看到:
strings vmlinux | grep -i "panic"
strings vmlinux | grep -i "schedule"
strings vmlinux | grep -i "filesystem"
strings vmlinux | grep -i "ext4\|xfs\|btrfs\|overlay"
你会看到注册名、错误信息、mount 参数。
strings vmlinux | grep -i "sched"
可能看到:
sched: RT throttling activatedcpu latency对应源码里的 kernel/sched/
strings vmlinux | grep -i "sys_"
虽然不完整,但能帮你建立“系统调用 → 内核字符串”的直觉。
strings vmlinux | grep -i "segfault"
strings vmlinux | grep -i "overflow"
配合 dmesg、CVE 学非常高效。
单独用 strings 不够,推荐组合:
| 工具 | 作用 |
|---|---|
strings |
找线索 |
grep |
过滤 |
objdump |
看汇编 |
nm |
看符号 |
readelf |
看结构 |
gdb |
动态分析 |
| 源码 | 最终解释 |
例如:
strings vmlinux | grep "Oops"
→ 去源码搜 Oops
→ 学异常处理
❌ 错误:
“我看 strings 就能懂内核”
✅ 正确:
“strings 是地图碎片,源码才是地形”
strings vmlinux如果你愿意,我可以:
你更想从哪一块开始?