问题标签 [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.
memory-management - kmalloc 是否调用类型构造函数?
众所周知,使用new调用相应类型构造函数的内存分配和使用malloc分配的内存不会。但是kmalloc呢?
我正在尝试开发一些系统调用,我需要将内存分配给下面的结构。
如果我使用kmalloc分配内存,它会在分配时调用struct mailbox的构造函数吗?如果不是,除了显式调用构造函数之外,调用构造函数的合理可能方法是什么。内核中的内存分配是否有任何与new等效的功能?
memory-management - 用于多个进程的内核驱动程序中的内存池
假设我们想在设备驱动程序或模块中维护一个内存池。如何创建该池并使其可供多个进程使用,比如说 4 个进程,访问此驱动程序/模块。
假设池中有 1 MB 内存。
当我阅读 LDD 时,我遇到了 api 的 mempool_create(),但是还有 kmalloc。
如果有人做过这样的事情,请分享知识。
我最初的方法是使用 kmalloc() 进行分配,然后为打开模块的每个进程在私有对象中维护开始和结束指针。
编辑:感谢@kikigood 花一些时间在这上面。所以根据你的评论,我做了这样的事情。
假设我在初始化期间分配了 1MB 的内存池。我想将进程数限制为 4,所以我记下了。每次增加此计数
我还在每个进程的私有设备结构中维护一个缓冲区。
如何将池中的一些内存分配给此缓冲区。
linux-kernel - 为什么当 GFP_NOFS 被屏蔽时递归文件系统调用将是一个坏主意
从LDD3第214页:
GFP_NOIO
GFP_NOFS
这些标志的功能类似于 GFP_KERNEL,但是它们对内核可以做什么来满足请求添加了限制。GFP_NOFS 分配不允许执行任何文件系统调用,而 GFP_NOIO 根本不允许启动任何 I/O。它们主要用于文件系统和虚拟内存代码中,在这些代码中分配可能被允许休眠,但递归文件系统调用将是一个坏主意。
我想知道当 GFP_NOFS 被屏蔽时,为什么递归文件系统调用是一个坏主意?
谢谢!
linux - kmalloc 中 GFP_USER 标志的用途是什么?
据我了解,GFP_USER
标志中的使用(在调用中kmalloc
)用于为用户空间分配内存。这是否意味着分配的页面在内核空间中,用户可以访问?这些页面是否需要mmapp
在用户空间中编辑或用户可以直接访问地址。如果他们需要,那么和mmapp
有什么区别?GFP_USER
GFP_KERNEL
linux - 如何在内核模块中禁用高速缓存
我目前正在尝试开发 Linux 驱动程序以使用在 FPGA 中开发的自定义模块。为此,我使用带有 Linux 发行版的 Xilinx Zynq SoC,该发行版在 2 个 ARM 内核上运行,我的 VHDL 模块在 FPGA 部分上实现,但这对于理解我的问题并不重要。
我的 FPGA 模块直接写入 RAM,我想用驱动程序读取它写入的内容,但由于高速缓存,我遇到了问题。驱动程序从缓存中读取而不是从 RAM 中读取,因此它读取较旧的数据。
为了定义 FPGA 可以写入的内存空间,我使用了 kmalloc 函数。你知道是否存在我可以用来强制从 RAM 内存而不是缓存读取的标志吗?
我看到了 2 个可能是我正在寻找的标志,但我并不真正了解它们的作用:
__GFP_COLD :请求缓存冷页面而不是尝试返回缓存热页面。--> 我认为它只是强制使用尚未缓存的页面,但之后会对其进行缓存。那是对的吗 ?
GFP_DMA :看起来我正在寻找的东西我读它只强制使用与 DMA 兼容的部分内存。
如何禁用对使用 kmalloc 创建的数组的缓存?或者至少我怎样才能强制处理器从 RAM 中读取而不是从缓存中读取?
谢谢您的帮助 !
c - 解释devm_kzalloc参数和用法
我是内核驱动程序编程的新手,想了解几个方面。
在以下代码中来自http://lxr.free-electrons.com/source/drivers/i2c/busses/i2c-ocores.c?v=3.19
- pdev 是指向平台设备的指针。pdev 指向的结构的内容在平台设备初始化时已经创建,驱动核心将把该信息传递给这个探测函数。?? 这与 pci dev 结构相同,其中驱动程序核心正在传递它在探测期间识别的 pci_dev 以供驱动程序使用?我的理解对吗?
- 我不清楚devm_kzalloc的参数。第 763 行http://lxr.free-electrons.com/source/drivers/base/devres.c?v=3.19#L774的“分配内存的设备”是什么意思 ?归根结底,我们只需要在大小为 struct ocores_i2c 的内核中分配内存。第一个参数是否用作跟踪机制以在以后自动释放它(基于阅读 devres 内核文档)?
- devm_kzalloc 的返回值是指向内核中新分配的大小为 ocores_i2c 的内存的指针。如果是这种情况,devm_kzalloc 的第二个参数不应该是 sizeof(struct ocores_i2c) 而不是 sizeof(*i2c) 吗?
c - 从 kmalloc 缓冲区中,获取相应的页面数组和偏移量
我正在开发一个位于 TCP 套接字之上的新套接字,出于性能原因,我想调用tcp_sendpage
而不是tcp_sendmsg
(tcp_sendmsg
会不必要地复制我的数据)。然而,我的输入是一个 kmalloc 的缓冲区,它可以是从几个字节到跨越几个页面的任何地方。tcp_sendpage
想要一个struct page*
, offset
, 和size
作为输入。如何将我的缓冲区转换为tcp_sendpage
喜欢看的东西?
我发现virt_to_page
了offset_in_page
; 但是,这只转换单个地址而不是整个缓冲区。在我看来,我需要一个函数,将我的(物理上连续的,如 所承诺的kmalloc
)缓冲区转换为页面和偏移量数组
c - 驱动程序需要大块连续的物理内存
我需要修改网络适配器驱动程序以提高其性能以供我使用,并且我需要一个巨大的物理内存块来保持连续。
根据端口的数量,我将需要其中的几个块。每个块应该在 64MB 左右。
目前我正在考虑成为 CMA 和 bootmem 的选项。
有没有其他的选择,到目前为止我还没有使用过任何一个,所以有人可以给我一个关于如何使用它的指导吗?是否有内置函数来管理这个分配的内存或者我必须在我的驱动程序中管理它?
linux - Kmalloc 对齐
假设我用 kmalloc 分配了一个 uint64_t 数组(假设数组的大小为 32kB)。我有以下问题:
1) 数组是否保证页面对齐?2) 阵列是否保证缓存/块对齐?3)根本没有保证吗?
当我分配数组时,我使用 virt_to_phys 来获取数组的物理地址,我得到了物理地址,例如 00000040142d5c00 和虚拟地址,例如 fffffe07df400000
有没有可能我最终的对齐小于 uint64_t ,比如说 4 字节对齐与否?
先感谢您
c - 如何获取位于 Ubuntu 中特定虚拟地址的字符串?
我有一个指向带有符号的数组的指针。
我用 make 编译了这个模块并使用命令上传了这个模块:
当这个模块在内核中时,我如何读取这个字符串?我必须使用一些特定的程序吗?