2

我试图从内核模块中简单地读取内核环形缓冲区。也称为 /proc/kmsg 和 dmesg 输出。

环顾四周,似乎对此的调用是 sys_syslog(); 从我读过的内容来看,dmesg 使用 syslog(),它使用位于 printk.c 中的 do_syslog()。

我四处寻找,发现 do_syslog() 是在 linux/syslog.h 中定义的,所以我包含了这个文件。

测试模块中对 do_syslog() 的实际调用如下所示:

read_bytes = do_syslog(2, temp_buffer, 1024, 0);

其中 temp_buffer 只是一个用于测试目的的 char temp_buffer[1024]。

该程序可以编译,但是当我尝试加载模块时它失败了:

insmod:插入'testing.ko'时出错:模块中的-1未知符号

从 dmesg 我看到:“未知符号 do_syslog (err 0)”

为什么这是一个未知符号?我需要链接一些东西吗?

生成文件如下:

obj-m += testing.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
4

1 回答 1

2

您需要使用导出的符号重新编译内核。

EXPORT_SYMBOL (do_syslog);
于 2012-07-30T12:15:24.093 回答