易截截图软件、单文件、免安装、纯绿色、仅160KB

linux内核(2.6)中的双循环链表浅析

       Linux 2.6内核链表数据结构的实现
在计算机科学中,链表是非常通用的数据结构,贯穿于整个linux的内核。在linux内核中,链表通常以
双循环链表的方式出现。所有链表的代码在include/linux/list.h文件中。
定义如下:
struct list_head {
struct list_head *next, *prev;
};
这里的list_head没有数据域。在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表。
list.h还定义了许多使用的宏和内联函数,下面介绍几个典型的:
#define LIST_HEAD_INIT(name) { &(name), &(name) }
#define LIST_HEAD(name) \
struct list_head name = LIST_HEAD_INIT(name)
static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
}

在linux的宏定义中,时常用到do{}while(0),这是为了方便再宏定义中包含多行代码,
关于这个的说明在网上可以找到很多详细的介绍。
在宏INIT_LIST_HEAD中,将它初始化为前后都指向自己
在linux内核的链表中,一个空链表定义如下: head->next指向链表的头元素。
list.h中还定义了 list_add() , list_add_tail(),list_del()等基本的链表操作函数,都是比较简单的
C语言这里不详述。
 
在list.h中极其有用的一个宏是list_for_each_entry
#define list_for_each_entry(pos, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member); \
prefetch(pos->member.next), &pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))
它可以遍历整个链表,在linux用的非常广泛,例如当CPU开始工作时,激活在工作队列中的每个进程
-----------------------------------------------------------------------------
kernel/workqueue.c
59 struct workqueue_struct {
60   struct cpu_workqueue_struct cpu_wq[NR_CPUS];
61   const char *name;
62   struct list_head list; /* Empty if single thread */
63 };
  ...
466   case CPU_ONLINE:
467     /* Kick off worker threads. */
468     list_for_each_entry(wq, &workqueues, list)
469     &nb


相关文档:

实战Linux Bluetooth编程(三) HCI层编程

1. HCI层协议概述:
HCI提供一套统一的方法来访问Bluetooth底层。如图所示:
从图上可以看出,Host Controller Interface(HCI)  就是用来沟通Host和Module。Host通常就是PC, Module则是以各种物理连接形式(USB,serial,pc-card等)连接到PC上的bluetooth Dongle。
在Host这一端:application,SDP,L2cap等协议 ......

实战Linux Bluetooth编程(六) L2CAP编程实例

例一:发送Signaling Packet:
Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输。所以得Signaling Command使用CID 0x0001.
多个Command可以在一个C-frame(control frame)中发送。
 如果要直接发送Signaling Command.需要建立SOCK_RAW类型的L2CAP连接Socket。这样才有机会自己填充Command Code,Identi ......

gdb调试程序(linux 下程序开发)

原文链接:http://www.trucy.org/blog/archives/eoiae/000087.html
 
      GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一 ......

小记VMWare下给linux添加新硬盘(备忘)

之前在VMWare下装的linux系统的可用硬盘空间越来越少,已经严重影响正常的使用了,于是就给它在VMWare下加了块硬盘,步骤如下: 1、通过VMWare给linux系统添加一个新硬盘 2、重启linux系统,键入 fdisk –l 命令查看新增硬盘的盘符(通常会有 “doesn't contain a valid partion table”的提示信息),假设为 /dev/s ......

深入Linux内核网络堆栈

作者:bioforge alkerr@yifan.net
原名: <<Hacking the Linux Kernel Network Stack>>
翻译,修改: duanjigang <duanjigang1983@126.com>
翻译参考:raodan (raod_at_30san.com) 2003-08-22
第一章  简介
本文将描述如何利用Linux网络堆栈的窍门(不一定都是漏洞)来达到一些目的,或 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号