ksym
该模块提供内核符号表的支持。目前,有两种方式在内核中使用符号表。
Usage
nm -n -C {your kernel file} | grep ' [Tt] ' | grep -v '\.L' | grep -v '$x' | cargo run --bin {type} --features="demangle"
其中 {type} 可以是 gen_ksym 或 gen_ksym_assembly。前者会生成一个文本文件,内核模块可以在运行时解析该文件以获取符号表。后者会生成一个汇编文件,可以与内核一起编译,内核启动时解析并初始化符号表。
使用第二种方式,内核需要开启assembly feature。
Output
对于第一种方式,生成的文件格式如下(与/proc/kallsyms类似):
ffffffc080200000 T _start
ffffffc080378070 T core::slice::index::slice_start_index_len_fail
ffffffc080379d12 T core::slice::index::slice_start_index_len_fail::do_panic::runtime
对于第二种方式,生成的汇编文件格式如下:
.section .rodata
.global ksyms_address
.align 8
ksyms_address:
.quad
.global ksyms_num
.align 8
ksyms_num:
.quad
.global ksyms_names_index
.align 8
ksyms_names_index:
.global ksyms_names
.align 8
ksyms_names:
Interface
init_kernel_symbols(ksym: &str):从字符串ksym中解析符号表并初始化内核符号表。该字符串的格式与/proc/kallsyms相同。init_kernel_symbols():使用第二种方式下,从嵌入的符号表中解析符号表并初始化内核符号表。lookup_kallsyms(addr: usize) -> Option<(String, usize)>:根据地址addr查找符号表,返回符号名称和符号地址的元组。如果未找到符号,则返回None。注意,该符号可能是与传入地址不完全匹配的最近符号。addr_from_symbol(symbol: &str) -> Option<usize>:根据符号名称查找符号表,返回符号地址。如果未找到符号,则返回None。