Linux 核心鍊錶使用舉例

2021-06-22 12:59:55 字數 2462 閱讀 1893

鍊錶資料結構的定義很簡潔:

struct list_head ;

list_head結構包含兩個指向list_head結構的指標prev和next,該核心鍊錶具備雙鏈表功能,通常它都組織成雙迴圈鍊錶,這裡的list_head沒有資料域。在linux核心鍊錶中,不是在鍊錶結構中包含資料,而是在資料結構中包含鍊錶節點。下面是乙個簡單的核心模組的例子,包含了對鍊錶進行插入、刪除、遍歷的一些函式:

list.c:

#include #include #include #include #include #include typedef struct list_test_struct test;

struct list_head head_list;

rwlock_t list_lock = rw_lock_unlocked; //定義讀寫鎖,操作前加鎖,操作後解鎖

void creat_list(void)

}void del_data(void)

}write_unlock(&list_lock);

}void print_list(void)

read_unlock(&list_lock);

}int list_test_init(void)

void list_test_exit(void)

module_license("gpl");

module_init(list_test_init);

module_exit(list_test_exit);

makefile:

obj-m	+= list.o

kern_dir = /usr/src/linux-headers-2.6.32-33-generic

all:

make -c $(kern_dir) m=`pwd` modules

clean:

make -c $(kern_dir) m=`pwd` modules clean

rm -rf modules.order

make後生成module,獲取超級使用者許可權後

insmod list.ko

然後輸入命令:

cat var/log/messages

printk列印資訊:

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274551] 0

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274553] 1

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274555] 2

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274555] 3

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274556] 4

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274557] 5

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274558] 6

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274559] 7

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274559] 8

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274560] 9

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274561] 0

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274562] 1

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274563] 2

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274564] 3

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274564] 5

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274565] 6

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274566] 7

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274567] 8

jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274568] 9

第二次輸出發現節點4被刪除,在這裡實現:

list_for_each(p, &head_list)          //遍歷鍊錶

}

linux核心鍊錶的使用

此模組已經在linux 2.6 執行成功.本文章僅僅通過例項演示如何使用linux 核心鍊錶 include include include include include module license gpl 實際資料結構 struct student 鍊錶的頭結點,無資料 struct list...

linux核心鍊錶的使用

注意這個鍊錶只能在驅動程式中使用 定義struct list head define list head name struct list head name list head init name static struct list head list head init head 就初始化了乙...

linux核心鍊錶

鍊錶是一種常用的資料結構,它通過指標將一系列資料節點連線成一條資料鏈。相對於陣列,鍊錶具有更好的動態性,建立鍊錶時無需預先知道資料總量,可以隨機分配空間,可以高效地在鍊錶中的任意位置實時插入或刪除資料。鍊錶的開銷主要是訪問的順序性和組織鏈的空間損失。一 鍊錶結構 單鏈表結構如下 雙鏈表結構如圖 st...