免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2059 | 回复: 8
打印 上一主题 下一主题

[内核模块] 请教几个kernel函数的解释 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-11 11:20 |只看该作者 |倒序浏览
跪求大虾指点: bitmap_find_next_zero_area 和bitmap_set 函数完成什么功能,以及操作什么数据结构 或者给个解释这些函数的链接  小弟感激不尽

论坛徽章:
0
2 [报告]
发表于 2013-08-11 18:28 |只看该作者
寻找位图中下一个0所在位置;设置位图中的指定位

论坛徽章:
0
3 [报告]
发表于 2013-08-11 18:45 |只看该作者
回复 2# aweii


    非常感谢 希望能举个例子

论坛徽章:
0
4 [报告]
发表于 2013-08-12 12:37 |只看该作者
你说的函数或者宏在我读的版本2.6.24中没有,不过我找到了类似的函数
static void set_bitmap(unsigned long *bitmap, unsigned int base, unsigned int extent, int new_value)
{
        unsigned long mask;
        unsigned long *bitmap_base = bitmap + (base / BITS_PER_LONG);
        unsigned int low_index = base & (BITS_PER_LONG-1);
        int length = low_index + extent;

        if (low_index != 0) {
                mask = (~0UL << low_index);
                if (length < BITS_PER_LONG)
                        mask &= ~(~0UL << length);
                if (new_value)
                        *bitmap_base++ |= mask;
                else
                        *bitmap_base++ &= ~mask;
                length -= BITS_PER_LONG;
        }

        mask = (new_value ? ~0UL : 0UL);
        while (length >= BITS_PER_LONG) {
                *bitmap_base++ = mask;
                length -= BITS_PER_LONG;
        }

        if (length > 0) {
                mask = ~(~0UL << length);
                if (new_value)
                        *bitmap_base++ |= mask;
                else
                        *bitmap_base++ &= ~mask;
        }
}

实现原理应该差不多吧。一个调用实例是:
set_bitmap(t->io_bitmap_ptr, from, num, !turn_on);
这里实现了将t->io_bitmap_ptr指向的位图的from开头的num位置0或置1,
参数!turn_on==1时置1,!turn_on==0时置0.

论坛徽章:
0
5 [报告]
发表于 2013-08-12 12:39 |只看该作者
这种函数的实现原理都是通过位操作,先产生相应的位掩码(对应位全为1)定位到要操作的位,置1的话通过和掩码进行或操作;置0的话,和掩码的反码进行与操作。

论坛徽章:
0
6 [报告]
发表于 2013-08-12 13:22 |只看该作者
一个测试用例:
#include <stdio.h>
#include <iostream.h>

#define BITS_PER_LONG sizeof(long)*8

unsigned long a=0xffff;

//位操作,将bitmap位图中,base开始的extent位置为new_value(0或1)
static void set_bitmap(unsigned long *bitmap, unsigned int base, unsigned int extent, int new_value)
{
        unsigned long mask;
        unsigned long *bitmap_base = bitmap + (base / BITS_PER_LONG);
        unsigned int low_index = base & (BITS_PER_LONG-1);
        int length = low_index + extent;

        if (low_index != 0) {
                mask = (~0UL << low_index);
                if (length < BITS_PER_LONG)
                        mask &= ~(~0UL << length);
                if (new_value)
                        *bitmap_base++ |= mask;
                else
                        *bitmap_base++ &= ~mask;
                length -= BITS_PER_LONG;
        }

        mask = (new_value ? ~0UL : 0UL);
        while (length >= (int)BITS_PER_LONG) {
                *bitmap_base++ = mask;
                length -= BITS_PER_LONG;
        }

        if (length > 0) {
                mask = ~(~0UL << length);
                if (new_value)
                        *bitmap_base++ |= mask;
                else
                        *bitmap_base++ &= ~mask;
        }
}


int main()
{

  unsigned long *b=&a;
  set_bitmap(b,1,2,0);
  cout<<BITS_PER_LONG<<","<<a<<endl;

}

论坛徽章:
0
7 [报告]
发表于 2013-08-12 13:24 |只看该作者
linux中BITS_PER_LONG是定义的数值,我用的是sizeof,所以要转换成int,否则会出错。

论坛徽章:
0
8 [报告]
发表于 2013-08-12 13:25 |只看该作者
以上在VC6和DEV C++中编译通过,显示结果是“32,65529”

论坛徽章:
0
9 [报告]
发表于 2013-08-12 22:09 |只看该作者
回复 8# aweii


    太感谢了..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP