目錄分析include/linux/list.h中雜湊表的實現,給出分析報告,並編寫核心模組,呼叫其中的函式和巨集,實現雜湊表的建立和查詢
預設已經理解用陣列鍊錶實現雜湊表的原理
struct hlist_head,strutc hlist_node
kmalloc,kfree
init_hlist_head
init_hlist_node
hlist_add_head
hlist_for_each,hlist_for_each_safe
hlist_entry
hlist_del
因為node結點需要存key,而node結構只有兩個指標,所以另外定義乙個結構hlist_data,變數有node和key
head是陣列的指標,在初始化中按大小申請記憶體
接著為準備好的關鍵字初始化結點並插入陣列對應的位置
迴圈列印所有結點的key和位址
按給出關鍵字查詢,用雜湊函式得出key相應的雜湊位址,根據雜湊位址就能找到陣列中對應的頭結點,再遍歷鍊錶進行查詢
退出就是刪除結點釋放記憶體
#include #include #include #include module_license("gpl");
module_author("wasi");
int init(void);//初始化
int hashfunc(int);//雜湊函式
void addallnodes(int);//加入所有關鍵字結點
void showallnodes(void);//列印所有關鍵字結點
int search(int);//根據關鍵字查詢結點位址
//雜湊表長度及雜湊的餘數
#define n 8
//關鍵字陣列長度
#define length 20
//結點結構體
struct hlist_data;
struct hlist_head *head;
//初始化,申請記憶體
int init(void)
}//遍歷列印所有結點
void showallnodes(void)
printk("null");
printk("\n"); }}
//根據關鍵字查詢結點位址
int search(int searchkey)
return -1;
}static int __init hlist_init(void);//一組關鍵字
int addr;//查詢時要使用
int searchkey;
//初始化
if(!init()) return -1;
//按照簡單的求餘作為雜湊函式插入結點
addallnodes(keys);
//列印所有結點
showallnodes();
//給出關鍵字
searchkey=19;
addr=search(searchkey);
if(addr==-1) printk("search failed\n\n");
else printk("找到key為%d的結點位址是%d\n\n",searchkey,addr);
return 0;
}static void __exit hlist_exit(void)
} kfree(head);
printk("刪除完成!\n");
第一次進行核心模組的編寫,有很多不足的地方
強制轉換有warning,但是不知道怎麼去解決
不要全域性宣告變數,會有不可重入問題,雖然我執行時沒有出現過
kfree時注意釋放方法是否正確,因為在核心操作,操作錯誤會宕機
正確的應該是使用者程式呼叫正在執行的核心模組,不是直接在**中確定關鍵字陣列、查詢關鍵字之類的
linux核心模組的編寫
之前學了核心模組的編寫,但是沒有動手實驗,這次試驗才發現還是有好動東西需要學習!我的環境是虛擬機器跑centos 7 1.首先編寫模組 include include module license dual bsd gpl static int hello init void static void...
核心模組的編寫1
include includemodule license dual bsd gpl 是用來告知核心,該模組帶有乙個自由的許可證 沒有這樣的說明,在模組載入時核心會抱怨.static int hello init void static void hello exit void module ini...
編寫核心模組hello world
1 準備環境 mkdir src lkm example cd src lkm example 2 建立檔案 lkm example.c include include include module license gpl module author robert w.oliver ii modul...