2015-09-24 35 views
1

我是linux設備驅動程序開發新手。我正在嘗試編寫一個simple hello world module,它將顯示在系統上運行的內核版本,我嘗試將hello_world模塊插入到內核中。在設備驅動程序中查找linux版本

我在version.h中使用了LINUX_VERSION_CODE來獲取linux版本並構建了模塊。 當我嘗試在其他系統上插入ko文件時,它仍然顯示內核的版本

我相信問題在於使用C macro。 有人可以幫助我如何找到linux版本的本地機器插入ko,而不是找到我的模塊的內核版本

回答

1

你是對的 - LINUX_VERSION_CODE是一個宏提供編譯時信息關於您用於編譯模塊的Linux頭文件的版本。宏不能有任何關於模塊實際加載到的內核版本的知識。

utsname()功能<linux/utsname.h>提供一個指向new_utsname結構,它具有含你在找什麼sysnamereleaseversion成員。

從這些部件中的信息在/proc/version使用,如圖fs/proc/version.c

static int version_proc_show(struct seq_file *m, void *v) 
{ 
    seq_printf(m, linux_proc_banner, 
     utsname()->sysname, 
     utsname()->release, 
     utsname()->version); 
    return 0; 
} 

linux_proc_banner是當前定義如下的字符串:

const char linux_proc_banner[] = 
    "%s version %s" 
    " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")" 
    " (" LINUX_COMPILER ") %s\n"; 

在我的系統,讀/proc/version - 從而讀取這些成員 - 導致獲得以下字符串:

Linux version 4.1.6-1-ARCH ([email protected]) (gcc version 5.2.0 (GCC)) #1 SMP PREEMPT Mon Aug 17 08:52:28 CEST 2015 

因此,sysnameLinuxrelease4.1.6-1-ARCH,和version#1 SMP PREEMPT Mon Aug 17 08:52:28 CEST 2015