问题标签 [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.
c - vmalloc 和 kmalloc 有什么区别?
我四处搜索,发现大多数人都提倡使用kmalloc
,因为您可以保证获得连续的物理内存块。但是,如果找不到您想要kmalloc
的连续物理块,似乎也会失败。
拥有连续的内存块有什么好处?具体来说,为什么我需要在系统调用中有一个连续的物理内存块?有什么理由我不能使用吗?
最后,如果我要在处理系统调用期间分配内存,我应该指定吗?系统调用是否在原子上下文中执行?vmalloc
GFP_ATOMIC
GFP_ATOMIC
分配是高优先级的,不休眠。这是在中断处理程序、下半部分和其他无法睡眠的情况下使用的标志。
GFP_KERNEL
这是正常分配,可能会阻塞。这是在可以安全睡眠时在进程上下文代码中使用的标志。
c - 应该使用哪个 kmalloc 标志
我一直在到处寻找解释何时使用kmalloc
. 我找到了这个参考,它公平地解释了何时使用某些标志,但我在头文件中找不到其他标志,如GFP_HIGHUSER_PAGECACHE
,GFP_HIGHUSER_MOVABLE
和其他标志gfp.h
......有人可以告诉我何时使用这些其他标志吗?
c - kmalloc 导致内核崩溃
我正在尝试kmalloc
在内核代码中分配内存,实际上是在排队规则中。我想分配内存q->agg_queue_hdr
,它q
是一个排队规则并且agg_queue_hdr
是一个结构,所以如果像这样分配内存:
内核崩溃。根据kmalloc
我从搜索中看到的示例,我现在将其更改为:
内核不会崩溃。现在我想知道如何为指针分配内存q->agg_queue_hdr
?
linux-kernel - kmalloc标志中的GFP是什么意思?
GFP
中的flags是什么意思kmalloc
?例如GFP_KERNEL
,GFP_ATOMIC
?
memory - 如何告诉 kmalloc 使用大 (>2M) 页面?
我正在编写一个设备驱动程序来为 DMA 分配一个大缓冲区。我的系统正在使用(或者我相信)4k 页面,我希望它使用更大的页面,即至少 2M 页面。
我怎样才能:
- 在系统中启用大页面(或检查它们是否已启用)?
- 指定当前
kmalloc
应该使用大页面?
linux - kmalloc() 分配的内存是否会自动释放?
我正在编写一个设备驱动程序,除其他外,它使用kmalloc
. 当用户程序关闭文件时,该内存被释放。在我的一项实验中,用户程序在没有关闭文件的情况下崩溃了。
有什么东西可以释放这段记忆吗?
在另一个实验中,我将函数kfree()
从close()
函数移到module_exit()
函数。当我连续两次运行用户程序时,我kmalloc
再次使用与以前相同的指针再次调用,而没有先释放它。因此,我丢失了指向该内存的指针,并且无法释放它。
在我重新启动之前,这个内存是否会丢失给系统,或者当我卸载驱动程序时它会被释放?
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 中工作。
linux - kmalloc 如何返回大于物理地址大小的物理地址?
我kmalloc
在 Linux 的设备驱动程序中分配一块内存。我得到的地址是0xffff880000180000
。我正在使用具有 46 位物理地址空间的 IvyBridge 处理器。这意味着 CPU 没有超过 46 个寻址引脚,因此它无法访问上面的任何地址0x00003fffffffffff
。我得到的地址显然比这更大,因为它设置了第 47 位。
假设kmalloc
返回一个物理指针(即虚拟地址、线性地址和物理地址相同的指针),如果 CPU 无法访问它,我如何获得这样的地址?
这个问题与“为什么我在 Linux 中将 kmalloc 与 GFP_DMA 一起使用时会得到一个高地址? ”。但是,它并不相同。这个问题一般是关于物理地址kmalloc
返回的,而链接的问题是关于返回地址的使用GFP_DMA
及其与返回地址的关系。
driver - 了解本例中 memset 的使用
我正在研究Linux设备驱动程序书中的一个例子(http://lwn.net/Kernel/LDD3/),我不明白memset函数在这种情况下的用途和有用性,我希望有人能给我解释。我知道我们使用kmalloc为我们的设备结构分配内存,而使用 memset 我们将 0 放在内存地址前面?这是一个例子:
linux - kmalloc 返回的地址的物理地址
我对 kmalloc 返回给我的地址有点困惑。根据虚拟内存映射,我得到的地址在ffff880000000000
-ffffc7ffffffffff
范围内,所以是“所有物理内存的直接映射”。这个映射是如何工作的?我很确定 kmalloc 不会简单地返回物理地址。