内核中的位图介绍(DECLARE_BITMAP宏)

2023-11-08

1、DECLARE_BITMAP宏定义

#define	DIV_ROUND_UP(x,y)	(((x) + ((y) - 1)) / (y))	//向上取整

#define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))

#define DECLARE_BITMAP(name,bits) unsigned long name[BITS_TO_LONGS(bits)]

(1)位图:用每一个bit来表示一个含义。比如你需要标记32个资源的占用情况,可以用一个int型变量(刚好32bit)来标记,bit位为0代表资源空闲,bit为1表示资源被占用,你通过位运算检查每个bit的值就知道对应资源的占用情况。
(2)宏的定义是用来定义一个位图变量,本质就是一个unsigned long类型的数组。比如你要标记38个资源,但是一个unsigned long类型变量只有32bit,所以就要定义2个unsigned long类型变量(总共有64bit),但是实际只用到38bit;
(3)宏的参数:name是变量名,bits是位图有多少个位,就是需要多少个bit;

2、宏展开分析

#宏定义
#define DYNAMIC_MINORS 64 
DECLARE_BITMAP(misc_minors, DYNAMIC_MINORS);

#宏展开分析
unsigned long misc_minors[BITS_TO_LONGS(64)]
	unsigned long misc_minors[BITS_TO_LONGS(64)]
		unsigned long misc_minors[DIV_ROUND_UP(64, 8 * sizeof(long))]
			unsigned long misc_minors[(((64) + ((32) - 1)) / (32))]
				unsigned long misc_minors[2]
#宏展开最终
unsigned long misc_minors[2];

(1)定义了unsigned long类型的数组,数组名是misc_minors,有2个成员变量;
(2)DECLARE_BITMAP宏会向上取整。这里位图大小是64,两个unsigned long变量刚好是64bit,如果位图大小是65,则数组会定义3个unsigned long类型成员,3个unsigned long类型变量总共96bit,但是实际只用到65bit。

3、find_first_zero_bit宏 和 set_bit宏

#ifndef __ARMEB__

//小端
#define set_bit(nr,p)			ATOMIC_BITOP_LE(set_bit,nr,p)
#define find_first_zero_bit(p,sz)	_find_first_zero_bit_le(p,sz)

#else

//大端
#define set_bit(nr,p)			ATOMIC_BITOP_BE(set_bit,nr,p)
#define find_first_zero_bit(p,sz)	_find_first_zero_bit_be(p,sz)

#endif

