内核中很多地方用到队列,如果每一个数据结构都实现一个双向队列,并针对这些数据结构实现对应的操作,那么代码将会非常冗余,于是内核抽象出了list_head数据结构,并文参考内核中的代码写成,实现了一个list_head demo。

#include <iostream>
#include <stdint.h> using namespace std; #define list_entry(ptr, type, member) \
( (type *) ((char *)(ptr) - (unsigned long)(&((type *))->member))) struct list_head {
struct list_head *prev, *next;
}; inline void init_list_head (struct list_head *ptr)
{
ptr->prev = ptr;
ptr->next = ptr;
} inline void __list_add (struct list_head *prev, struct list_head *next, struct list_head *node)
{
prev->next = node;
next->prev = node;
node->prev = prev;
node->next = next;
} inline void list_add (struct list_head *head, struct list_head *node)
{
__list_add (head, head->next, node);
} inline void __list_del (struct list_head *prev, struct list_head *next)
{
next->prev = prev;
prev->next = next;
} inline void list_del (struct list_head *node)
{
__list_del (node->prev, node->next);
} struct page {
int32_t id;
struct list_head lru;
page(int32_t pid) : id(pid) {}
}; struct list_head pageLRUList; int main ()
{
init_list_head(&pageLRUList); int i; for (i = ; i < ; i++) {
struct page *tmpPage = new struct page(i);
list_add(&pageLRUList, &tmpPage->lru);
} struct list_head *tmpPtr = &pageLRUList;
for (i = ; i < ; i++) {
tmpPtr = tmpPtr->next;
struct page *tmpPage = list_entry(tmpPtr, struct page, lru);//(struct page *)((char*)(tmpPtr) - (unsigned long)(&((struct page*)0)->lru));
cout << tmpPage->id << endl;
} return ;
}

#后记,很久没有写博客了,之前在点点,lofter有写技术博客,但是发觉并不是太好,又辗转至此。

Kernel list_head demo实现的更多相关文章

  1. .NET 平台下的插件化开发内核(Rabbit Kernel)-转

    什么是RabbitHub? RabbitHub 是专门针对 .NET 平台所设计.研发的一套相对完整的插件开发框架,它是由一个内核两大框架多个组件及一系列的开发时支持而构成. RabbitHub 架构 ...

  2. .NET 平台下的插件化开发内核(Rabbit Kernel)

    每个程序猿都有一个框架梦,曾经在2013年8月15日写过一篇"Koala Framework是什么?我为什么要写这个框架?"的文章,在开放框架路上迈出了第一步,之后作者如愿找到了一 ...

  3. NET 平台下的插件化开发内核

    .NET 平台下的插件化开发内核(Rabbit Kernel)   每个程序猿都有一个框架梦,曾经在2013年8月15日写过一篇“Koala Framework是什么?我为什么要写这个框架?”的文章, ...

  4. Data Types in the Kernel &lt;LDD3 学习笔记&gt;

    Data Types in the Kernel Use of Standard C Types /* * datasize.c -- print the size of common data it ...

  5. I.MX6 PWM buzzer driver hacking with Demo test

    /***************************************************************************** * I.MX6 PWM buzzer dr ...

  6. 学习LSM(Linux security module)之二:编写并运行一个简单的demo

    各种折腾,经过了一个蛋疼的周末,终于在Ubuntu14.04上运行了一个基于LSM的简单demo程序. 一:程序编写 先简单的看一下这个demo: //demo_lsm.c#include <l ...

  7. Kernel pwn 基础教程之 ret2usr 与 bypass_smep

    一.前言 在我们的pwn学习过程中,能够很明显的感觉到开发人员们为了阻止某些利用手段而增加的保护机制,往往这些保护机制又会引发出新的bypass技巧,像是我们非常熟悉的Shellcode与NX,NX与 ...

  8. 深入理解mmap--内核代码分析及驱动demo示例

    mmap是一个很常用的系统调用,无论是分配内存.读写大文件.链接动态库文件,还是多进程间共享内存,都可以看到其身影.本文首先介绍了进程地址空间和mmap,然后分析了内核代码以了解其实现,最后通过一个简 ...

  9. Zybo GPIO Demo Run Embedded Linux

    1.Environment Ubuntu 12.04 x86_64 Vivado 2013.4 SDK 2013.4   2.Pre-requisites 2.1 CodeSourcery arm-g ...

随机推荐

  1. java的wait/notify小结

    wait()是使线程停止运行,而notify使停止的线程继续运行 wait()锁释放与notify()锁不释放 当线程呈wait状态时,调用线程对象的interrupt()方法会出现异常 带一个参数的 ...

  2. [巩固C#] 一、特性是什么东东

    阅读目录   关闭   前言 特性是什么? 那么什么是“元数据”? 特性到底是什么? 我们自定义一个特性玩玩 什么是命名参数? 我们来继续要看看AttributeUsage(这个描... 自定义特性可 ...

  3. Chrome拷贝插件的对比 zeroclipboard和clipboard插件

    1.zeroclipboard插件 实现原理:Zero Clipboard 利用 Flash 进行复制,用了一个透明的 Flash ,让其漂浮在按钮之上,这样其实点击的不是按钮而是 Flash ,也就 ...

  4. 【MATLAB】对离散采样信号添加高斯白噪声(已知Eb/N0)

    (1)首先计算已知信号序列(采样之后得到的信号)的平均功率.该序列在第n个点处的功率为: 如果已知的信号序列中的总共的点数为N个,则该序列的平均功率为: 在MATLAB中求平均功率的方法是: Pav= ...

  5. Azure进阶攻略 | 你的程序也能察言观色?这个真的可以有!

    前段时间有个网站曾经火爆微博和朋友圈:颜龄机器人.只要随便上传一张包含人面孔的照片,这个网站就可以分析图片,并判断照片中人物的年龄.化妆.美颜 P 图.帽子墨镜之类的配饰,几乎都没法影响这个网站的检测 ...

  6. Eclipse: 导入项目乱码问题解决

    1.编码不对 a.对某文件或某工程更改编码: 鼠标移到工程名或文件名,右键->Properties->Resource->Text file enCoding ->更改编码(G ...

  7. Extjs4如何构造store基类

    目标:重写一个BaseStore的基类,它继承自Ext.data.Store基类. autoLoad:true/false 是否自动加载,true时创建store即自动加载,一般适合get方式:fal ...

  8. LeetCode Path Sum 判断树的路径之和

    /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; ...

  9. OpenGL学习 Introduction

    OpenGL and Graphics Pipeline The word pipeline is from production lines in factories.Generating a pr ...

  10. UI5 Source code map机制的细节介绍

    在我的博客A debugging issue caused by source code mapping里我介绍了在我做SAP C4C开发时遇到的一个曾经困扰我很久的问题,最后结论是这个问题由于Jav ...