登录社区云,与社区用户共同成长
邀请您加入社区
收藏夹四版演进:状态同步、乐观更新与写入队列、持久化三钩子、动画触觉,附回归清单与取舍记录。
linux内核双向循环链表list_head
本文转载自:http://blog.csdn.net/coding__madman/article/details/51325646链表简介:链表是一种常用的数据结构,它通过指针将一系列数据节点连接成一条数据链。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或者删除数据。链表的开销主要是访问的顺序性和组织链的空间损失。...
可以说是Linux内核使用的最多的数据结构之一了,它让开发人员能以双向链表的形式快速将当前结构链接起来,同时对链表进行基本操作。其定义如下:使用方法就是将以成员变量的形式添加到其他数据结构中。假设现有一群学生在排队获取同学S其前面一位同学的方式为,是不是很简单?但是你可能会问,获取的是前一位同学的成员变量,那还是不能访问前一位同学自身结构啊?问得好,我们接着介绍…宏定义,获取类型结构体中成员的偏移
在上一篇中,我们详细介绍了list_head,这篇文我们介绍hlist_head、hlist_node
根据Linux内核邮件列表的消息,社区近日讨论了是否要为内核采用现代 C 语言标准。虽然 Linux 内核在快速发展,但它同时依赖着一些非常古老的工具,其中之一就是内核代码仍在使用1989年版本的 C 语言标准——此标准在30多年前内核项目启动之前就已经编写完成。从讨论结果来看,这一情况有望在5.18版本内核中改变。Jakob Koschel 在向 Linus Torvalds 递交的补丁(htt
进程管理1 进程描述符及任务结构分配进程描述符进程描述符的存放进程状态设置当前进程状态进程上下文进程家族树2 进程创建写时拷贝fork()vfork()3 线程在Linux中的实现4 进程终结删除进程描述符孤儿进程造成的进退微谷5 小结1 进程描述符及任务结构分配进程描述符进程描述符的存放进程状态设置当前进程状态进程上下文进程家族树2 进程创建写时拷贝fork()vfork()3 线程在Linux
做内核驱动开发经常会使用linux内核最经典的双向链表 list_head, 以及它的拓展接口(或者宏定义): list_add , list_add_tail, list_del , list_entry ,list_for_each , list_for_each_entry ......每次看到这些接口,感觉都很像,今天专门研究了一下内核,对它们做一些总结,希望为后续开发提供方便。首先找到l
1 链表简述在讲Linux内核中的链表之前,我们先来看一下平时所见的链表:/*平时所见的单向链表*/struct entry{int data;char * desc;struct entry *next;}/*平时所见的双向链表*/struct entry{int data;char * desc;struct entry *prev;struct...
链表使用基础:链表是linux内核中最简单,最普遍的数据结构。刚开始接触内核的人可能会对linux的链表操作有点不习惯,因为它不是把数据结构放到链表里面,而是把链表节点放到数据结构里面。链表代码在头文件中声明,其数据结构很简单:struct list_head{struct list_head *next;struct list_head *prev;
在用户空间编程使用linux内核链表list,hlist宏定义和操作.linux内核中的list_head和hlist_head/hlist_node是将数据结构串起来成为链表的两个重要链表构造工具。利用他们和其对应的宏定义,可以非常容易地将数据构成链表,进行链表的各种操作,和数据查询。在内核中,他们使用的十分广泛。这些链表操作宏定义具有通用性,和具体数据结构无关。利用他们
Linux2.6.24struct task_struct {volatile long state;/* -1 unrunnable, 0 runnable, >0 stopped */void *stack;atomic_t usage;unsigned int flags;/* per process flags, defined below */unsigned i
基于Linux内核SPI子系统工作机制基本思路,需要了解的知识点。硬件方面:1:什么是SPI2:三星的ARM9 s3c2440的SPI寄存器的使用3:什么是CAN总线4:CAN总线的传输及特点5:MCP2515 CAN控制器的使用软件方面:1:了解并会使用linux内核2.6.30.9的SPI子系统的框架及如何实现2:掌握platform device
阻塞I/O意味着一直等待设备可访问再访问,非阻塞I/O意味着使用poll()来查询是否可访问,而异步通知则意味着设备通知应用程序自身可访问。(异步通知:很简单,一旦设备准备好,就主动通知应用程序,这种情况下应用程序就不需要查询设备状态,这是不是特像硬件上常提的“中断的概念”。上边比较准确的说法其实应该叫做“信号驱动的异步I/O”,信号是在软件层次上对中断机制的一种模拟。)说到信号,在应用程序中
今天随便看了一下代码,就把控制进程的数据结构拿出来了,2.6的可以0.11的复杂的多的多。struct task_struct {volatile long state;/* -1 unrunnable, 0 runnable, >0 stopped */struct thread_info *thread_info;atomic_t usage;unsigned long fl
1.linux内核定时器基本结构和函数1)struct timer_list 一个struct timer_list对应了一个定时器。#include以下列出常用的接口:struct timer_list { /*....*/ unsigned long expires;//定时器服务函数开始执行时间 void (*f
前面我们分析了设备驱动模型中的device和driver,device和driver本来是不相关的东西,只因为bus的存在,才被联系到了一起。本节就来看看设备驱动模型中起枢纽作用的bus。本节的头文件在include/linux/device.h和drivers/base/base.h,实现代码主要在bus.c中。因为在bus中有很多代码时为了device找到driver或者driver找到dev
Linux内核中存在一个非常有用的数据结构list_head,其定义如下:struct list_head {struct list_head *prev;struct list_head *next;};这个结构在内核的许多地方出现,是很多数据结构的组成部分。通过这个部件,这些数据很容易组成一个双向链表。相比为每个需要构造双向链表的结构体都提供构建链表相关的数据和操作,统一
Ø 实验目的与意义1 、掌握printk 的使用、设置及实现原理,理解分级别进行打印log 信息的实现方法2 、掌握如何分析oops 的方法3 、掌握strace 工具的移植和使用方法 Ø 基本原理和方法1 、请回顾栈的工作原理,尤其是栈帧的作用2 、请对照printk 的源代码来进行printk 相关实验,并在实验中进一步理解源代码 Ø 实
Linux散列链表散列链表从形式上看,就像是由多个链表的头部所构成的一个数组,每个链表都对应该数组中的某个元素,用以解决键值冲突的问题。末节点的next指向NULL;node1的pprev指向first这个图不知道理解的对不对,请各位指教!1、散列链表的定义struct hlist_head {struct hlist_node *first;};struc
之前我们分析了引用计数kref,总结了sysfs提供的API,并翻译了介绍kobject原理及用法的文档。应该说准备工作做得足够多,kobject的实现怎么都可以看懂了,甚至只需要总结下API就行了。可我还是决定把kobject的实现代码从头分析一遍。一是因为kobject的代码很重要,会在设备驱动模型代码中无数次被用到,如果不熟悉的话可以说是举步维艰。二是为了熟悉linux的编码风格,为以后分析
以下全部来自于http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 无任何个人意见。本文详细分析了 2.6.x 内核中链表结构的实现,并通过实例对每个链表操作接口进行了详尽的讲解。一、 链表数据结构简介链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的
1、内核链表的定义在include/linux/list.hstruct list_head { struct list_head *next, *prev;};容易看出,Linux内核链表为双向链表。 2、Linux链表与普通链表区别我们通常定义的链表是在链表节点中嵌入元素,比如struct MyList{ int StudentID; /*
前面我们分析了device、driver、bus三种类型,主要是三者的注册与注销,在sysfs中的目录与属性文件创建等内容。本节就来详细分析下,在设备注册到总线上时,总线是如何为其寻找对应的驱动的;在驱动注册到总线上时,总线又是如何为其寻找对应的设备的。本节的实现代码集中在drivers/base/bus.c和drivers/base/dd.c中。先来回忆下,在device_reg
数据包的接收作者:kendoKernel:2.6.12一、从网卡说起这并非是一个网卡驱动分析的专门文档,只是对网卡处理数据包的流程进行一个重点的分析。这里以Intel的e100驱动为例进行分析。大多数网卡都是一个PCI设备,PCI设备都包含了一个标准的配置寄存器,寄存器中,包含了PCI设备的厂商ID、设备ID等等信息,驱动程序使用来描述这些寄存器的标识符。如
出自:http://hi.baidu.com/wzt85/item/dcea082c90c9ed0942634ad21、 为什么要突破模块验证Linux内核版本很多,升级很快,2个小内核版本中内核函数的定义可能都不一样,为了确保不一致的驱动程序导致kernel oops, 开发者加入了模块验证机制。它在加载内核模块的时候对模块进行校验, 如果模块与主机的一些环境不一致,就会加载不成功。
前面我们说到过list_head,这是linux中通用的链表形式,双向循环链表,功能强大,实现简单优雅。可如果您认为list_head就是链表的极致,应该在linux链表界一统天下,那可就错了。据我所知,linux内核代码中至少还有两种链表能占有一席之地。一种就是hlist,一种就是本节要介绍的klist。虽然三者不同,但hlist和klist都可以看成是从list_head中发展出来的,用于特殊
在linux内核中,有一种通用的双向循环链表,构成了各种队列的基础。链表的结构定义和相关函数均在include/linux/list.h中,下面就来全面的介绍这一链表的各种API。struct list_head { struct list_head *next, *prev; }; 这是链表的元素结构。因为是循环链表,表头和表中节点都是这一结构。有prev和
Linux内核部件分析设备驱动模型之device-driver前面我们分析了device、driver、bus三种类型,主要是三者的注册与注销,在sysfs中的目录与属性文件创建等内容。本节就来详细分析下,在设备注册到总线上时,总线是如何为其寻找对应的驱动的;在驱动注册到总线上时,总线又是如何为其寻找对应的设备的。本节的实现代码集中在drivers/base/bus.c和d
当你必须一个复杂的系统,协调系统的方方面面,灵活地支持各种机制和策略,即使很简单的问题也会变得很复杂。linux绝对就是这样一个复杂的系统。所以我们要理解它,尽量从原理的角度去理解事务的处理流程,尽量避免各种细枝末节的干扰,尽量规避那些足以压垮自己的庞然大物。(尽管细致末节和庞然大物很可能就是linux闪光的地方,但我们还是小心为上。)原理 现在我们来考虑linux中线程的阻
kref是一个引用计数器,它被嵌套进其它的结构中,记录所嵌套结构的引用计数,并在计数清零时调用相应的清理函数。kref的原理和实现都非常简单,但要想用好却不容易,或者说kref被创建就是为了跟踪复杂情况下地结构引用销毁情况。所以这里先介绍kref的实现,再介绍其使用规则。kref的头文件在include/linux/kref.h,实现在lib/kref.c。闲话少说,上代码。s
linux内核使用了lru算法来置换内存页面,但是实际上并不是纯的lru算法,里面掺杂了很多别的思想,比如第二次机会,比如双时钟指针等等。这里着重说一下第二次机会的体现。在内核中有一个mark_page_accessed函数,它实际上体现一个状态机,这是它的实现:if (!PageActive(page) && PageReferenced(page) && PageLRU(page)) {
个人首先参考了如下两篇文章:http://blog.csdn.net/hongchangfirst/article/details/7076225http://hi.baidu.com/mynana/blog/item/1da1ba99239ceb006f068c48.html一个侧重于应用,另一个则介绍了部分的内部原理。这里记录我个人的理解。参考文献:《linux内核设计与实
一:前言RCU机制出现的比较早,只是在linux kernel中一直到2.5版本的时候才被采用.关于RCU机制,这里就不做过多的介绍了,网上有很多有关RCU介绍和使用的文档.请自行查阅.本文主要是从linux kernel源代码的角度.来分析RCU的实现.在讨论RCU的实现之前.有必要重申以下几点:1:RCU使用在读者多而写者少的情况.RCU和读写锁相似.但RCU的读者占锁
转载于:http://blog.mcuol.com/User/webenson/Article/1816_1.htm本文通过整理之前研发的一个项目 (ARM7TDMI + uCLinux),分析内核启动过程及需要修改的文件,以供内核移植者参考。整理过程中也同时参考了众多网友的帖子,在此谢过。由于整理过程匆忙,难免错 误及讲解的不够清楚之处,请各位网友指正,这里提前谢过。本文分以下部
源出处:http://www.startos.com/linux/tips/2011011921499_3.html在决定调用sleep_on系列函数到真正调用schedule系列函数期间,若等待的条件为真,若此时继续schedule,相当于丢失了一次唤醒机会。因此sleep_on系列函数会引入竞态,导致系统的不安全。 另外对于interruptible系列函数,其返
源出处:http://www.startos.com/linux/tips/2011011921499_4.html2.3.3 prepare_to_wait和finish_wait /* * Used to distinguish between sync and async io wait context: * sync i/o typical
//xk> 引子 首先看一个简单的面试题:定义一个宏FIND(stru, e),求结构体stru中某个成员e相对于stru的偏移量。 题目的解答很简单:#define FIND(stru, e) &(((stru *)0)->e)将常量0强制类型转化为stru *类型的指针。因为结构体的首地址为0,所以其成员的地址即为相对于结构体的偏移量。
当你必须一个复杂的系统,协调系统的方方面面,灵活地支持各种机制和策略,即使很简单的问题也会变得很复杂。linux绝对就是这样一个复杂的系统。所以我们要理解它,尽量从原理的角度去理解事务的处理流程,尽量避免各种细枝末节的干扰,尽量规避那些足以压垮自己的庞然大物。(尽管细致末节和庞然大物很可能就是linux闪光的地方,但我们还是小心为上。)原理 现在我们来考虑linux中线程的阻塞。它的
源出处: http://www.startos.com/linux/tips/2011011921499_6.html4.2 wake_up 的实现细节 \kernel \sched.c /* * The core wakeup function. Non-exclusive wakeups (nr_exclusive == 0) just
《Linux内核中链表的使用》本文档的Copyleft归rosetta所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性。参考资料:LKD3e,linux-2.6.27源码来源:http://blog.csdn.net/rosetta 链表是存放和操作可变数量元素的数据结构,它可在需要时动态创建结点并插入链表中,在编译时不需知道包含多少个元素,而且它在内存
http://www.douban.com/note/57007577/Linux内核代码之初始化内核临时页表---经典至极2010-01-15 18:51:04漫长而黑暗的史前时代终于到了setup。在setup汇编函数中,linux通过设置cr0寄存器的PE位(从实模式切换到保护模式)完成了史前文明到现代文明的转变。在setup时期,linux已经了解到
第六章 Linux内核的Softirq机制(By 詹荣开,NUDT) Copyright © 2003 by 詹荣开E-mail:zhanrk@sohu.comLinux-2.4.0Version 1.0.0,2003-2-14 摘要:本文主要从内核实现的角度分析了Linux 2.4.0内核的Softirq机制。本文是为那些想要了解L
list_head结构的介绍list_head结构定义在 里,它是一个double linked list的结构。 底下是它的结构宣告: struct list_head {struct list_head *next, *prev;}; 有的人可能看到这样的结构会觉得很奇怪这样的结构可以存放资料吗? 当然是不行的
源出处:http://www.startos.com/linux/tips/2011011921499.html1 休眠与同步 一个驱动当它无法立刻满足请求应当如何响应? 一个对 read 的调用可能当没有数据时到来, 而以后会期待更多的数据。或者一个进程可能试图写, 但是你的设备没有准备好接受数据, 因为你的输出缓冲满了。调用进程往往不关心这种问题; 程序员只希望调用 read
list
——list
联系我们(工作时间:8:30-22:00)
400-660-0108 kefu@csdn.net