问题标签 [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.

0 投票
8 回答
115006 浏览

c - vmalloc 和 kmalloc 有什么区别?

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

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

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

0 投票
1 回答
2399 浏览

c - 应该使用哪个 kmalloc 标志

我一直在到处寻找解释何时使用kmalloc. 我找到了这个参考,它公平地解释了何时使用某些标志,但我在头文件中找不到其他标志,如GFP_HIGHUSER_PAGECACHE,GFP_HIGHUSER_MOVABLE和其他标志gfp.h......有人可以告诉我何时使用这些其他标志吗?

0 投票
2 回答
1839 浏览

c - kmalloc 导致内核崩溃

我正在尝试kmalloc在内核代码中分配内存,实际上是在排队规则中。我想分配内存q->agg_queue_hdr,它q是一个排队规则并且agg_queue_hdr是一个结构,所以如果像这样分配内存:

内核崩溃。根据kmalloc我从搜索中看到的示例,我现在将其更改为:

内核不会崩溃。现在我想知道如何为指针分配内存q->agg_queue_hdr

0 投票
2 回答
12241 浏览

linux-kernel - kmalloc标志中的GFP是什么意思?

GFP中的flags是什么意思kmalloc?例如GFP_KERNELGFP_ATOMIC

0 投票
0 回答
376 浏览

memory - 如何告诉 kmalloc 使用大 (>2M) 页面?

我正在编写一个设备驱动程序来为 DMA 分配一个大缓冲区。我的系统正在使用(或者我相信)4k 页面,我希望它使用更大的页面,即至少 2M 页面。

我怎样才能:

  • 在系统中启用大页面(或检查它们是否已启用)?
  • 指定当前kmalloc应该使用大页面?
0 投票
2 回答
3530 浏览

linux - kmalloc() 分配的内存是否会自动释放?

我正在编写一个设备驱动程序,除其他外,它使用kmalloc. 当用户程序关闭文件时,该内存被释放。在我的一项实验中,用户程序在没有关闭文件的情况下崩溃了。

有什么东西可以释放这段记忆吗?

在另一个实验中,我将函数kfree()close()函数移到module_exit()函数。当我连续两次运行用户程序时,我kmalloc再次使用与以前相同的指针再次调用,而没有先释放它。因此,我丢失了指向该内存的指针,并且无法释放它。

在我重新启动之前,这个内存是否会丢失给系统,或者当我卸载驱动程序时它会被释放?

0 投票
1 回答
1058 浏览

linux - 为什么我在 Linux 中将 kmalloc 与 GFP_DMA 一起使用时会得到一个高地址?

我正在为 Linux 中的 DMA 设备编写设备驱动程序。在Linux 设备驱动程序第 15 章中,它说:

对于具有这种限制的设备,应通过将 GFP_DMA 标志添加到 kmalloc 或 get_free_pages 调用来从 DMA 区域分配内存。当此标志存在时,仅分配可以用 24 位寻址的内存。或者,您可以使用通用 DMA 层(我们稍后会讨论)来分配缓冲区以解决您设备的限制

我这样打电话kmalloc

并打印这样的结果:

这就是我所看到的:

如果我使用 GFP_DMA,如何获得0xffff880000180000不适合 24 位的指针?

难道这不是我的内存块的物理地址?如果不是(这意味着我完全误解kmalloc了),我怎样才能得到它的物理地址?


我在 OpenSuse 12 中工作。

0 投票
1 回答
953 浏览

linux - kmalloc 如何返回大于物理地址大小的物理地址?

kmalloc在 Linux 的设备驱动程序中分配一块内存。我得到的地址是0xffff880000180000。我正在使用具有 46 位物理地址空间的 IvyBridge 处理器。这意味着 CPU 没有超过 46 个寻址引脚,因此它无法访问上面的任何地址0x00003fffffffffff。我得到的地址显然比这更大,因为它设置了第 47 位。

假设kmalloc返回一个物理指针(即虚拟地址、线性地址和物理地址相同的指针),如果 CPU 无法访问它,我如何获得这样的地址?


这个问题与“为什么我在 Linux 中将 kmalloc 与 GFP_DMA 一起使用时会得到一个高地址? ”。但是,它并不相同。这个问题一般是关于物理地址kmalloc返回的,而链接的问题是关于返回地址的使用GFP_DMA及其与返回地址的关系。

0 投票
1 回答
813 浏览

driver - 了解本例中 memset 的使用

我正在研究Linux设备驱动程序书中的一个例子(http://lwn.net/Kernel/LDD3/),我不明白memset函数在这种情况下的用途和有用性,我希望有人能给我解释。我知道我们使用kmalloc为我们的设备结构分配内存,而使用 memset 我们将 0 放在内存地址前面?这是一个例子:

0 投票
1 回答
3219 浏览

linux - kmalloc 返回的地址的物理地址

我对 kmalloc 返回给我的地址有点困惑。根据虚拟内存映射,我得到的地址在ffff880000000000-ffffc7ffffffffff范围内,所以是“所有物理内存的直接映射”。这个映射是如何工作的?我很确定 kmalloc 不会简单地返回物理地址。