find_first_zero_bit: bitmap 中找到第一个清零的位置 find_last_bit: bitmap 中找到最后一个置位的位置 3.6.Bitmap 掩码操作 Bitmap 也提供了一套用于掩码的操作,和 bitops 的掩码相比,bitmap 提供的掩码 涉及的 bit 范围更广阔,可以超出 BITS_PER_LONG 的限制,函数接口
内核还提供了两个函数用来从指定的地址开始搜索第一个被设置(或未被设置)的位: 1 2 intfind_first_bit(unsignedlong*addr,unsignedintsize); intfind_first_zero_bit(unsignedlong*addr,unsignedintsize); 其中,第一个参数是一个指针,第二个参数是要搜索的总位数。返回值分别是第一个被设置的(或没被设置的)...
static inline int variable_test_bit(int nr, volatile const unsigned long *addr) 9. find_first_zero_bit int find_first_zero_bit (void * addr, unsigned size) addr为内存区的起始地址,size为要查找的最大长度,返回第一个位为0的位号 10. find_next_zero_bit int find_next_zero_bit (void * ...
int i = find_first_zero_bit(beep_minors,DYNAMIC_MINORS); if (i >= DYNAMIC_MINORS) { mutex_unlock(&tiny4412_beep_mtx); return -EBUSY; } beep_dev->minor = DYNAMIC_MINORS - i - 1; set_bit(i,beep_minors); } //合成设备号 dev = MKDEV(major, beep_dev->minor); //创建设备节点 ...
static struct mmc_blk_data *mmc_blk_alloc(struct mmc_card *card) { struct mmc_blk_data *md; int devidx, ret; devidx = find_first_zero_bit(dev_use, MMC_NUM_MINORS); if (devidx >= MMC_NUM_MINORS) return ERR_PTR(-ENOSPC); __set_bit(devidx, dev_use); md = kzalloc(sizeof(...
int i = find_first_zero_bit(misc_minors, DYNAMIC_MINORS); //#define DYNAMIC_MINORS 64 if (i >= DYNAMIC_MINORS) { mutex_unlock(&misc_mtx); return -EBUSY; } misc->minor = DYNAMIC_MINORS - i - 1; set_bit(i, misc_minors); ...
位图(bitmap)是一种非常有用的数据结构,在处理系统中的进程数管理、磁盘中的磁盘块管理、以及内存中的内存页的使用情况管理时非常有用。 同时在内核中对位图进行各种操作,现在总结一些常用的操作,以便在以后用到时方便回顾。 几个常用的宏定义: #define BIT_PER_TYPE 8 ...
iwdev->rf->used_qps = find_first_zero_bit(iwdev->rf->allocated_qps, iwdev->rf->max_qp); iwdev->rf->used_cqs = find_first_zero_bit(iwdev->rf->allocated_cqs, iwdev->rf->max_cq); iwdev->rf->used_mrs = find_first_zero_bit(iwdev->rf->allocated_mrs, iwdev->rf->max_mr...
find_first_zero_bit和find_first_bit的第二个参数size是以位(bit)为单位的,find_next_zero_bit和find_next_bit从第offset位(包含offset)开始查找为0和为1的位置,找不到则返回size。 有了以上的宏和函数,可以很方便地找到位图中的某位,比如要获取文件描述符的函数alloc_fd,它最终调用find_next_zero_bit来查...
(gup_flags & FOLL_FORCE)) gup_flags |= FOLL_NUMA; do { ///依次处理每个页面 struct page *page; unsigned int foll_flags = gup_flags; unsigned int page_increm; /* first iteration or cross vma bound */ if (!vma || start >= vma->vm_end) { vma = find_extend_vma(mm, start);...