list_for_each_entry】的更多相关文章

一.list_for_each 1.list_for_each原型#define list_for_each(pos, head) \     for (pos = (head)->next, prefetch(pos->next); pos != (head); \     pos = pos->next, prefetch(pos->next)) 它实际上是一个 for 循环.利用传入的pos 作为循环变量,从表头 head開始,逐项向后(next方向)移动 pos ,直至又回…
双向链表及链表头: 建立一个双向链表通常有一个独立的用于管理链表的链表头,链表头一般是不含有实体数据的,必须用INIT_LIST_HEAD()进行初始化,表头建立以后,就可以将带有数据结构的实体链表成员加入到链. INIT_LIST_HEAD (&nphy_dev_list); 定义: #define list_for_each_entry(pos, head, member) \ for (pos = list_entry((head)->next, typeof(*pos), membe…
内核里面用list_for_each_entry实在太多了,定义在linux-3.10/include/linux/list.h: /** * list_for_each_entry - iterate over list of given type * @pos: the type * to use as a loop cursor. * @head: the head for your list. * @member: the name of the list_struct within t…
1.offsetof(TYPE, MEMBER) #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) offsetof是一个自定义的宏,其返回值是一个member成员在一个type类型的结构体中相对于结构体首地址的字节偏移量: 分析其工作原理: 1.(TYPE *)0将0地址强制转换成TYPE *类型指针---------且可以认为,这个类型的结构体的首地址是0x0; 2.(TYPE *)0->MEMBER以指针…
Linux代码看的比较多了,经常会遇到container_of和list_for_each_entry,特别是 list_for_each_entry比较多,因为Linux经常用到链表,虽然知道这些函数的大概意思,但一旦出现一个类似的函数比如 list_for_each_entry_safe就又会感到头大,所以下定决心分析总结一下这些函数的用法,以后再看到这些面孔的时候也会轻松很多,读 Linux代码的时候不会那么吃力. 我们知道list_for_each_entry会用到list_entry,…
list_for_each原型: #define list_for_each(pos, head) \ for (pos = (head)->next, prefetch(pos->next); pos != (head); \ pos = pos->next, prefetch(pos->next))   它实际上是一个 for 循环,利用传入的 pos 作为循环变量,从表头 head 开始,逐项向后( next方向)移动 pos ,直至又回到 head ( prefetch()…
首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platform模型,有些文章只是把代码移植到平台上调试测试下,并没有理清内部逻辑调用关系,所以觉得有必要把两种驱动模型阐述剖析清楚,本文阅读者必须以在单片机上调试过IIC总线为前提,能够分析从芯片datasheet和其工作原理和总线的基本操作,虽然I2C硬件体系结构比较简单,但是I2C体系结构在Linux中…
spi子系统之驱动SSD1306 OLED 接触Linux之前,曾以为读源码可以更快的学习软件,于是前几个博客都是一边读源码一边添加注释,甚至精读到每一行代码,实际上效果并不理想,看过之后就忘记了.主要原因是没理解透程序架构,各个模块之间的关系,如何联系在一起,再加上没有实例验证.后来逐渐发现,理解框架能达到事半功倍的效果,理解框架之后,反而代码也更容易看懂,甚至可以猜部分代码的作用,印象更加深刻. 理解SPI的驱动框架,还是从最基本的三个入口点触发,platform_device,platfo…
int class_device_register(struct class_device *class_dev) { /* [cgw]: 初始化一个struct class_device */ class_device_initialize(class_dev); /* [cgw]: 添加一个struct class_device */ return class_device_add(class_dev); } /** * class_device_create - creates a cla…
转自:http://www.ibm.com/developerworks/cn/linux/l-rcu/ 一. 引言 众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在UNIX系统和Linux系统中得到了广泛的使用.但是随着计算机硬件的快速发展,获得这种锁的开销相对于CPU的速度在成倍地增加,原因很简单,CPU的速度与访问内存的速度差距越来越大,而这种锁使用了原子操作指令,它需要原子地访问内存,…