在 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 失败,而 20B
或 1<<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。)
我正在做一些 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 失败,而 20B
或 1<<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。)