2012-07-30 105 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