2015-07-03 270 views
1

這是我第一次在這裏發表一個問題,所以要溫柔。 我正在鑽研操作系統的有趣世界,並試圖嘗試編寫Linux內核模塊。我對這個問題的教科書跨這項工作來了,在C寫下面的代碼:Linux內核模塊編程

#include<linux/list.h> 
#include<linux/init.h> 
#include<linux/kernel.h> 
#include<linux/module.h> 
#include<linux/types.h> 
#include<linux/slab.h> 

struct birthday { 
    int day; 
    int month; 
    int year; 
    struct list_head list; 
} 

static LIST_HEAD(birthday_list); 

int simple_init(void) { 
    struct birthday *ptr; 
    int i; 
    for(i = 0; i < 5; i++) { 
     // create 5 birthday structs and add them to the list 

     struct birthday *person; 
     person = kmalloc(sizeof(*person), GFP_KERNEL); 
     person->day = 22; 
     person->month = 11; 
     person->year = 1981; 
     INIT_LIST_HEAD(&person->list); 

     list_add_tail(&person->list, &birthday_list); 
    } 

    list_for_each_entry(ptr, &birthday_list, list) { 
     // print the info from the structs to the log 
     printk(KERN_INFO "%d, %d %d", ptr->month, ptr->day, ptr->year); 
    } 

    return 0; 
} 


void simple_exit(void) { 
    struct birthday *ptr, *next; 
    list_for_each_entry_safe(ptr, next, &birthday_list, list) { 
     // delete structs and return memory 
     list_del(&ptr->list); 
     kfree(ptr); 
    } 
} 

module_init(simple_init); 
module_exit(simple_exit); 

我遇到的問題是,上面的代碼將無法編譯,我得到以下錯誤:

In file included from /home/parv112281/Documents/operating-systems/chap-2/list-struct/list-struct.c:1:0: 
include/linux/list.h:22:2: error: expected ‘;’, identifier or ‘(’ before ‘struct’ 
    struct list_head name = LIST_HEAD_INIT(name) 
^
/home/parv112281/Documents/operating-systems/chap-2/list-struct/list-struct.c:15:8: note: in expansion of macro ‘LIST_HEAD’ 
static LIST_HEAD(birthday_list); 
     ^
make[2]: *** [/home/parv112281/Documents/operating-systems/chap-2/list-struct/list-struct.o] Error 1 
make[1]: *** [_module_/home/parv112281/Documents/operating-systems/chap-2/list-struct] Error 2 
make[1]: Leaving directory `/usr/src/linux-headers-3.16.0-30-generic' 
make: *** [all] Error 2 

編譯器似乎在抱怨的錯誤是在list.h頭文件中定義了linux內核的雙向鏈表數據結構。我懷疑這裏的內核代碼有一個實際的錯誤,我懷疑我只是在這裏錯誤地使用了一些函數或宏。我將不勝感激任何幫助解決這個問題。

感謝, Parv

回答

1

兩個問題:

  1. 要使用的內核鏈表,你需要包括LINUX/list.h

  2. 你忘了;當聲明結構生日時。

所以這應該工作:

#include <linux/list.h> 

struct birthday { 
    int day; 
    int month; 
    int year; 
    struct list_head list; 
}; 
+0

我沒在問:改變結構順序誠然,我不知道爲什麼它的關鍵首先把'結構list_head'。你能再詳細一點嗎? – artm

+0

上面是我回復了一條評論的內容,基本上說,將list_head放在結構的開頭很重要。那個評論然後被刪除了。 – artm

+0

它使得指針運算變得更加容易:container_of()將被用於靜態轉換。 – 0andriy