Github: ida_alloc_max
Email: BuddyZhang1 buddy.zhang@aliyun.com
目录
源码分析
/**
* ida_alloc_max() - Allocate an unused ID.
* @ida: IDA handle.
* @max: Highest ID to allocate.
* @gfp: Memory allocation flags.
*
* Allocate an ID between 0 and @max, inclusive.
*
* Context: Any context.
* Return: The allocated ID, or %-ENOMEM if memory could not be allocated,
* or %-ENOSPC if there are no free IDs.
* /
static inline int ida_alloc_max( struct ida * ida, unsigned int max, gfp_t gfp)
{
return ida_alloc_range( ida, 0, max, gfp) ;
}
ida_alloc_max() 函数用于从 IDA 中分配一个可用的 ID,并且分配的 ID 不超过
max。参数 ida 对应着 IDA;参数 gfp 对应着内存分配时使用的标志。
函数直接调用 ida_alloc_range() 函数进行分配,并将最小 ID 设置为 0,最大
ID 设置为 max。
实践
驱动源码
/*
* IDA.
*
* (C) 2019.06.04 <buddy.zhang@aliyun.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/mm.h>
/* header of IDA/IDR */
#include <linux/idr.h>
#include <linux/radix-tree.h>
/* Root of IDA */
static DEFINE_IDA ( BiscuitOS_ida );
static __init int ida_demo_init ( void )
{
int id ;
/* Allocate an unused ID */
id = ida_alloc_max ( & BiscuitOS_ida , 0x10 , GFP_KERNEL );
printk ( "IDA-ID: %#x \n " , id );
/* Release an ID */
ida_free ( & BiscuitOS_ida , id );
/* Free all IDs */
ida_destroy ( & BiscuitOS_ida );
return 0 ;
}
device_initcall ( ida_demo_init );
驱动安装
驱动的安装很简单,首先将驱动放到 drivers/BiscuitOS/ 目录下,命名为 ida.c,
然后修改 Kconfig 文件,添加内容参考如下:
diff --git a/drivers/BiscuitOS/Kconfig b/drivers/BiscuitOS/Kconfig
index 4edc5a5..1a9abee 100644
--- a/drivers/BiscuitOS/Kconfig
+++ b/drivers/BiscuitOS/Kconfig
@@ -6 ,4 +6,14 @@ if BISCUITOS_DRV
config BISCUITOS_MISC
bool "BiscuitOS misc driver"
+config BISCUITOS_IDA
+ bool "IDA"
+
+if BISCUITOS_IDA
+
+config DEBUG_BISCUITOS_IDA
+ bool "ida_alloc_max"
+
+endif # BISCUITOS_IDA
+
endif # BISCUITOS_DRV
接着修改 Makefile,请参考如下修改:
diff --git a/drivers/BiscuitOS/Makefile b/drivers/BiscuitOS/Makefile
index 82004c9..9909149 100644
--- a/drivers/BiscuitOS/Makefile
+++ b/drivers/BiscuitOS/Makefile
@@ -1 +1,2 @@
obj-$( CONFIG_BISCUITOS_MISC) += BiscuitOS_drv.o
+obj-$( CONFIG_BISCUITOS_IDA) += ida.o
--
驱动配置
驱动配置请参考下面文章中关于驱动配置一节。在配置中,勾选如下选项,如下:
Device Driver--->
[ * ] BiscuitOS Driver--->
[ * ] IDA
[ * ] ida_alloc_max()
具体过程请参考:
Linux 5.0 开发环境搭建 – 驱动配置
驱动编译
驱动编译也请参考下面文章关于驱动编译一节:
Linux 5.0 开发环境搭建 – 驱动编译
驱动运行
驱动的运行,请参考下面文章中关于驱动运行一节:
Linux 5.0 开发环境搭建 – 驱动运行
启动内核,并打印如下信息:
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
IDA-ID: 0x0
aaci-pl041 10004000.aaci: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 24
aaci-pl041 10004000.aaci: FIFO 512 entries
oprofile: using arm/armv7-ca9
驱动分析
分配一个不超过 max 的 ID。
附录
BiscuitOS Home
BiscuitOS Driver
BiscuitOS Kernel Build
Linux Kernel
Bootlin: Elixir Cross Referencer
搭建高效的 Linux 开发环境
赞赏一下吧 🙂