Linux核心鍊錶詳細分析

2021-08-20 21:01:35 字數 3110 閱讀 7421

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的倍數。求乙個數的約數是資訊學競賽裡乙個基礎的不能再基礎的問題。如果只求乙個數,最容易想到的就是列舉。當然列舉也...