问题标签 [kmalloc]
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.
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 - linux内核中的错误@sk_prot_alloc+0x9a/0x150
我正在调试我编写的模块内核,并得到以下堆栈跟踪。
有谁知道如何将此代码翻译成我的代码中的错误?也许在克莱恩?
memory-management - 我的自定义 mmap() 如何使用 HUGETLB 页面并将它们重新映射给用户?
我正在实现一个框架,它将连续的物理内存区域映射到用户空间,同时将特定的虚拟地址返回给用户进程。虽然这适用于较小的 kmalloc() 大小,但不适用于大于 4MB 的连续内存。我已经在 Linux(内核 5.0.21)上启用了 HUGETLB 支持,并且通过使用带有 MAP_HUGETLB 参数的系统 mmap(),我能够向应用程序返回一个 1GB 的大页面。我的问题是,如何实现一个自定义 mmap() 可以将如此大的页面映射到用户?巨页分配背后的机制是什么?我的驱动程序需要为用户分配如此大的连续物理内存并返回一个特定的虚拟地址。非常感谢
memory - cpu访问通过kmalloc分配的虚拟内存时会使用mmu吗?
我知道 kmalloc 分配的内存在物理上是连续的,它返回的虚拟内存与其物理内存只有一个偏移量。
但是如果CPU试图访问它返回的虚拟内存,会不会用到MMU和页表呢?我听说 CPU 使用的所有地址都是虚拟内存,必须传递给 MMU。但是现在它的物理内存和虚拟内存之间只有一个偏移量,我认为没有必要再使用页表和mmu了。