linux 内核 位图,linux内核中的位图

位图(bitmap)是一种非常有用的数据结构,在处理系统中的进程数管理、磁盘中的磁盘块管理、以及内存中的内存页的使用情况管理时非常有用。同时在内核中对位图进行

位图(bitmap)是一种非常有用的数据结构,在处理系统中的进程数管理、磁盘中的磁盘块管理、以及内存中的内存页的使用情况管理时非常有用。

同时在内核中对位图进行各种操作,现在总结一些常用的操作,以便在以后用到时方便回顾。

几个常用的宏定义:

#define BIT_PER_TYPE 8

#define __WORDSIZE   32

#define BITS_PER_LONG  __WORDSIZE

#define DIV_ROUND_UP(nr, d)  \

( (nr) + (d) - 1) / (d)

这个DIV_ROUND_UP(nr, d)宏的作用是:如果定义了一个: unsinged long name[128]用作位图的话,则 d = 32bits, 在假设 nr = 128*32 - 1,则n在数组中的下标可以通过 nr / 32 = 127来计算出来,而实际的数组name中有128个元素,所有 DIV_ROUND_UP()函数的作用是将比特位与数组的大小关联起来,可以通过 nr 比特位来求出数组的长度。

#define BITS_TO_LONGS(bits)  DIV_ROUND_UP(bits, sizeof(long) * BTT_PER_BYTE)

#define DEFINE_BITMAP(name, bits) \

unsigend long int name[BITS_TO_LONGS(bits)]

DEFINE_BITMAP(name, bits)定义了一个比特位图,name为比特位图的名字,bits为比特位图的大小。

#define BIT(nr)   1UL << (nr)  //将1左移 nr位

#define BIT_MASK(nr)  1UL << ( (nr) % BITS_PER_LONG ) //将第nr位置一;

#define BIT_WORD(nr)  (nr / BITS_PER_LONG )  // 用于nr位于那个数组元素之中;

#define BITMAP_LAST_WORD_MASK(bits)  \

( bits % BITS_PER_LONG ) ?  (1 << (bits % BITS_PER_LONG) ) - 1 : ~0UL

BITMAP_LAST_WORD_MASK()主要用于保存第bits位所在的元素中的前(bits % BITS_PER_LONG -1)个位中的值。

2.位图中的函数操作:

1.判断一个位图是否没有还没有别使用:

// bitmap : 位图的起始地址;

// bits   : 位图的大小;

int __bitmap_empty(unsigned long *bitmap, int bits)

{

unsigned long *addr= bitmap;

unsigned int k, limit;

limit = bits / BITS_PER_LONG ; //数组下标值;

// 用于看看数组下标为0 - limit-1的数组元素是否都为0;

for(k = 0; k < limit ; k++)

{

if(addr[k])

return 0;

}

//用于看下标为 bits / BITS_PER_LONG 的元素中的 0 - bits%BITS_PER_LONG-1位是否也全都为零

if( bits % BITS_PER_LONG )

{

if( addr[k] & BITMAP_LAST_WORD_MASK(bits) )

return 0;

}

return 1;

}

如果位图中的所有位都为0,则 int __bitmap_empty()返回 1;否则返回 0;

2.判断一个位图中的所有位是否置为 1:

int __bitmap_full(unsigned long *bitmap, int bits)

{

unsigned long *addr = bitmap;

int k, limit;

limit = bits / BITS_PER_LONG;

for(k = 0; k < limit; k++)

{

// 如果addr[k]中的每个位都为1的话,那么~addr[k]必然为0;

// 否则如果addr[k]中有的位为1,有的位为0的话,那么~addr[k]中的每一个位必然也是有的为零,有的为1;

if(~addr[k])

return 0;

}

if(bits % BITS_PER_LONG)

{

if( ~addr[k] & BITMAP_LAST_WORD_MASK(bits) )

return 0;

}

return 1;

}

3.判断两个位图是否相等,前提时这两个位图的长度必须要相等。

int __bitmap_equal(unsigned long *bitmap1, unsigned long *bitmap2, int bits)

{

int k , limit;

limit = bits / BITS_PER_LONG;

for(k = 0; k < limit; k++)

{

// ^ 是异或操作运算符, 如果 a == b 则 a ^ b == 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值