问题标签 [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 投票
0 回答
479 浏览

c - kmalloc() 和 vmalloc() 如何在 32 位和 64 位系统中使用?

架构:X86、Linux

我已经经历了几个与 and 相关的线程kmalloc()vmalloc()并且我知道它们之间的基本区别,但仍然有一些疑问。我需要你的帮助来理解基本原理。

所以正如我们所知,在 32 位系统中,虚拟地址空间在用户和内核之间划分。高 1GB 内存地址分配给内核,低 3GB 分配给用户空间。

请纠正我我在这里错了:

  1. 因此,在 1GB 中,896MB 被 1:1 映射(物理上连续)到内核逻辑地址,而 128MB 用于访问高内存地址意味着通过使用 ? 将其映射到 128MB 来访问超过 896 MB 的物理(RAM)vmalloc()?(假设我们有 2GB 的 RAM)

  2. 如果我们在第 1 点只有 1GB 的物理 RAM 会发生什么。896MB 是内核逻辑地址和通过 kmalloc() 实现的物理地址之间的 1:1 映射。那么 128MB 有什么用,为什么我们还需要vmalloc()呢?因此,假设我们有 1GB 的 RAM 完全可以通过内核逻辑地址访问,那么这是否意味着只有当线程/进程请求的内存量可以在物理上连续的地址中分配时才有可能。如果没有可用的物理连续内存,在这种情况下分配的内存将不会是物理连续的,因此我们需要将vmalloc()它映射到 128MB 的空间中并通过那里访问它?

  3. 当我们使用 64 位系统时会发生什么?kmalloc()两者都vmalloc()可以拥有大量的地址空间并且可以访问整个RAM ,这是真的吗?

0 投票
0 回答
84 浏览

c - 我可以在vmalloc分配的内存上使用ksize吗

我可以在vmalloc分配的内存上使用ksize吗?

我知道 ksize 用于确定实际分配的内存量

所以,我想知道 vmalloc 是否会四舍五入分配并返回比请求更多的内存。

下面的代码会起作用吗?

0 投票
1 回答
1162 浏览

c - Linux 内核中的内存映射 - vamlloc() 和 kmalloc() 的使用

考虑具有 4 GB RAM内存的32 位 x86 Linux系统,因此如书籍以及许多论坛中所述,内存映射如下:

  1. 内核逻辑地址-最多896 MB - 一对一映射,可以使用kmalloc()分配。
  2. 内核虚拟地址- 128MB(高于 896MB - 内核逻辑地址) - 使用vmalloc()分配并分配虚拟连续但物理(分散在RAM中)非连续内存页面。

我无法完全理解并需要澄清的几点。

  1. 我的理解是,当kmalloc()用于分配内存时,它总是来自 RAM 中的 0 到 896MB,而不是超出这个范围。

  2. 当我们使用vmalloc()分配内存时,分配的内存是否在 RAM 内从 896MB 到 4GB 范围内?还是仅在 RAM 内从 896MB 到 1GB 范围内分配?

  3. 当我们说内核只有 1GB 的虚拟地址空间时,这是否意味着内核无法访问超过 1GB 的 RAM?如果可以,那么它是如何完成的?128MB 的内核虚拟地址空间是否用于此目的?

请帮忙。

0 投票
0 回答
234 浏览

dma - 使用vmalloc内存做DMA?

我正在编写一个需要大内存的驱动程序。假设它至少为 1GB。内核版本 >= 3.10。驱动需要在 X86_64 和 Arm 平台上运行。硬件可能有 IOMMU。

  1. 这个大内存将映射到用户空间。
  2. 设备使用这些内存来做 DMA。每个 DMA 操作仅将最大 2KB 大小的数据写入这些内存。

我的问题。

  1. vmalloc 可以给我很大的非物理连续页面。我可以使用 vmalloc 获得大内存来做 DMA 吗?我正在考虑使用vmalloc_to_page获取页面指针然后使用page_to_phys获取物理地址。

  2. 我发现了一条关于“vmalloc 性能低于 kmalloc”的信息。我不确定这意味着什么。如果我这样做vaddr = vmalloc(2MB)kaddr = kmalloc(2MB)由于内存重映射,vmalloc 的函数调用将比 kmalloc 慢。但是 [vaddr, vaddr+2MB) 范围内的内存访问会比 [kaddr, kaddr+2MB) 慢吗?驱动程序初始化时会创建大内存,那么vmalloc内存会导致性能问题吗?

  3. DMA 需要dma_map_single得到dma_addr_t. 我正在考虑使用dma_map_single在驱动程序初始化时获取所有页面的 dma 地址。当驱动程序需要进行 DMA 时,我只会使用那些 dma 地址。我可以这样做以提高性能吗?

0 投票
1 回答
516 浏览

memory-management - 如何理解“您可以使用slab缓存分配器(即kmem_cache_create或kmem_cache_create_usercopy)分配许多相同的对象”?

根据文档(https://www.kernel.org/doc/html/latest/core-api/memory-allocation.html),其中说[强调我的]:

如果你需要分配许多相同的对象,你可以使用slab cache allocator。在使用缓存之前,应该使用 kmem_cache_create() 或 kmem_cache_create_usercopy() 设置缓存。如果缓存的一部分可能被复制到用户空间,则应该使用第二个函数。创建缓存后,kmem_cache_alloc() 及其便利包装器可以从该缓存中分配内存。

“分配许多相同的对象”是什么意思?为什么在这种情况下我不能使用kmalloc,kvmallocvmalloc

0 投票
0 回答
91 浏览

c - 我怎样才能正确释放使用vmalloc分配的结构work_struct

我正在为 Linux 内核开发一个内核模块。基本上,我需要做的是用一些特殊的字符设备填充 /dev。在此类设备上进行写操作时,我需要存储消息,然后在超时后将其提供给读者。我考虑过使用 Linux 工作队列来实现它并且它可以工作,但是,我不得不为每个写入请求使用 vmalloc() 分配动态内存:

有没有一种安全的方法可以在不干扰工作队列的情况下回收内存?

0 投票
1 回答
200 浏览

c - __get_vm_area_node 中出现 BUG_ON 的原因是什么?

为什么这个断言在__get_vm_area_node

0 投票
0 回答
71 浏览

linux-kernel - DMA 区域足够空闲,但带有 GFP_DMA 的 vmalloc 仍然失败

我有一个内存泄漏进程,导致 OOM 杀死其他进程。下面的OOM日志:

从日志中,它显示具有 (GFP_KERNEL|GFP_DMA) 模式的 vmalloc 获得 135168 字节大小的内存失败,然后触发 OOM 终止。
但是从“Mem-Info”中,它显示 DMA free 有 17316kB,对于这个 vmalloc 应该有足够的大小。
那么,如果 DMA 区域现在可能没有连续内存呢?或者其他什么可能触发这种杀戮?
非常感谢!

BR/蒂姆

0 投票
0 回答
17 浏览

linux - 如何在设备驱动程序中为数组分配大页?

我正在学习 Linux 中的设备驱动程序。

我想创建一个具有几乎连续范围的大型数据结构。我希望我的数据结构以巨大的页面粒度(2MB 大小)分配

起初,我尝试以正常的页面对齐方式分配数据。并且已经成功了A = vmalloc(i*PAGE_SIZE);

但我认为 vmalloc() 不能分配大页,因为它们没有标志参数(不能自定义)并且 kmalloc() 支持分配的物理连续内存,但它有内存大小限制

我可以使用什么函数将大页面(在 2MB 范围内物理上连续)分配给数组(实际上是连续的)?