(1)find_first_zero_bit宏:返回位图中第一个值为0的bit的下标,也就是没有被占用的;
(2)set_bit宏:将位图中的某个位置为1,表示被占用;
(3)具体应用:参考博客:《内核的misc驱动框架详解:内核源码分析、蜂鸣器驱动分析》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内核中的位图介绍(DECLARE_BITMAP宏) 的相关文章

  • 进程的休眠与唤醒(等待队列)

    1 进程休眠 1 进程有三种基本状态 就绪态 阻塞态 运行态 lt 1 gt 阻塞态 进程缺少除了CPU之外的某些资源 因此该进程不能被运行 被阻塞住了不能被CPU调度 lt 2 gt 就绪态 进程分配到了除CPU之外的所有资源 等待CPU
  • Linux操作系统原理与应用实验 实验三 实验四 问题总结

    本文是在进行Linux实验三和实验四所遇到的问题或学到的小知识进行总结 以调通程序为内容导向 问题的解决方法或许不难 也都能搜到 但是如果笔者自己总结下来能够节省很多人去搜索解决方法的繁琐步骤 节省大家的时间 实验三 文件操作算法 新版本带
  • 内核中的位图介绍(DECLARE_BITMAP宏)

    1 DECLARE BITMAP宏定义 define DIV ROUND UP x y x y 1 y 向上取整 define BITS TO LONGS nr DIV ROUND UP nr BITS PER BYTE sizeof lo
  • 一文快速了解进程、线程与协程

    进程与线程 进程是操作系统进行资源分配的基本单位 每个进程都有自己的独立内存空间 由于进程比较重量 占据独立的内存 所以上下文进程间的切换开销 栈 寄存器 虚拟内存 文件句柄等 比较大 但相对比较稳定安全 线程又叫做轻量级进程 是进程的一个
  • Linux内核memcpy的不同实现

    目录 1 概述 2 高级SIMD和浮点寄存器介绍 2 NEON指令 2 1 VLDR 2 2 VLDM 2 3 VSTR 2 4 VSTM 3 ARM架构程序调用寄存器使用规则 3 1 ARM寄存器使用规则 3 2 NEON寄存器使用规则
  • Interview Questions : Linux Device Drivers and Linux Kernel

    本文转载至 http priyaranjan technicalzone blogspot com 2014 01 interview questions embedded system html 1 Describe different
  • 进程管理(十三)---进程调度基本原理

    1 为什么需要调度 进程调度的概念比较简单 我们假设在一个单核处理器的系统中 同一时刻只有一个进程可以拥有处理器资源 那么其他的进程只能在就绪队列中等待 等到处理器空闲之后才有计划获得处理器资源来运行 在这种场景下 操作系统就需要从众多的就
  • 编译内核的相关知识

    1 在PC端搭建环境 ubantu 2 树莓派等芯片带操作系统的启动过程 C51 STM32 裸机 用C直接操控底层寄存器实现相关业务 业务流程型的裸机代码 3 带有操作系统的 X86 intel windows 启动过程 电源 gt bi
  • 关于 Linux 之父,你可能不知道的 7 件事

    如果让你现在说出三个程序员的名字 Linus 很可能就在其中 作为世界上最著名的电脑程序员 黑客之一 Linus Benedict Torvalds 写出了 Linux 内核 1 0 版 发起了开源运动 开发了代码管理工具 Git 这三个成
  • 如何处理海量数据文件以及大文件数据查找

    目录 一 处理海量整数文件 问 假定有40亿个无符号整数 判断某数据是否在其中 问 假定有40亿个无符号整数 找到只出现一次的数据 两次 三次 问 两个文件各有100亿个整数 只有1G内存 找交集整数 二 处理海量数据 非整数 文件 问 超
  • linux设备驱动入门1

    一 如何让驱动程序运行起来 1 1 linux中驱动程序和应用程序的区别 linux系统中驱动程序运行在内核空间而应用程序运行在用户空间 他们之间有着很多的不同之处 应用程序是无后缀的 而驱动程序是带后缀 ko 比如hello ko是驱动成
  • 内核中时间相关的知识介绍

    1 内核要解决的时间相关问题 1 如何度量时间差 如何比较时间 2 如何获取当前时间 3 如何将操作延迟指定的一段时间 4 如何调度异步函数到指定的时间之后执行 2 度量时间差 2 1 内核度量时间的原理 1 Soc有时间相关的硬件 比如定
  • printk函数的用法

    printk在内核源码中用来记录日志信息的函数 只能在内核源码范围内使用 用法和printf非常相似 printk函数主要做两件事情 第一件就是将信息记录到log中 而第二件事就是调用控制台驱动来将信息输出 1 日志级别 printk相比p
  • 不管人工智能发展如何 开发者都有必要了解 Linux 内核

    Linux内核在计算机世界的地位有目共睹 称它为计算机世界的基石也不为过 而且它还是全球最大的开源项目 几乎最知名的科技公司都参与其中 包括谷歌 Red Hat SUSE Intel Facebook 甲骨文和华为等 当然还包括Linux的
  • Linux用户空间与内核空间

    Linux用户空间与内核空间 2012 08 30 15 39 1969人阅读 评论 1 收藏 举报 linux linux内核 struct user system allocation Linux 操作系统和驱动程序运行在内核空间 应用
  • Linux 帧缓冲子系统详解:LCD介绍、framebuffer驱动框架、LCD驱动源码分析

    1 LCD显示屏基础知识介绍 请看博客 嵌入式开发 S5PV210 LCD显示器 2 内核帧缓冲子系统 2 1 功能介绍 1 帧缓冲 framebuffer 是 Linux 为显示设备提供的一个接口 它把显示设备描述成一个缓冲 区 允许应用
  • 基于树莓派博通BCM2835芯片手册导读写编简单引脚驱动代码编译和测试(树莓派)

    编写引脚驱动代码 这边写的是17引脚的驱动代码代码 IO口控制的代码在下面 这边只是简单的代码 驱动代码 include
  • nmap操作系统检测_Nmap操作系统检测

    nmap操作系统检测 rps include post 6632 rps include post 6632 One of the most popular feature of nmap is its Operating System d
  • 【Linux】向Linux 5.11.8内核加入新的系统调用

    目录 特殊声明 A mathcal A A 获取root权限
  • 最全的交叉编译Makefile讲解

    最近正在搞交叉编译 参考很多博客 学习了一下Makefile的编写 记录一下Makefile内代码是什么意思 代码如下 简单的hello ko的makefile ifneq KERNELRELEASE obj m hello o else

