linux内核数据结构bitmap学习

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 #define MAX_PRIO 10000
  5 #define BITS_PER_LONG 32
  6 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
  7
  8 #define BIT(nr)            (1UL << (nr))
  9 #define BIT_MASK(nr)        (1UL << ((nr) % BITS_PER_LONG))
 10 #define BIT_WORD(nr)        ((nr) / BITS_PER_LONG)
 11 #define BITS_PER_BYTE        8
 12
 13 #define BITS_TO_LONGS(nr)    DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
 14
 15 #define DECLARE_BITMAP(name,bits)  16     unsigned long name[BITS_TO_LONGS(bits)]
 17
 18 static inline void __set_bit(int nr, volatile unsigned long *addr)
 19 {
 20     unsigned long mask = BIT_MASK(nr);
 21     unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
 22
 23     *p  |= mask;
 24 }
 25
 26 static inline void __clear_bit(int nr, volatile unsigned long *addr)
 27 {
 28     unsigned long mask = BIT_MASK(nr);
 29     unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
 30
 31     *p &= ~mask;
 32 }
 33
 34 static inline void __change_bit(int nr, volatile unsigned long *addr)
 35 {
 36     unsigned long mask = BIT_MASK(nr);
 37     unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
 38
 39     *p ^= mask;
 40 }
 41
 42 static inline int __test_and_set_bit(int nr, volatile unsigned long *addr)
 43 {
 44     unsigned long mask = BIT_MASK(nr);
 45     unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
 46     unsigned long old = *p;
 47
 48     *p = old | mask;
 49     return (old & mask) != 0;
 50 }
 51
 52 static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr)
 53 {
 54     unsigned long mask = BIT_MASK(nr);
 55     unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
 56     unsigned long old = *p;
 57
 58     *p = old & ~mask;
 59     return (old & mask) != 0;
 60 }
 61
 62 static inline int __test_and_change_bit(int nr, volatile unsigned long *addr)
 63 {
 64     unsigned long mask = BIT_MASK(nr);
 65     unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
 66     unsigned long old = *p;
 67
 68     *p = old ^ mask;
 69     return (old & mask) != 0;
 70 }
 71
 72 static inline int test_bit(int nr, const volatile unsigned long *addr)
 73 {
 74     return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
 75 }
 76
 77 #ifndef container_of
 78 /**
 79  * container_of - cast a member of a structure out to the containing structure
 80  * @ptr:    the pointer to the member.
 81  * @type:    the type of the container struct this is embedded in.
 82  * @member:    the name of the member within the struct.
 83  *
 84  */
 85 #define container_of(ptr, type, member) ({             86     const typeof(((type *)0)->member) * __mptr = (ptr);     87     (type *)((char *)__mptr - offsetof(type, member)); })
 88 #endif
 89
 90 #define list_entry(ptr, type, member) container_of(ptr, type, member)
 91
 92 int _tmain(int argc, _TCHAR* argv[])
 93 {
 94     DECLARE_BITMAP(bitmap1, MAX_PRIO);
 95     DECLARE_BITMAP(bitmap2, MAX_PRIO);
 96     int i;
 97
 98     /* 00000000 - 99999999 使用一个bitmap */
 99     int num1 = 9999;
100     int num2 = 9999;
101
102     char buff[32] = {0};
103
104     for (i = 0; i < MAX_PRIO; i++) {
105
106         __clear_bit(i, bitmap1);
107         __clear_bit(i, bitmap2);
108     }
109
110     __set_bit(num1, bitmap1);
111     __set_bit(num2, bitmap2);
112
113     printf("bitmap size = %d\n", sizeof(bitmap1)/sizeof(long));
114     printf("bitmap = %d\n", test_bit(num1, bitmap1));
115     printf("bitmap = %d\n", test_bit(num2, bitmap2));
116     printf("atoi : %d\n", atoi("0010"));
117     printf("%4d%4d\n", num1, num2);
118
119     sprintf(buff, "%.4d%.4d\n", num1, 1);
120     printf(buff);
121     return 0;
122 }
时间: 2024-08-04 03:04:03

linux内核数据结构bitmap学习的相关文章

linux内核数据结构学习总结(undone)

本文旨在整理内核和应用层分别涉及到的数据结构,从基础数据结构的角度来为内核研究作准备,会在今后的研究中不断补充 目录 1. 进程相关数据结构 1) struct task_struct 2. 内核中的队列/链表对象 3. 内核模块相关数据结构 2) struct module 1. 进程相关数据结构 0x1: task_struct 我们知道,在windows中使用PCB(进程控制块)来对进程的运行状态进行描述,对应的,在linux中使用task_struct结构体存储相关的进程信息,task_

