Linux内核模块中的动态数组

| 我正在对PKTGEN进行修改,以发送包含Fibonacci系列序列的数据包。这是我第一次进行内核开发,因此对内存分配的可用功能不是很熟悉。我也不是C大师:) 我将算法的迭代步骤存储在一个数组中,如果有人要求一个伟大的斐波那契参数,我希望它是动态的。 重新分配不可用。您知道动态放大数组大小的方法吗? 谢谢     
已邀请:
请参阅Dave Hansen灵活数组添加到2.6.31-rc5中 https://lwn.net/Articles/345273/ 灵活数组的创建通过以下方式完成:
#include <linux/flex_array.h>

struct flex_array *flex_array_alloc(int element_size, int total, gfp_t flags);
单个对象的大小由element_size提供,而total是可以存储在数组中的最大对象数。 flags参数直接传递给内部内存分配调用。使用当前代码,使用标志来请求高存储空间可能会导致明显令人不快的副作用。 通过调用以下命令将数据存储到灵活的阵列中:
int flex_array_put(struct flex_array *array, int element_nr, void *src, gfp_t flags);
此调用会将数据从src复制到array中,位于element_nr指示的位置(该位置必须小于创建数组时指定的最大值)。如果必须执行任何内存分配,则将使用标志。成功时返回值为零,否则返回负错误代码。 在某种原子上下文中运行时,可能需要将数据存储到灵活的数组中。在这种情况下,在内存分配器中休眠将是一件坏事。可以通过使用GFP_ATOMIC作为标志值来避免这种情况,但是通常有更好的方法。诀窍是使用以下方法确保在进入原子上下文之前完成所有需要的内存分配:
int flex_array_prealloc(struct flex_array *array, int start, int end, gfp_t flags);
此功能将确保已为在开始和结束定义的范围内索引的元素分配了内存。此后,保证不会阻塞该范围内的元素的flex_array_put()调用。 通过以下方法将数据从阵列中取出:
void *flex_array_get(struct flex_array *fa, int element_nr);
返回值是指向数据元素的指针,如果从未分配过该特定元素,则返回NULL。 注意,可以为从未存储在数组中的元素取回有效的指针。数组元素的内存一次分配一页;单个分配可以为几个相邻的元素提供内存。灵活的数组代码不知道是否已写入特定元素。它仅知道是否存在关联的内存。因此,从未在数组中存储的元素上的flex_array_get()调用有可能返回指向随机数据的指针。如果调用者没有单独的方法来知道实际存储了哪些元素,那么至少将GFP_ZERO添加到flags参数以确保所有元素都为零可能是明智的。 无法从数组中删除单个元素。不过,可以通过调用以下命令删除所有元素:
void flex_array_free_parts(struct flex_array *array);
该调用将释放所有元素,但将数组本身保留在原位。释放整个数组可通过以下步骤完成:
void flex_array_free(struct flex_array *array);
在撰写本文时,主线内核中没有使用弹性数组的用户。此处描述的功能也不会导出到模块中。当有人提出需要时,该问题可能会得到解决。     
这不是内核开发打算支持的事情。使它成为用户模式程序将更加合适。 但是,方法是实现自己的动态长度数组。跟踪数组的大小。如果需要增长,请以新的大小调用
kmalloc()
(通常使用
GFP_KERNEL
参数),将旧数据复制到新数据,然后处置旧数据(
kfree()
)。查看内核头文件 如果阵列大于约4K或8K,请考虑改用
__get_free_pages()
vmalloc()
。 kmalloc()和kfree()在
linux-2.X.XX.XX/include/linux/slob_def.h
中 __get_free_pages()在ѭ12中 vmalloc()在
linux-2.X.XX.XX/include/linux/vmalloc.h
    

要回复问题请先登录注册