* needs to check the node 'prev' pointer instead of calling list_empty(). */ static inline void __list_del_clearprev(struct list_head *entry) { __list_del(entry->prev, entry->next); entry->prev = NULL; } static
static inline voidlist_add_tail(struct list_head *new, struct list_head *head) { __list_add(new, head->prev, head); } 删除操作 删除两个元素之间的元素 static inline void __list_del(struct list_head * prev, struct list_head * next) { next->prev = prev; WRITE_ONCE(prev->next, ...
BUG_ON(work->entry.next && !list_empty(&work->entry)); list_add_tail(&work->entry, target_list);//将binder_work的entry成员加入target_list中 } 由此先熟悉kernel中list的实现以及常用方法,以帮助学习Binder内容。 1. 内核链表初始化 1.1 创建型初始化 #define LIST_HEAD_INIT(name) { &(name),...
list_empty(struct list_head *head): 判断这个链表是否为空 list_splice(struct list_head *list, struct list_head *head): 将第一个链表接到第二个链表的开头. list_splice_init(struct list_head *list, struct list_head *head): 在上面的功能之上, 再将第一个头结点初始化 list_entry(ptr, type,...
struct list_head *next, *prev; }; 这里把内核经典的container_of和offsetof实现也贴进来了。实际上一般使用container_of都用include\linux\kernel.h 1.2 list初始化 1.2.1 用宏初始化-LIST_HEAD #define LIST_HEAD_INIT(name) { &(name), &(name) } ...
list_empty(const struct list_head *head) //判断链表是否为空 1. 下面是一个使用链表的例子,包括常见的增加、删除、修改、查询等操作。 /* * Description : linux应用层编程之内核链表list的使用 * Date :20180610 * Author :mason * Mail : mrsonko@126.com ...
它和普通的双向链表非常相似,只是仅包含2个成员next和prev指针,分别指向下一个和前一个list_head结构体。 假设我们的内核中需要定义一个kernel_list的结构体,它除了2个list_head结构体类型成员list1和list2之外,还有1个void *类型成员item,那么它的结构体可以是: 代码语言:javascript 代码运行次数:0 运行 AI代码...
free_pages_bulk //linux内核将空间分为三个区,分别是ZONE_DMA、ZONE_NORMAL、ZONR_HIGH,zone_mem_map字段就是指向该区域第一个页描述符 struct page *base = zone->zone_mem_map; while (!list_empty(list) && count--) page = list_entry(list->prev, struct page, lru); list_del(&page->lru)...
初始化链表使用宏InitializeListHead,它需要传入一个链表的头节点指针它的定义如下 VOID InitializeListHead( IN PLIST_ENTRY ListHead ); 这个宏只是简单的将链表头的Flink和Blink指针指向它本身。 利用宏IsListEmpty可以检查一个链表是否为空,它也是只简单的检查这两个指针是否指向其自身 ...
另外函数find_zone_movable_pfns_for_nodes 用于计算进入可移动区域的内存数量,对一个每个结点来说,zone_movable_pfn[node_id] 表示movable_zone内存域的起始地址,同required_kernelcore一样, 这也是一个关键的变量。 二、内存碎片是如何产生的 2.1频繁的内存分配与释放 ...