ida/idr-1—文档翻译

发布时间 2023-10-23 15:11:08作者: Hello-World3

一、msm-5.4/Documentation/core-api/idr.rst 翻译

概述
========

要解决的一个常见问题是分配标识符 (ID); 通常用很小的数字来标识一个事物。 示例包括文件描述符、进程 ID、网络协议中的数据包标识符、SCSI 标签和设备实例号。 IDR 和 IDA 为该问题提供了合理的解决方案,以避免每个人都发明自己的解决方案。 IDR 提供将 ID 映射到指针的功能而 IDA 只提供 ID 分配,因此内存效率更高。


IDR使用
=========

首先初始化 IDR,使用:c:func:`DEFINE_IDR`(对于静态分配的 IDR)或使用:c:func:`idr_init`(对于动态分配的 IDR)。

您可以调用 :c:func:`idr_alloc` 来分配未使用的 ID。 通过调用 :c:func:`idr_find` 查找与 ID 关联的指针,并通过调用 :c:func:`idr_remove` 释放 ID。

如果需要更改与 ID 关联的指针,可以调用 :c:func:`idr_replace`。 这样做的一个常见原因是通过向分配函数传递“NULL”指针来保留 ID; 使用保留的ID初始化对象,最后将初始化的对象插入到IDR中。

有些用户需要分配大于``INT_MAX``的ID。 到目前为止,所有这些用户都满足于“UINT_MAX”限制,并且他们使用 :c:func:`idr_alloc_u32`。 如果您需要的 ID 不适合 u32,我们将与您合作来满足您的需求。

如果需要顺序分配 ID,可以使用 :c:func:idr_alloc_cyclic。 当处理较大的 ID 时,IDR 的效率会降低,因此使用此功能会产生轻微的成本。

要对 IDR 使用的所有指针执行操作,您可以使用基于回调的 idr_for_each 或迭代器样式 idr_for_each_entry。 您可能需要使用 :c:func:`idr_for_each_entry_continue` 来继续迭代。 如果迭代器不满足您的需求,您还可以使用 :c:func:`idr_get_next` 。

当您使用完 IDR 后,可以调用 :c:func:idr_destroy 来释放 IDR 使用的内存。 这不会释放 IDR 指向的对象; 如果您想这样做,请使用其中一个迭代器来完成。

您可以使用 :c:func:`idr_is_empty` 来查看当前是否有分配的 ID。

如果您在从 IDR 分配新 ID 时需要持锁,则可能需要传递一组限制性的 GFP 标志,这可能会导致 IDR 无法分配内存。 要解决此问题,您可以在持锁之前调用 :c:func:`idr_preload` ,然后在分配之后调用 :c:func:`idr_preload_end` 。 TODO:怎么实现的?

.. 内核文档:: include/linux/idr.h
:doc: IDR 同步


IDA使用
=========

.. 内核文档:: lib/idr.c
:doc: IDA 描述


函数与数据结构
=======================

.. 内核文档:: include/linux/idr.h
.. 内核文档:: lib/idr.c