对于一个计算机专业的学生,链表这种数据结构对我们来说再熟悉不过了,毕竟在大学的《数据结构》中就讲解过,相信你也自己实现过,它实现起来可能是这个样子:(这里的例子都来自《Linux内核设计与实现》第三版)

      假定我们有一个数据结构来描述犬科动物中的一员

struct fox
{unsigned long tail_length;unsigned long weight;bool          is_fantastic;
}

存储这个结构到链表里的通常方法是在数据结构中嵌入一个链表指针,比如:

struct fox
{unsigned long tail_length;unsigned long weight;bool          is_fantastic;struct fox    *next;struct fox    *prev;
}


由此得到的链表就像是这样:

      Linux内核方式与众不同,它不是将数据结构塞入链表,而是将链表节点塞入数据结构!
      1.链表数据结构

      在过去,内核中有很多链表的实现,该选一个既简单,又高效的链表来统一它们了。

      链表代码在头文件<linux/list.h>中声明,其数据结构很简单:

struct list_head
{struct list_head *next;struct list_head *prev;
}

next指针指向下一个链表节点,prev指针指向前一个。然而,似乎这里还看不出它们有多大的作用。到底声明才是链表存储的具体内容呢?其实关键在于理解 list_head 结构是如何使用的。

      

struct fox
{unsigned long tail_length;unsigned long weight;bool          is_fantastic;struct list_head   list;
}

上述结构中,fox 中的list.next指向下一个元素,list.prev 指向前一个元素。现在链表已经能用了,但是显然还不够方便。因此内核又提供了一组链表操作例程。比如list_add()方法加入一个新的节点到链表中。但是,这些方法都有一个统一的特点:它们只接受 list_head 结构作为参数。使用宏 container_of() 我们可以很方便的从链表指针找到父结构中包含的任何变量。这是因为在 C 语言中,一个给定结构中的变量偏移在编译时地址就被ABI固定下来了。


Linux2.6内核中链表的实现相关推荐

  1. linux内核中链表代码分析---list.h头文件分析(二)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...

  2. 详解Linux2.6内核中基于platform机制的驱动模型

    原文地址:详解Linux2.6内核中基于platform机制的驱动模型 作者:nacichan [摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了P ...

  3. linux内核中链表代码分析---list.h头文件分析(一)

    linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17:13:14 在学习数据结构时,有一个重要的知识点就是链表.对于链表的一些基本操作,它的最好学习资料就是内核中的li ...

  4. 如下为利用Linux内核链表创建,Linux内核中链表的实现与应用

    链表(循环双向链表)是Linux内核中最简单.最常用的一种数据结构. 1.链表的定义 struct list_head { struct list_head *next, *prev; } 这个不含数 ...

  5. 详解Linux2.6内核中基于platform机制的驱动模型 (经典)

    [摘要]本文以Linux 2.6.25 内核为例,分析了基于platform总线的驱动模型.首先介绍了Platform总线的基本概念,接着介绍了platform device和platform dri ...

  6. 从串口驱动的移植看linux2.6内核中的驱动模型 platform device platform driver【转】...

    转自:http://blog.csdn.net/bonnshore/article/details/7979705 写在前面的话: 博主新开了个人站点:你也可以在这里看到这篇文章,点击打开链接 本文是 ...

  7. linux系统调用劫持隐藏进程,Linux2.6内核中劫持系统调用隐藏进程

    //#include #define CALLOFF 100 //使用模块参数来定义需要隐藏的进程名 int orig_cr0; char psname[10]="looptest" ...

  8. 如何放出Linux内核中的链表大招

    前言 上回,我们说到Linux内核中max()宏的终极奥义,Linux内核链表也不甘示弱,那么接下来,让我们看看Linux内核中的链表大招. 如何放出Linux内核中的链表大招 前言 一.链表简介 ( ...

  9. Linux内核(10) - 内核中的链表

    早上上班坐地铁要排队,到了公司楼下等电梯要排队,中午吃饭要排队,下班了追求一个女孩子也要排队,甚至在网上下载个什么门的短片也要排队,每次看见人群排成一条长龙时,才真正意识到自己是龙的传人.那么下面咱们 ...

最新文章

  1. linux egg,Linux服务器部署egg,日志
  2. 艿艿连肝了几个周末,写了一篇贼长的 Spring 响应式 Web 框架 WebFlux!市面第二完整~
  3. mysql git 获取 稳定版本 源码_webmagic新版文档(更新中)
  4. Linux/unix 查看端口占用
  5. [Gamma阶段]展示博客
  6. Java Singleton类中的线程安全性的示例代码
  7. 豆米--基于豆瓣API的WP7书籍搜索工具开源啦!
  8. shell下将查看大文件有多少行
  9. recovery升级是显示进度条_注意!税控系统软件升级了,还有疑问看这里!
  10. php 属性名字访问,php – 如何使用连字符的名称访问此对象属性?
  11. java读取图片成rgb二维数组
  12. Struts2的学习-属性驱动和模型驱动
  13. 自己动手开发编译器(二)正则语言和正则表达式
  14. wamp环境单独安装(windows下apache2.4、mysql5.5、php5.5的版本)
  15. informix for linux数据库下载,informix for linux安装全攻略(原创)
  16. mac safari 下载pdf
  17. deepinv2 添加打印机_Deepin系统上安装使用HP惠普打印机的方法
  18. php进度台帐管理系统,捷雅途 - 工程量0号台账管理系统快速操作说明
  19. 整理出Android逆向系列学习进阶视频,全网疯传
  20. h5抽奖大转盘开发笔记小结,涉及到的知识点和包资源

热门文章

  1. mvc重定向方式详解
  2. Yii2 定时任务创建(Console 任务)
  3. Track与nqa联动 VS 静态路由优先级相同
  4. 设置/修改centos上的swap交换分区的方法
  5. .NET新手系列(六)
  6. Linux查看系统开机时间(转)
  7. Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】
  8. 利用samba和mount命令 进行文件共享
  9. MySQL批量SQL插入性能优化
  10. python3 pyinstaller 打包后 程序会显示两个进程 解决方法