反汇编 Linux 内核函数通常用于调试、安全分析、性能优化或学习内核机制。下面从准备工作 → 常见方法 → 实用示例系统说明。
反汇编函数最方便的是使用带调试信息的内核:
发行版:
# Ubuntu / Debian
apt install linux-image-$(uname -r)-dbgsym
apt install linux-tools-common
# RHEL / CentOS
debuginfo-install kernel
自己编译内核(推荐):
make menuconfig
# 打开:
# Kernel hacking → Compile-time checks and compiler options → Debug info
make -j$(nproc)
grep do_sys_open /proc/kallsyms
示例输出:
ffffffff8123a4c0 T do_sys_open
objdump(最常用)适用于 vmlinux(未压缩内核):
objdump -d vmlinux --start-address=0xffffffff8123a4c0 --stop-address=0xffffffff8123a600
反汇编指定函数名:
objdump -d vmlinux | grep -A 50 '<do_sys_open>:'
带源码混合:
objdump -S vmlinux --start-address=0xffffffff8123a4c0 \
--stop-address=0xffffffff8123a700
gdb(交互式)gdb vmlinux
(gdb) disassemble do_sys_open
带源码:
(gdb) disassemble /m do_sys_open
查看某地址:
(gdb) x/20i 0xffffffff8123a4c0
perf(运行时反汇编)perf top -k vmlinux
# 或
perf record -a -g
perf report -k vmlinux
在报告中可查看函数汇编。
bpftrace / ftrace(运行时)查看函数入口汇编:
cat /sys/kernel/debug/tracing/instances/...
或使用:
bpftrace -e 'kprobe:do_sys_open { @[kstack] = count(); }'
gdb vmlinux /proc/kcore
(gdb) disassemble do_sys_open
⚠️ 需要:
CONFIG_STRICT_DEVMEM=nschedule()objdump -d vmlinux | awk '/<schedule>:/{flag=1} flag{print} /ret/{if(flag)exit}'
或:
gdb vmlinux
(gdb) disassemble schedule
bzImage 怎么办?需要先解压:
scripts/extract-vmlinux bzImage > vmlinux
objdump -d mymodule.ko
✅ 学习内核实现
gdb vmlinux + disassemble /m
✅ 分析性能问题
perf + vmlinux
✅ 安全/漏洞分析
objdump -d -M intel vmlinux
如果你愿意,可以告诉我:
我可以直接给你针对性命令。