我们都知道,链表是数据结构中用得最广泛的一种数据结构,对于数据结构,有顺序存储,数组就是一种.有链式存储,链表算一种.当然还有索引式的,散列式的,各种风格的说法,叫法层出不穷,但是万变不离其中,只要知道什么场合用什么样的数据结构,那就行了. 那么,标题说的内核万能链表,其实就是内核链表,它到底和我们平常大学学的数据结构的链表有什么不同呢??内核链表,是在linux内核里的一种普遍存在的数据结构,比如内核调度算法中有这样的结构,摄像头驱动程序,wifi模块,G_sensor等等,用到链表的东西实在…
概要 前面一章"介绍双向链表并给出了C/C++/Java三种实现",本章继续对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法.其中,也会涉及到Linux内核中非常常用的两个经典宏定义offsetof和container_of.内容包括:1. Linux中的两个经典宏定义2. Linux中双向链表的经典实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3562146.html 更多内容: 数据结构与算法系列 目录 L…
导读 Linux 内核中自己实现了双向链表,可以在 include/linux/list.h 找到定义.我们将会首先从双向链表数据结构开始介绍内核里的数据结构.为什么?因为它在内核里使用的很广泛,你只需要在 free-electrons.com 检索一下就知道了. 首先让我们看一下在 include/linux/types.h 里的主结构体: struct list_head { struct list_head *next, *prev; }; 你可能注意到这和你以前见过的双向链表的实现方法是…
当我们每个人接触Linux之前,应该先接触的都是windows吧?但我们一般接触Linux后,习惯linux的管理和使用方法后,我们再回过头再来使用windows的时候,内心其实是拒绝的.我们会觉得图形好麻烦,图形好Low的感觉,这个时候我们差不多是一个linux的重度爱好者了.对于Linux是欲罢不能的,真是一个遇到贵妇一样的感觉,总是觉的她很神秘.很多我们想探索的地方.windows和linux作为杰出的系统代表,磕磕盼盼在所难免,他们之间也有很多不为人知的故事,今天我将梳理一下linux与…
当我们每个人接触Linux之前,应该先接触的都是windows吧?但我们一般接触Linux后,习惯linux的管理和使用方法后,我们再回过头再来使用windows的时候,内心其实是拒绝的.我们会觉得图形好麻烦,图形好Low的感觉,这个时候我们差不多是一个linux的重度爱好者了.对于Linux是欲罢不能的,真是一个遇到贵妇一样的感觉,总是觉的她很神秘.很多我们想探索的地方.windows和linux作为杰出的系统代表,磕磕盼盼在所难免,他们之间也有很多不为人知的故事,今天我将梳理一下linux与…
简介: 作为一个系统管理程序(hypervisor),Linux® 有几个创新,2.6.32 内核中一个有趣的变化是 KSM(Kernel Samepage Merging)  允许这个系统管理程序通过合并内存页面来增加并发虚拟机的数量.本文探索 KSM 背后的理念(比如存储去耦合).KSM 的实现.以及如何管理 KSM. 服务器虚拟化 虚拟化技术从上世纪 60 年代开始出现,经由 IBM® System/360® 大型机得以流行.50 年过后,虚拟化技术取得了跨越式发展,使得多个操作系统和应用…
#define container_of(ptr, type, member) ({ \ const typeof(((type *)0)->member) * __mptr = (ptr); \ (type *)((char *)__mptr - offsetof(type, member)); }) #endif 作用:通过结构体成员变量member的地址,反推出member成员所在结构体变量的首地址,ptr指向成员变量member. 解析: 1)({ })是何方神圣? ({ })是GNU…
本文发表于Linux Format magazine杂志,作者从技术深度上解释了Linux Kernel是如何工作的.相信对Linux开发者来说有不小的帮助. 牛津字典中对"kernel"一词的定义是:"较软的.通常是一个坚果可食用的部分."当然还有第二种定义:"某个东西核心或者最重要的部分."对Linux来说,它的Kernel无疑属于第二种解释.让我们来看看这个重要的东西是如何工作的,先从一点理论说起. 广义地来说kernel就是一个软件,它在…
offsetof用于计算TYPE结构体中MEMBER成员的偏移位置. #ifndef offsetof#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)#endif TYPE:结构体类型 MEMBER:结构体中的某一成员 分析: 1)(TYPE*)0:0被强制转换了,转换成了一个TYPE类型的结构体的指针 2)通过箭头操作,去访问MEMBER成员.问,在0地址处有个TYPE类型的结构体吗?答案肯定是没有的,因为0地址处…
双向链表 传统链表与linu内核链表的区别图: 图一 图二 从上图中看出在传统链表中各种不同链表间没有通用性,因为各个数据域不同,而在linux内核中巧妙将链表结构内嵌到数据域结构中使得不同结构之间能连接起来: 链表的常用操作 内核中链表实现文件路径:include/linux/list.h 链表结构定义 struct list_head { struct list_head *next, *prev; }; 获取结构入口地址(list_entry) #define list_entry(ptr…