2012-07-30 104 views
1

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

从四处看来,它的调用似乎是sys_syslog();从我读过的内容来看,dmesg使用syslog(),它使用驻留在printk.c中的do_syslog()。

我在grep中看到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 

回答

1

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

EXPORT_SYMBOL (do_syslog); 
+0

谢谢!是否有可能做到这一点,而不必重新编译内核?当然,必须有一些标准功能来处理所有普通内核中存在的问题。顺便提一句,我也得到了sys_read()和sys_open()的未知符号。 – csstudent2233 2012-08-03 09:50:38

+0

@ csstudent2233:如果符号未被导出(如果您不计算'/ dev/kmem'),则不可能。不过,应该已经导出sys_read和sys_open了。 – InternetSeriousBusiness 2012-10-05 16:27:16