1、標頭檔案
include/linux/list.h
1)初始化煉表頭
static inline void init_list_head(struct list_head *list)
#else
extern void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next);
#endif
/*** list_add - add a new entry
* @new: new entry to be added
* @head: list head to add it after
** insert a new entry after the specified head.
* this is good for implementing stacks.
*/static inline void list_add(struct list_head *new, struct list_head *head)
3)鍊錶刪除操作
/*** list_del - deletes entry from list.
* @entry: the element to delete from the list.
* note: list_empty() on entry does not return true after this, the entry is
* in an undefined state.
*/#ifndef config_debug_list
static inline void __list_del_entry(struct list_head *entry)
static inline void list_del(struct list_head *entry)
#else
extern void __list_del_entry(struct list_head *entry);
extern void list_del(struct list_head *entry);
#endif
4)提取資料結構
/*** list_entry - get the struct for this entry
* @ptr:the &struct list_head pointer.
* @type:the type of the struct this is embedded in.
* @member:the name of the list_struct within the struct.
*/#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
4)遍歷鍊錶操作
/*** list_for_each-iterate over a list
* @pos:the &struct list_head to use as a loop cursor.
* @head:the head for your list.
*/#define list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); pos = pos->next)
2、實驗
編寫核心模組
1)完成節點的插入
2)完成鍊錶的遍歷
3)完成節點的刪除(遍歷時訪問節點中的資料)
3、源**檔案
#include
#include
#include
#include
#define person_count (5)
struct person ;
struct list_head person_list;
struct person *p_person;
struct list_head *pos;
struct person *temp_person;
static int __init list_demo_init(void)
memset(p_person, 0, sizeof(struct person) * person_count);
for(i = 0; i < person_count; i++)
//遍歷鍊錶
list_for_each(pos, &person_list)
printk(kern_info "list_demo_init\n");
return 0;
}static void __init list_demo_exit(void)
kfree(p_person);
p_person = null;
}printk(kern_info "list_demo_exit\n");
}module_license("gpl v2");
module_version("v1.0");
module_description("list module");
module_author("xiezhi");
module_alias("list module");
module_init(list_demo_init);
module_exit(list_demo_exit);
4、makefile
ifeq ($(kernelrelease),)
kerneldir ?= /lib/modules/$(shell uname -r)/build
pwd := $(shell pwd)
all:
$(make) -c $(kerneldir) m=$(pwd) modules
clean:
$(make) -c $(kerneldir) m=$(pwd) clean
else
obj-m := list_demo.o
endif
linux目錄詳細分析
sbin是超級使用者名稱令儲存的地方,包括reboot,shutdowd等 bin是普通使用者命令儲存,包括常用的vim,ssh等 usr bin使用者安裝程式後命令的地方,例如,自帶的ls,cat,chmod,mv,cp,tar,python,pip等 usr sbin是網路管理的必備程式,例如,...
const詳細分析
最近在分析 linux 驅動的過程過程中遇到一些關於 const 的使用,現在在這裡詳細剖析一下 一,const int p 首先分析一下幾個概念 1 p 是乙個指標變數,因而它也是乙個變數,所謂變數就有變數的位址和變數的值,而這裡 p變數的值就是乙個位址,該位址下存放的是乙個整數,p的值等於這個整...
約數詳細分析
約數詳細分析 我們先來認識一下約數 約數分正約數和負約數兩種,我們一般只討論正約數。也就是說,接下來所提的約數,只考慮正約數。如果有乙個數k,滿足k n,那麼k就是n 的約數 因數 n是k的倍數。求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。如果只求乙個數,最容易想到的就是列舉。當然列舉也...