list_for_each and kernel panic problem
2018-01-05 15:39
429 查看
list_for_each()的定义:
[plain]
view plain
copy
/**
* list_for_each - iterate over a list
* @pos: the &struct list_head to use as a loop counter.
* @head: the head for your list.
*/
#define list_for_each(pos, head) \
for (pos = (head)->next, prefetch(pos->next); pos != (head); \
pos = pos->next, prefetch(pos->next))
list_for_each_safe()的定义:
[plain]
view plain
copy
/**
* list_for_each_safe - iterate over a list safe against removal of list entry
* @pos: the &struct list_head to use as a loop counter.
* @n: another &struct list_head to use as temporary storage
* @head: the head for your list.
*/
#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)
由上面两个对比来看,list_for_each_safe()函数比list_for_each()多了一个中间变量n
当在遍历的过程中需要删除结点时,来看一下会出现什么情况:
list_for_each():list_del(pos)将pos的前后指针指向undefined state,导致kernel panic,list_del_init(pos)将pos前后指针指向自身,导 致死循环。
list_for_each_safe():首先将pos的后指针缓存到n,处理一个流程后再赋回pos,避免了这种情况发生。
因此之遍历链表不删除结点时,可以使用list_for_each(),而当由删除结点操作时,则要使用list_for_each_safe()。
其他带safe的处理也是基于这个原因。
关于kernel panic:
它表示linux kernel走到了一个不知道怎么走下一步的状况,一旦出现这个情况,kernel就尽可能把它此时能获取的全部信息打印出来,至于能打印出多少信息,那就看哪种情况导致它panic了。
有两种主要类型的kernel panic:hard panic(也就是Aieee信息输出),soft panic(也就是Oops信息输出)
什么能导致kernel panic:
只有加载到内核空间的驱动模块才能直接导致kernel panic,可以在系统正常的情况下,使用lsmod查看当前系统加载了哪些模块。除此之外,内建在内核里的组建(比如memory map等)也能导致panic。
详细的就不说了。
[plain]
view plain
copy
/**
* list_for_each - iterate over a list
* @pos: the &struct list_head to use as a loop counter.
* @head: the head for your list.
*/
#define list_for_each(pos, head) \
for (pos = (head)->next, prefetch(pos->next); pos != (head); \
pos = pos->next, prefetch(pos->next))
list_for_each_safe()的定义:
[plain]
view plain
copy
/**
* list_for_each_safe - iterate over a list safe against removal of list entry
* @pos: the &struct list_head to use as a loop counter.
* @n: another &struct list_head to use as temporary storage
* @head: the head for your list.
*/
#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)
由上面两个对比来看,list_for_each_safe()函数比list_for_each()多了一个中间变量n
当在遍历的过程中需要删除结点时,来看一下会出现什么情况:
list_for_each():list_del(pos)将pos的前后指针指向undefined state,导致kernel panic,list_del_init(pos)将pos前后指针指向自身,导 致死循环。
list_for_each_safe():首先将pos的后指针缓存到n,处理一个流程后再赋回pos,避免了这种情况发生。
因此之遍历链表不删除结点时,可以使用list_for_each(),而当由删除结点操作时,则要使用list_for_each_safe()。
其他带safe的处理也是基于这个原因。
关于kernel panic:
它表示linux kernel走到了一个不知道怎么走下一步的状况,一旦出现这个情况,kernel就尽可能把它此时能获取的全部信息打印出来,至于能打印出多少信息,那就看哪种情况导致它panic了。
有两种主要类型的kernel panic:hard panic(也就是Aieee信息输出),soft panic(也就是Oops信息输出)
什么能导致kernel panic:
只有加载到内核空间的驱动模块才能直接导致kernel panic,可以在系统正常的情况下,使用lsmod查看当前系统加载了哪些模块。除此之外,内建在内核里的组建(比如memory map等)也能导致panic。
详细的就不说了。
相关文章推荐
- list_for_each
- RN SectionList 遇到 missing keys for items, make sure to specify a key property on each item 的 问题解决
- list_for_each_safe()
- 浅析遍历子进程方法(利用list_for_each)
- 【Data Algorithms_Recipes for Scaling up with Hadoop and Spark】Chapter3 Top 10 List
- I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum o
- Iterate through array, for each item with key collect value and make new array with key and array of
- Create Jffs2 for Linux Kernel 2.4(for arm and mips)
- linux内核——list_for_each_entry
- 15 Minute SEO List - Learn how to SEO:List of Best and Worst practices for designing a high traffic website
- 比list_entry更简洁的写法list_for_each_entry
- how to loop through the Params property for a page and how to display each key/value pair
- List Schema Name and Table Name for Database
- Linux 双链表 list_for_each_entry 实现
- list_for_each_entry
- list_for_each(pos, head)、list_for_each_entry(pos, head, member)
- list_for_each与list_for_each_entry
- php数组的遍历讲解 (for foreach list each key )
- Debugging Tools for Windows - List of Tools and Documentation
- FW:SPSiteDataQuery for Cross-Site and Cross List Searches