2014-12-07 3 views
1

Я - программист ядра ядра Linux и думал, что смогу найти ответ для этого (так как это кажется очень простым), но еще не успел , Мне нужно сделать модуль ядра linux, который печатает номер версии ядра. Назначение требует, чтобы реализовал модуль, который отображает этот вид сообщения при загрузке:Как напечатать номер версии ядра linux в модуле ядра

«Привет, мастер. В настоящее время вы используете Linux (версия)», где (версия) - это версия ядра нет.

Как это сделать? Я пытался использовать uname (http://man7.org/linux/man-pages/man2/uname.2.html), но когда я включаю sys/utsname.h, я получаю фатальную ошибку при компиляции с моим make-файлом

«Невозможно открыть файл include: sys/utsname.h»: такого файла или каталога нет ».

Вот мой модуль

#undef __KERNEL__ 
#define __KERNEL__ 

#undef __MODULE__ 
#define __MODULE__ 

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <sys/utsname.h> 

struct utsname unameData; 

static int __init config_init(void) 
{ 
    uname(&unameData); 
    printk(KERN_INFO "Version number is %s\n", unameData.version); 
    return 0; 
} 

static void __exit config_exit(void) 
{ 
    printk(KERN_INFO "config_exit executed with success\n"); 
    return; 
} 

module_init(config_init); 
module_exit(config_exit); 

MODULE_LICENSE("GPL"); 

Makefile

obj-m := config.o 
KDIR := /lib/modules/$(shell uname -r)/build 
PWD := $(shell pwd) 

all: 
    $(MAKE) -C $(KDIR) M=$(PWD) modules 

clean: 
    $(MAKE) -C $(KDIR) M=$(PWD) clean 

ответ

1

Во-первых, вам нужно использовать правильные заголовки, а также правильная функция utsname(). Следующий код хорошо работает для меня.

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/utsname.h> 


static int __init my_init(void) 
{ 
     printk(KERN_INFO "Kernel version %s\n", utsname()->version); 
     printk(KERN_INFO "Kernel release %s\n", utsname()->release); 

     return 0; 
} 

static void __exit my_exit(void) 
{ 
     printk(KERN_INFO "exit module"); 

     return; 
} 

module_init(my_init); 
module_exit(my_exit); 

MODULE_LICENSE("GPL"); 

dmesg выход должен выглядеть примерно так:

[ 1117.358451] Kernel version #64-Ubuntu SMP Mon Sep 22 21:28:38 UTC 2014 
[ 1117.358457] Kernel release 3.13.0-37-generic 
+0

идеальный! Спасибо. Я не знал о «linux/utsname.h» .... Я пытался использовать «sys/utsname.h», но когда я переключил его, он работал нормально. –

Смежные вопросы