Fork me on GitHub

获得内核函数地址的四种方法

1.从 System.map 文件中直接得到地址

内核镜像的 System.map 文件存储了内核符号表的信息, 可以通过此文件获取到具体的信息

查看内核函数的地址

grep perf_trace_do_sys_open /boot/System.map-4.4.0-72-generic

查看地址对应哪个内核函数

grep ffffffff811fdb90 /boot/System.map-4.4.0-72-generic

2.使用 nm 命令读取 vmlinux 的信息

nm /usr/lib/debug/boot/vmlinux-4.4.0-72-generic | grep perf_trace_do_sys_open

nm /usr/lib/debug/boot/vmlinux-4.4.0-72-generic | grep ffffffff811fdb90

3.从 /proc/kallsyms 文件获得地址

cat /proc/kallsyms | grep perf_trace_do_sys_open

cat /proc/kallsyms | grep ffffffff811fdb90

4.使用内核函数接口

已知内核符号,获取内核符号地址,使用 kallsyms_lookup_name( )

该函数在 kernel/kallsyms.c 文件中定义的, 要使用它必须启用 CONFIG_KALLSYMS 编译内核.

kallsyms_lookup_name( ) 接受一个字符串格式内核函数名, 返回那个内核函数的地址.

kallsyms_lookup_name("函数名");

已知内核符号地址, 获取内核符号名,使用 sprint_symbol 内核函数

#include <linux/kallsyms.h>

int sprint_symbol(char *buffer, unsigned long address)

函数功能描述 :

该函数根据一个内存中的地址 address 查找一个内核符号, 并将该符号的基本信息, 如符号名 name, 它在内核符号表中的偏移 offset 和大小 size, 所属的模块名(如果有的话)等信息连接成字符串赋值给文本缓冲区 buffer. 其中所查找的内核符号可以是原本就存在于内核中的符号, 也可以是位于动态插入的模块中的符号.

输入参数说明

参数 说明
buffer 文本缓冲区, 它用来记录内核符号的信息, 它是一个输出型参数
address 内核符号中的某一地址, 为输入型参数

返回参数说明:返回值是一个 int 型, 它表示内核符号基本信息串的长度, 也即是 buffer 所表示的字符串的长度.

posted @ 2021-10-24 22:16  BabyMelvin  阅读(944)  评论(0编辑  收藏  举报