在 linux 内核中请求相对较大的大小时,无法从“flex_array_alloc”分配内存

Cannot get memory allocated from `flex_array_alloc` when requesting a relatively big size in linux kernel

我正在做一些 linux 内核开发。

然后我将分配一些内存 space,比如:

ptr = flex_array_alloc(size=136B, num=1<<16, GFP_KERNEL)

ptr我每次尝试都是NULL

另外,当我把size改成20B或者num改成256时,没有问题,可以拿到内存了。

所以我想知道在 linux 内核模块中请求内存是否有一些限制。以及如何调试它或分配大内存space。

谢谢。


并且 kzalloc 在我的环境中有类似的行为。也就是说,请求 136B * (1<<16) space 失败,而 20B1<<8 成功。

使用flex_array_allocate分配的数组大小有两个限制。首先,对象大小本身不能超过一页,如https://www.kernel.org/doc/Documentation/flexible-arrays.txt:

所示

The down sides are that the arrays cannot be indexed directly, individual object size cannot exceed the system page size, and putting data into a flexible array requires a copy operation.

其次,数组元素个数有上限。

这两个限制都是实施技术的结果:

…the need for memory from vmalloc() can be eliminated by piecing together an array from smaller parts…

A flexible array holds an arbitrary (within limits) number of fixed-sized objects, accessed via an integer index.… Only single-page allocations are made

该数组是通过使用指向各个部分的指针数组“拼凑”在一起的,其中每个部分都是一个系统页面。由于这个数组也被分配,并且只进行单页分配(如上所述),因此最大部分数略小于页面中可以容纳的指针数(略少,因为还有一些簿记数据.) 实际上,在具有 8 字节指针和 4kb 页的系统上,这将灵活数组的总大小限制为大约 2MB。 (如果对象大小不是 2 的幂,精确的限制将取决于页面中浪费的数量 space。)