Linux内核的双向链表是比较经典的东西,网上分析链表的同志基本分析了99%,就差了1%。那就是list_del函数。
先给出函数原型:#ifdef CONFIG_ILLEGAL_POINTER_VALUE
# define POISON_POINTER_DELTA _AC(CONFIG_ILLEGAL_POINTER_VALUE, UL)
#else
# define POISON_POINTER_DELTA 0
#endif#define LIST_POISON1 ((void *) 0x00100100 + POISON_POINTER_DELTA)
#define LIST_POISON2 ((void *) 0x00200200 + POISON_POINTER_DELTA)static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
entry->next = LIST_POISON1;
entry->prev = LIST_POISON2;
}
集中体现在
entry->next = LIST_POISON1;
entry->prev = LIST_POISON2;
这两行代码。
为什么不写成:
entry->next = NULL;
entry->prev = NULL;我们先看一下相关的注释:
/*
* These are non-NULL pointers that will result in page faults
* under normal circumstances, used to verify that nobody uses
* non-initialized list entries.
*/
翻译一下:
在正常环境下,这个非空指针将会引起页错误(通常所说的缺页中断)。可被用来验证没有初始化的链表节点。
首先,我们可以内核中找到一下函数:
这个函数是需要在打开了CONFIG_DEBUG_LIST这个宏后才起作用。很明显这个宏是用于链表调试的。
void __list_del_entry(struct list_head *entry)
{
struct list_head *prev, *next; prev = entry->prev;
next = entry->next; if (WARN(next == LIST_POISON1,
"list_del corruption, %p->next is LIST_POISON1 (%p)
",
entry, LIST_POISON1) ||
WARN(prev == LIST_POISON2,
"list_del corruption, %p->prev is LIST_POISON2 (%p)
",
entry, LIST_POISON2) ||
WARN(prev->next != entry,
"list_del corruption. prev->next should be %p, "
"but was %p
", entry, prev->next) ||
WARN(next->prev != entry,
"list_del corruption. next->prev should be %p, "
"but was %p
", entry, next->prev))
return; __list_del(prev, next);
}这个地方有对这两个宏的引用。这个函数的警告信息告诉我们这个节点已经被用过了,很显然,我们将其与平常意义的节点作比较可以得到如下信息:我们得到的这个链表是被删掉的,不是刚初始化没用的。另外我大胆猜测了一下其另一个用途:
就算我们不打开CONFIG_DEBUG_LIST这个宏,我们在调试出错代码的时候经常会返回指针的值,我们很多时候出错都是指针为NULL造成的,这时候我们如果发现是值是LIST_POISON1或LIST_POISON2的话,那我们马上可以将注意力转移到链表上来了,并且是因为误用了一个已经从链表中删除掉的节点。Linux内核LED模块分析zsync:帮你用旧Ubuntu ISO 升级到Ubuntu 11.04相关资讯 Linux教程
- Linux教程:如何在命令行中查看目 (07/28/2014 12:22:23)
- Linux 修改root密码 (11/03/2012 07:53:38)
- su - root 与su root的区别 (06/06/2012 00:39:40)
| - Linux进程间通信:消息队列 (01/28/2013 09:43:00)
- U盘安装Linux开机无法启动解决方法 (10/07/2012 08:55:52)
- Windows 7/Linux 同步时间 (05/15/2012 06:17:55)
|
本文评论 查看全部评论 (0)