问题标签 [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.
c - kmalloc() 和 vmalloc() 如何在 32 位和 64 位系统中使用?
架构:X86、Linux
我已经经历了几个与 and 相关的线程kmalloc()
,vmalloc()
并且我知道它们之间的基本区别,但仍然有一些疑问。我需要你的帮助来理解基本原理。
所以正如我们所知,在 32 位系统中,虚拟地址空间在用户和内核之间划分。高 1GB 内存地址分配给内核,低 3GB 分配给用户空间。
请纠正我我在这里错了:
因此,在 1GB 中,896MB 被 1:1 映射(物理上连续)到内核逻辑地址,而 128MB 用于访问高内存地址意味着通过使用 ? 将其映射到 128MB 来访问超过 896 MB 的物理(RAM)
vmalloc()
?(假设我们有 2GB 的 RAM)如果我们在第 1 点只有 1GB 的物理 RAM 会发生什么。896MB 是内核逻辑地址和通过 kmalloc() 实现的物理地址之间的 1:1 映射。那么 128MB 有什么用,为什么我们还需要
vmalloc()
呢?因此,假设我们有 1GB 的 RAM 完全可以通过内核逻辑地址访问,那么这是否意味着只有当线程/进程请求的内存量可以在物理上连续的地址中分配时才有可能。如果没有可用的物理连续内存,在这种情况下分配的内存将不会是物理连续的,因此我们需要将vmalloc()
它映射到 128MB 的空间中并通过那里访问它?当我们使用 64 位系统时会发生什么?
kmalloc()
两者都vmalloc()
可以拥有大量的地址空间并且可以访问整个RAM ,这是真的吗?
c - 我可以在vmalloc分配的内存上使用ksize吗
我可以在vmalloc分配的内存上使用ksize吗?
我知道 ksize 用于确定实际分配的内存量
所以,我想知道 vmalloc 是否会四舍五入分配并返回比请求更多的内存。
下面的代码会起作用吗?
c - Linux 内核中的内存映射 - vamlloc() 和 kmalloc() 的使用
考虑具有 4 GB RAM内存的32 位 x86 Linux系统,因此如书籍以及许多论坛中所述,内存映射如下:
- 内核逻辑地址-最多896 MB - 一对一映射,可以使用kmalloc()分配。
- 内核虚拟地址- 128MB(高于 896MB - 内核逻辑地址) - 使用vmalloc()分配并分配虚拟连续但物理(分散在RAM中)非连续内存页面。
我无法完全理解并需要澄清的几点。
我的理解是,当kmalloc()用于分配内存时,它总是来自 RAM 中的 0 到 896MB,而不是超出这个范围。
当我们使用vmalloc()分配内存时,分配的内存是否在 RAM 内从 896MB 到 4GB 范围内?还是仅在 RAM 内从 896MB 到 1GB 范围内分配?
当我们说内核只有 1GB 的虚拟地址空间时,这是否意味着内核无法访问超过 1GB 的 RAM?如果可以,那么它是如何完成的?128MB 的内核虚拟地址空间是否用于此目的?
请帮忙。
dma - 使用vmalloc内存做DMA?
我正在编写一个需要大内存的驱动程序。假设它至少为 1GB。内核版本 >= 3.10。驱动需要在 X86_64 和 Arm 平台上运行。硬件可能有 IOMMU。
- 这个大内存将映射到用户空间。
- 设备使用这些内存来做 DMA。每个 DMA 操作仅将最大 2KB 大小的数据写入这些内存。
我的问题。
vmalloc 可以给我很大的非物理连续页面。我可以使用 vmalloc 获得大内存来做 DMA 吗?我正在考虑使用
vmalloc_to_page
获取页面指针然后使用page_to_phys
获取物理地址。我发现了一条关于“vmalloc 性能低于 kmalloc”的信息。我不确定这意味着什么。如果我这样做
vaddr = vmalloc(2MB)
,kaddr = kmalloc(2MB)
由于内存重映射,vmalloc 的函数调用将比 kmalloc 慢。但是 [vaddr, vaddr+2MB) 范围内的内存访问会比 [kaddr, kaddr+2MB) 慢吗?驱动程序初始化时会创建大内存,那么vmalloc内存会导致性能问题吗?DMA 需要
dma_map_single
得到dma_addr_t
. 我正在考虑使用dma_map_single
在驱动程序初始化时获取所有页面的 dma 地址。当驱动程序需要进行 DMA 时,我只会使用那些 dma 地址。我可以这样做以提高性能吗?
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
,kvmalloc
等vmalloc
?
c - 我怎样才能正确释放使用vmalloc分配的结构work_struct
我正在为 Linux 内核开发一个内核模块。基本上,我需要做的是用一些特殊的字符设备填充 /dev。在此类设备上进行写操作时,我需要存储消息,然后在超时后将其提供给读者。我考虑过使用 Linux 工作队列来实现它并且它可以工作,但是,我不得不为每个写入请求使用 vmalloc() 分配动态内存:
有没有一种安全的方法可以在不干扰工作队列的情况下回收内存?
c - __get_vm_area_node 中出现 BUG_ON 的原因是什么?
为什么这个断言在__get_vm_area_node
?
linux-kernel - DMA 区域足够空闲,但带有 GFP_DMA 的 vmalloc 仍然失败
我有一个内存泄漏进程,导致 OOM 杀死其他进程。下面的OOM日志:
从日志中,它显示具有 (GFP_KERNEL|GFP_DMA) 模式的 vmalloc 获得 135168 字节大小的内存失败,然后触发 OOM 终止。
但是从“Mem-Info”中,它显示 DMA free 有 17316kB,对于这个 vmalloc 应该有足够的大小。
那么,如果 DMA 区域现在可能没有连续内存呢?或者其他什么可能触发这种杀戮?
非常感谢!
BR/蒂姆
linux - 如何在设备驱动程序中为数组分配大页?
我正在学习 Linux 中的设备驱动程序。
我想创建一个具有几乎连续范围的大型数据结构。我希望我的数据结构以巨大的页面粒度(2MB 大小)分配
起初,我尝试以正常的页面对齐方式分配数据。并且已经成功了A = vmalloc(i*PAGE_SIZE);
。
但我认为 vmalloc() 不能分配大页,因为它们没有标志参数(不能自定义)并且 kmalloc() 支持分配的物理连续内存,但它有内存大小限制
我可以使用什么函数将大页面(在 2MB 范围内物理上连续)分配给数组(实际上是连续的)?