问题标签 [vmalloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
8 回答
115006 浏览

c - vmalloc 和 kmalloc 有什么区别?

我四处搜索,发现大多数人都提倡使用kmalloc,因为您可以保证获得连续的物理内存块。但是,如果找不到您想要kmalloc的连续物理块,似乎也会失败。
拥有连续的内存块有什么好处?具体来说,为什么我需要在系统调用中有一个连续的物理内存块?有什么理由我不能使用吗? 最后,如果我要在处理系统调用期间分配内存,我应该指定吗?系统调用是否在原子上下文中执行?vmalloc
GFP_ATOMIC

GFP_ATOMIC
分配是高优先级的,不休眠。这是在中断处理程序、下半部分和其他无法睡眠的情况下使用的标志。

GFP_KERNEL 这是正常分配,可能会阻塞。这是在可以安全睡眠时在进程上下文代码中使用的标志。

0 投票
3 回答
7703 浏览

linux-kernel - linux中的内核模块有大小限制吗?

我在加载内核模块时遇到问题,有一个大数据结构,大约 2Gb 的内存大小 - 无论是我预分配表(以便它在我这样做时显示在 .bss 中,还是在加载时size -A module.ko尝试它,模块vmalloc()加载失败,出现insmod: error inserting 'module.ko': -1 Cannot allocate memory.

我尝试在用户模式 ​​linux 上调试问题,但我得到了一堆段错误(可以在 gdb 中继续,但最终会出现控制台消息overflow in relocation type 10 val <value in the ball park of 6G>'module' likely not compiled with -mcmodel=kernel. 我认为应该是正确的,对吧Kbuild-mcmodel

所以问题是:

  1. Linux内核模块大小是否有通用的2G限制?
  2. usernode linux中的内核模块是否有特定的2G限制(我认为过去我注意到大型内核模块需要干净,连续的内存块......)
  3. 我可以指定-mcmodel=large一个内核模块并期望它工作吗?

我已经在 64 位、2.6.32-5-amd64(主机)和 8Gb 内存和 2.6.32 in uml 和 4G 内存的 64 位 2.6.32-5-amd64(主机)上尝试过这个,所以这应该是一个普通的内存不足问题。

如果存在这样的限制,则可以在限制范围内工作的额外信用:)

0 投票
2 回答
1344 浏览

c - 在 Mac 和 CentOS 上使用 vmalloc (libvmalloc.a) - 不能包含 vmalloc 标头

我想分配几乎连续的范围内存,以便在访问数据时可以使用局部性属性(空间局部性),同时考虑到更好的性能。我在下一页发现我需要使用 vmalloc 来获得更好的内存位置访问(如果我错了,请纠正我并且必须改用 kmalloc)。

vmalloc 和 kmalloc 有什么区别?

我从http://www2.research.att.com/~gsf/cgi-bin/download.cgi?action=list&name=vmalloc下载了 vmalloc 包

我按照安装过程从源文件构建 libmalloc.a 静态库,然后将生成的 libvmalloc.a 库复制到我的 mac 上的 /usr/local/lib 和 /usr/lib 目录。

在我的 C 程序中,我尝试通过以下各种方法包含 vmalloc.h 头文件:

.

.

但他们都没有工作。我总是收到vmalloc.h: No such file or directory错误消息。我在编译 C++ 程序时使用了 -L/usr/local/lib -lvmalloc 标志。在我的台式计算机上(在 CentOS 操作系统下)尝试同样的事情时,我也遇到了同样的错误。
这是我的生成文件:

我还尝试如下修改我的链接器标志:

我仍然遇到同样的错误。在这种情况下可能有什么问题?我链接库的方式有什么问题,还是 vmalloc 仅适用于某些版本的 Linux?如果是后一种情况,我相信我至少应该仍然能够包含头文件。

编辑

我真正的问题实际上如下:

我想确保每个缓存中的所有 ht_elements 都是按顺序创建的。我从一个论坛上读到,vmalloc 非常适合创建缓存感知应用程序,因为数据是在虚拟内存中创建的。是否有任何其他方法可以确保我的缓存数组的所有元素的分配都是按连续顺序创建的,从而使我能够进行快速查找?还有一件事,每个缓存中每个元素的大小都不一样,所以我猜使用 calloc 不是解决方案,但我可能错了。

0 投票
2 回答
977 浏览

c - 释放(vfree-ing)指向易失数据的指针

volatile似乎是每个人一个永无止境的问题。我以为我什么都知道,但后来我遇到了这个:

所以,我在线程之间共享了一块内存,我这样定义它:

如果它让你感觉更好,你可以想象type它只是一个int.

这意味着我有一个指向一些易失性数据的指针(非易失性)。因此,例如在优化时,编译器可以缓存namebut not的值name[0]。我对吗?

所以,现在我正在vfree输入这个指针(它在 Linux 内核模块中),它告诉我在传递它时会vfree期望。const void *volatile type *

volatile type *我了解将 a作为 a传递是多么危险,type *因为在该函数中,name[i]可以缓存的值(作为优化的结果),这是不可取的。

我不明白为什么,vfree希望我向它发送一个指向非易失性数据的指针。那里有我想念的东西吗?还是只是写信的人vfree没有考虑这种情况?

我假设我只是将指针指向void *不会造成任何伤害,对吗?

0 投票
1 回答
1264 浏览

linux - 从 linux 内核模块中读取大数组

我已经对此进行了很多搜索,尽管我肯定错过了一些东西,而且我来自阅读http://tldp.org/LDP/lkmpg/2.6/html/lkmpg.html和这个http:/ /www.amazon.com/Essential-Device-Drivers-Sreekrishnan-Venkateswaran/dp/0132396556,但我无法读取我在我的 linux 内核模块中创建的大型数组 ~200kB 一块。我正在基于 ARM 的 ti-omap3530 上进行开发。我像这样分配数组:

我的读取函数看起来像这样(我意识到我这样做可能不是最好的方法):

我用这样的用户空间程序阅读它:

用户空间读取总是报告读取正确的字节数,但我没有得到正确的数据。

如果我用更小的东西替换上面的 3500s,这个解决方案似乎可以正常工作(最多 1000 表现得很好),但在上面我得到奇怪的行为,我读出的数组用零填充每个数组的最后一个 N(相同数量的元素在 2 个数组中的每个数组的同一点)并在系列的后期开始,例如 time/param[0]= 一些值在我想读出的原始数组的更远的地方。

我在想这是因为我不太了解内存处理,但我不知道如何让它做我想做的事,即将这些数据数组存储在模块中,直到我想把它们读出来进入用户空间。任何我出错的建议或想法将不胜感激。

提前感谢您在我方面的时间、努力和耐心。

0 投票
1 回答
1521 浏览

memory-management - vmalloc() 是否仅在 32 位 x86 上从 ZONE_HIGHMEM 获取内存?

在 32 位 x86 平台上,如果 vmalloc() 可以从 ZONE_NORMAL 或 ZONE_HIGHMEM 分配内存,是否意味着即使我放大 ZONE_HIGHMEM,vmalloc() 可以使用的实际总范围不变?我做了一个放大ZONE_HIGHMEM的测试,vmalloc()的一次分配可以比以前大很多。那么这是否意味着 vmalloc() 实际上仅从 ZONE_HIGHMEM 分配内存?

0 投票
1 回答
1446 浏览

android - 在 32 位 x86 中可以有多大的 VMALLOC 空间?

我的物理内存是 4G,我使用的是 32 位的 Android x86,启用了 HIGHMEM4G。我想尽可能地扩大 vmalloc() 空间。

正如我所尝试的,如果更改为 2G/2G VMsplit 并使 VMALLOC_RESERVED 更大,vmalloc() 空间有望达到 1G。但是如果我想获得更大的vmalloc(),例如2G,有可能吗?

Vmalloc() 从 ZONE_HIGHMEM 和 ZONE_NORMAL 分配。如果我有足够的物理内存,ZONE_HIGHMEM 就足够大了。将vmalloc()设为2G以上有帮助吗?或者vmalloc()受到其虚拟空间的限制,所以如果内核虚拟空间总共是2G,vmalloc()绝对不能大于那个?

0 投票
1 回答
1181 浏览

linux - vmalloc_to_pfn returns 32 bit address on Linux 32 system. Why does it chop off higher bits of PAE physical address?

I'm using vmalloc_to_pfn() to get the physical address on a 32-bit PAE Linux system. It looks like vmalloc_to_pfn() returns "unsigned long" which means it is 32 bit on a 32 bit system, 64 bit on a 64-bit system. On 64-bit Linux, unsigned long is 64 bit and I've no issues.

Problem: Using this function to convert virtual to physical:

VA: 0xf8ab87fc PA using vmalloc_to_pfn: 0x36f7f7fc. But I'm actually expecting: 0x136f7f7fc.

The physical address falls between 4 to 5 GB. But I can't get the exact physical address, I only get the chopped off 32-bit address. Is there another way to get true physical address?

0 投票
2 回答
4068 浏览

c - 将模块移植到较新的 Linux 内核:无法分配内存

我有一个相当大的驱动程序模块,我正在尝试为最近的 Linux 内核(3.4.4)编译。我可以insmod使用 2.6.27.25 内核成功编译和相同的模块。GCC 版本也不同,4.7.0 和 4.3.0。请注意,这个模块非常复杂,我不能简单地浏览所有代码和所有 makefile。

当“插入”模块时,我得到一个Cannot allocate memory带有以下痕迹的:

显而易见的答案似乎是该模块分配了太多内存,但是:

  • 我对旧内核版本没有问题,这个模块的大小是多少
  • 如果我修剪该模块的某些部分以获得更低的内存消耗,我将始终收到与新内核相同的错误消息
  • 我可以卸载许多其他模块,但它没有影响(它是否仍然相关?Linux 是否存在关于模块总内存使用量的全局限制)

因此,我怀疑新内核的问题与有限的内存没有直接关系。

新内核抱怨 avmalloc()为 30,000 KB,但对于旧内核,lsmod 给我的大小为 4,800 KB。这些数字应该直接相关吗?是否有可能在构建过程中出现问题并且请求的 RAM 过多?当我编译两者的部分大小时.ko,我看不出有很大的差异。

所以我试图了解问题出在哪里。当我检查转储堆栈时,我找不到匹配的代码。似乎故障vmalloc()是由 完成的sys_init_module(),它init_module()来自kernel/module.c。但是代码不匹配。当我检查我的目标代码时.koinit_module()代码也不匹配。

我或多或少被阻塞了,因为我对内核不够了解,而且所有的构建系统和模块加载都很难理解。该错误发生在模块加载之前,因为我怀疑某些功能丢失并且insmod此时不报告这些错误。

0 投票
1 回答
205 浏览

c - create_module - 为什么使用 copy_from_user?

我正在阅读LDD3。在第 8 章中,我无法理解这一段:

内核中使用的函数的一个示例vmalloccreate_module系统调用,它用于vmalloc为正在创建的模块获取空间。模块的代码和数据稍后会使用 . 复制到分配的空间copy_from_user。通过这种方式,模块似乎被加载到连续的内存中。

为什么copy_from_user使用?我们不是只在内核空间吗?