linux内核启动过程学习总结

下面是学习linux内核启动过程的记录 平台是:powerpc mpc8548 + linux2.6.23 内核 通用寄存器的作用r0 :在函数开始时使用r1 :存放堆栈指针,相当于ia32架构中的esp寄存器r2 :存放当前进程的描述符的地址r3 :存放第一个参数和返回地址r4-r10 :存放函数的参数r11 :用在指针的调用和当前一些语言的环境指针r12 :用于存放异常处理r13 :保留做为系统线程IDr14-r31 :作为本地变量,具有非易失性 Linux启动过程描述 第一步:使用Boot

Linux内核分析第一次学习报告

Linux内核分析第一次学习报告 学生 黎静 学习内容 1.存储程序计算机工作模型 冯诺依曼体系结构:核心思想为存储程序计算机. CPU抽象为for循环,总是执行下一条指令,内存保存指令和数据,CPU来解释和执行这些指令. API:应用程序编程接口(程序员与计算机的接口界面) ABI:二进制接口,指令编码(程序员与CPU的接口界面) 2.X86汇编 1.寄存器 (1)通用寄存器 (2)段寄存器: (3)标志寄存器 2.计算机的汇编指令 (1)movl指令: 寄存器寻址,寄存器模式,以%开头的寄存

Go语言移植Linux内核数据结构hlist

hlist(哈希链表)可以通过相应的Hash算法,迅速找到相关的链表Head及节点. 在有些应用场景,比Go标准库提供的list(一种双向链表)更合适. 依照list.h中的源码,我实现了一个Go语言版本的hlist例子. 首先说下hlist的构成:             在hlist(哈希链表)中, 头结点使用struct hlist_head来表示,hlist_head仅一个first指针. 普通节点使用struct hlist_node来表示. 源码中有几个特别的地方: 1. 在stru

AT&amp;T汇编语言与GCC内嵌汇编,Linux内核数据结构之链表

最近在看<Linux内核源代码情景分析>,作者毛德操.书中刚开始介绍了AT&T汇编语言与GCC内嵌汇编,以及Linux内核数据结构之链表.可惜书中介绍的不够全面.因为推荐大家阅读下面两篇文章.很不错. AT&T汇编语言与GCC内嵌汇编:http://grid.hust.edu.cn/zyshao/Teaching_Material/OSEngineering/Chapter2.pdf. Linux内核数据结构之链表:http://www.cnblogs.com/Anker/p/

Linux内核源码学习之 数据结构

本篇记录在学习Linux内核源码过程中对一些知道但不熟悉不会用的数据结构进行记录. union 是在学习进程复制函数do_fork中遇到的: <sched.h> union thread_union { struct thread_info thread_info; unsigned long stack[THREAD_SIZE/sizeof(long)]; }; struct  thread_info和stack被声明为union 共享空间 "联合"是一种特殊的类,也是一

Linux内核数据结构——链表

目录 目录 简介 单向链表 双向链表 环形链表 Linux内核中的链表实现 offsetof container_of container_of 第一部分 container_of 第二部分 链表初始化 向链表中增加一个节点 删除节点 移动节点 判断链表是否为空 遍历链表 Demo测试 mlisth mlistc 执行结果 简介 最近在学习Android Binder驱动程序实现的时候,发现里面的数据结构用到了struct list_head.而我google发现struct list_head

linux内核基础层的学习(1)

一:内核基础层数据结构 1:双向链表list a):链表的定义 struct list_head{ struct list_head *next,*pre; } b):container对象和list_entry #define container_of(ptr,type,member){ \ const typeof(((type *)0->member) *_mptr = (ptr); (type*)((char*)_mptr-offset(type,member));}) #define

Linux内核“问题门” - 学习问题、经验集锦

陈宪章说:"学贵有疑,小疑则小进,大疑则大进.疑者,觉悟之机也,一番觉悟一番长进." 培根说:"多问的人将多得." 还在学校的时候导师在激情讲演之后对着会议室里形态各异但均静默不语的我们痛心疾首的说:"会提问题很重要啊,同志们!不会提问题怎么有资格做研究!" 这样铿锵有力的训诫今日想起仍觉深受刺激,于是就要不可避免得要做出一些反应来.不过一是因为咱这年代还没有非主流的说法,二是因为也没有冯仰妍同学的性别优势,不可能受到刺激就整出个门来.咱能够做到