我已经google搜索和周围发现的大多数人主张使用 kmalloc, 如你保证得到连续的物理区块的存储器。然而,它也好像 kmalloc 可能会失败,如果一个连续的 物理 块,你想要可以不被发现。
有什么优势具有一个毗连区块的记忆?具体地说,为什么我需要有一个连续的 物理 块的存在 系统调用?没有任何理由我不能使用 vmalloc?
最后,如果我们分配内存在处理的一个系统电话,我应该指定 GFP_ATOMIC?是一个系统调执行在原子方面?

GFP_ATOMIC
分配是高优先级 不睡觉。这是标志 用于处理程序的中断,底部 半和其他的情况 不能睡觉。

GFP_KERNEL 这是一个正常的分配,并可能会块。这是标志的使用 在过程方面的代码时,它是安全睡觉。

有帮助吗?

解决方案

你只需要担心,使用在物理上毗连的记忆,如果在缓冲区将可通过一个DMA设备上的一个物理地解决巴士(象PCI)。麻烦的是,许多系统的呼吁有没有办法知道是否他们的缓冲区将最终被通过了一DMA设备:一旦你穿过缓冲区到另一个子系统内核的,你真的不知道在哪里这是要去。即使核不使用缓冲区DMA 今天, 一个未来的发展可能会这样做。

已是常常慢于kmalloc,因为它可能需要重缓冲区空间变成一个几乎连续的范围。kmalloc永远不会重新映射,但如果不能称为与GFP_ATOMIC kmalloc可以块。

kmalloc被限制在大小的缓冲器,它可以提供:128千字节*).如果你需要一个非常大的缓冲,你必须使用已或一些其他机构喜欢保留高的存在引导。

*) 这是真正的早期内核。在近期内核(我测试这在2.6.33.2),最大尺寸的一个单一的kmalloc是高达4MB!(我写了一个相当 详细的岗位在这.) —kaiwan

对于一个系统,叫你不需要通过GFP_ATOMIC到kmalloc(),您可以使用GFP_KERNEL.你不中断的处理程序:该应用程序的代码进入的核心背景下通过一个陷阱,不中断。

其他提示

简短的回答:下载 Linux设备的司机 并阅读本章在内存管理。

说真的,有很多微妙的问题相关的核心内存管理,你需要明白-我花了我很多时间调试的问题。

已()很少使用,因为核心很少使用虚拟存储器。kmalloc()就是通常使用,但是你必须知道什么样的后果的不同标志是和你需要一项战略,处理时,会发生什么失败,尤其是如果你在一个中断的处理程序,像你这样的建议。

Linux内核开发的罗伯特*爱(第12章244页,在第3版)的答案,这非常清楚。

是的物理连续存在不需要很多的情况。主要原因kmalloc正在使用超过已在核性能。书中解释说,当大的记忆区块分配用已,核有地图的物理非毗连区块(网页)成一个单一连续的虚拟存储器的区域。由于存储器几乎是连续的和身体的非连续几个虚拟对身体的地址映会必须被添加到网页的表格。并且在最坏的情况下,会有 (尺寸的缓冲/page size) 数映添加到网页的表中。

这也增加了压力TLB(缓项存储最近的物理虚拟地址映射)在访问这个缓冲区。这可能会导致 颠簸.

kmalloc() & vmalloc() 功能是一个简单的接口取得核心内存在的字节大小的块。

  1. kmalloc() 功能的保证,该网页是在物理上毗连的(和几乎连续的).

  2. vmalloc() 功能类似的方式工作, kmalloc(), 除了分配的存储器,这只是几乎连续的,并不一定是身体上相连的。

有什么优势具有一个毗连区块的记忆?具体地说,为什么我需要有一个连续的物理框内存在系统打电话?没有任何理由我不能只使用已?

从Google的"我感觉很幸运"上 vmalloc:

kmalloc是首选方式,因为只要你不需要很大的领域。麻烦的是,如果你想要做DMA从/向一些硬件设备,则需要使用kmalloc,你可能会需要更大的区块。该方案是分配存,尽快前 记忆变得支离破碎。

在一个32位系统,kmalloc()返回的核逻辑地址(它是一个虚拟的地址,但)有直接映(实际上与恒定的偏移量)以实际地址。这直接映确保我们得到一个连续的物理大块头。适用于DMA我们仅得到最初的指针和预期的一个连续体的映射之后我们的操作。

已()返回的核心的虚拟地址,而这又可能不会有一个连续的映射的物理RAM。可用于大型存储器的分配和在的情况下,我们不关心那个存储器分配给我们的过程是连续的,也在物理RAM。

一个其他的差异是kmalloc将返回的逻辑地址(其他指定GPF_HIGHMEM).逻辑地址被放置在"低存储器"(第一千兆字节的物理存储器)和映射直接身体的地址(使用__pa宏转换)。这个酒店意味着kmalloced存储器是连续的存储器。

在另一方面,已能够返回地址的虚拟从"高记忆"。这些地址无法被转化成在实地址的直接方式(你必须使用virt_to_page功能)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top