随机推荐

  • centos shell 启动jar

    bin bash 这里可替换为jar包名字 DIRNAME 0 if DIRNAME 0 1 then CURDIR dirname DIRNAME else CURDIR pwd dirname DIRNAME fi echo CURDI
  • Javassist生成class(生成类,方法,字段,注解) 侵立删

    最近接触了下javassist 试着进行字节码操纵 javassist的上手还是比较简单 官方文档说的很详细 而且例子也给的蛮多 下面是自己写的一个方法 其中生成了一个经典的Spring的controller类 具体写法如下 代码已经贴上了
  • yolov7调用大华工业相机进行识别

    本教程是在确保相机已经可以通过客户端正常调用和yolov7正常使用后实现 1 安装大华相机的客户端后在安装位置找到DrvInstTool exe 2 确保所有驱动安装工具已安装 3 安装GraphEdit确定相机序号 点击蓝色矩形后找到Vi
  • 不联网的情况下,使用 electron-builder 快速打包全平台应用

    前言 Electron 之所以能够日益风靡 是因为其简单易用且对各个操作平台具有良好的支持 今天我就来分享一下怎么使用一套代码 快速打包生成各主流平台安装包的经验 项目安装 首先 使用我前面介绍的提效小技巧 设置 NPM 源为淘宝镜像源 E
  • MOS管栅极驱动电流计算

    我们知道MOS管是电压控制的 从理论上MOS管电流为零 但是半导体不是理想器件 不可避免的会存在一些寄生参数 阅读LT芯片手册可以知道 栅极驱动电流公式如下图 Fsw为开关频率 Qg为mos管栅极充满所需电荷 MOS管以BSC109N10N
  • 【华为OD机试真题2023 JAVA&JS】服务中心的最佳位置

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 服务中心的最佳位置 知识点二分查找双指针 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 一家快递公司希望在一条街道建立新的服务中心 公司统计了该街道中所有区域在
  • 深入理解Modern C++智能指针std::shared_ptr

    0 背景 现代C 为了解决内存泄露以及资源回收等问题 引入了智能指针的概念 在日常的C 实践中也是高频使用 本文是在实践过程中 对现代C 中的智能指针进行的一个稍微全面的总结 如果你对C 并发编程感兴趣 想搞懂C 11内存序 或许可以看看
  • python脚本实现sql时间盲注

    这里用sqli labs master第10关举例 1 爆数据库长度 coding utf 8 import requests import datetime import time 获取数据库名长度 def database len fo
  • 超实用的 linux atop 与 htop 监控工具讲解与实战操作

    文章目录 一 概述 1 atop 概 2 htop 概述 二 top atop 和 htop 对比 1 top 2 atop 3 htop 三 atop 与 htop 监控工具安装 四 atop 与 htop 命令的基本语法 1 atop
  • Tcl-5. format 命令

    format 命令和 C 语言中的 printf 和 sprintf 命令类似 它根据一组格式说明来格式化字符 串 此命令不会改变被操作字符串的内容 语法 format spec value1 value2 spec 变元包含了格式说明关键
  • VCPKG

    VCPKG C C dependency manager from Microsoft For all platforms buildsystems and workflows
  • java高级编程

    java高级编程 目录 java高级编程 一 多线程 1 程序 进程 线程的理解 1 1程序 1 2进程 1 3线程 补充 内存结构 2 并行与并发 3 线程的创建和使用 3 1多线程的创建方法一 继承于Thread 类 3 2多线程的创建
  • 一文看懂卷积运算(convolution)与互相关运算(cross-correlation)的区别

    目录 互相关运算定义 互相关运算图示 互相关运算完整计算示例 卷积数学定义 卷积运算图示 卷积与互相关运算区别 深度学习中的卷积为何能用互相关运算代替 互相关运算定义 在二维互相关运算中 卷积窗口从输入数组的最左上方开始 按从左往右 从上往
  • JDK动态代理对象与被代理对象地址值问题

    JDK动态代理对象与被代理对象地址值问题 1 UserService接口 2 UserServiceImpl接口实现类 3 ProxyFactoryByJDK代理工厂类 4 UserTest测试类 5 结果 问题 打印userService
  • 3-python包和模块-分类

    标准包 模块 第三方包 模块 自定义包 模块 什么是标准模块 安装pyhton后 电脑上面就存在的一些模块 可以直接导入使用 os sys time 每个安装了python的用户电脑上都有这些模块 在一台电脑上面使用了系统模块的代码 到另外
  • DataBinding表达式使用bug:databinding javax.xml.bind.UnmarshalException

    问题描述 使用DataBinding时 在XML文件中使用带有中文字符的表达式时 程序编译报错 Exception while handling step android databinding annotationprocessor Pr
  • 快速排序—C语言实现

    目录 前言 快速排序 实现逻辑 1 hoare版本 编辑 2 挖坑法 3 前后指针版本 快速排序优化 1 三数取中法选key 2 递归到小的子区间时 可以考虑使用插入排序 快速排序非递归 用栈实现 快速排序的特性总结 全部代码 前言 在学数
  • Flutter--macos环境配置

    Flutter macOS环境配置 1 安装 去flutter官网下载安装包 解压到你想安装的目录 2 配置环境变量 命令行open bash profile打开配置文件 添加 在打开的页面添加上下面代码 export PATH 自己flu
  • 关于RestTemplate使用过程中的两个问题(请求的URL中带有%25,转换的对象属性值与相应的json串中的key值不对应转换失败)

    问题一 请求的URL中带有 25 解决 如果请求的URL中包含 号 尤其是参数经过URLEncode之后 restTemplate会把 转成 25 因此将请求地址封装成URI对象既可 例如 User user restTemplate po
  • 内核中的位图介绍(DECLARE_BITMAP宏)

    1 DECLARE BITMAP宏定义 define DIV ROUND UP x y x y 1 y 向上取整 define BITS TO LONGS nr DIV ROUND UP nr BITS PER BYTE sizeof lo