问题标签 [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 投票
0 回答
756 浏览

kmalloc - 我们什么时候使用vmalloc和kmalloc?

我知道 kmalloc 在物理内存和虚拟内存中分配连续的内存,vmalloc 在虚拟内存中分配连续的内存,但它不能保证在物理内存中分配的内存是连续的。

因此,似乎kmalloc比vmalloc好很多。不知道我们什么时候用vmalloc,kmalloc?有人可以给我一些在现实中使用vmalloc的例子吗?

0 投票
0 回答
247 浏览

linux-kernel - 你好。我正在尝试使用 kmalloc 在 linux 内核中分配内存

我正在尝试使用 kmalloc 在 Linux 内核中分配内存。我的结构设计如下:

我创建了一个 st_fetch_point 类型的新结构,并尝试以以下方式分配内存并为成员指针赋值:

但是每次执行 kmalloc() 行时,内核似乎都在冻结。我正在开发 ubuntu 14.04 并且确实在修复中。我检查了 syslog 和 kernlog 文件,没有发现任何与冻结有关的异常消息。这是 kmalloc() 分配方法的任何问题吗?

0 投票
0 回答
160 浏览

linux - 了解系统中可用连续内存量的方法

我有一个设备驱动程序,它在初始化期间需要 500MB 的连续 kmalloc 内存。驱动程序在启动时加载,我已经使用 free 命令验证当时有足够的可用内存。但是,有时我无法获得 500MB 的内存。

linux中是否有任何命令/方式可以知道系统中某个时间有多少连续内存可用。

/proc/buddyinfo 显示每个块中的内存量,但它从不说明这些块是否连续。

0 投票
1 回答
234 浏览

memory-management - 在 Guest 上使用 kmalloc 的连续物理内存

我正在客户操作系统中实现设备驱动程序。为此,我需要分配一个需要连续物理内存的缓冲区空间。在来宾操作系统中使用 kmalloc 分配缓冲区是否保证连续的物理地址?如果没有,我怎样才能做到这一点?

0 投票
0 回答
32 浏览

linux-kernel - 释放平台驱动设备结构

在平台驱动程序的探测例程中,我看到私有设备结构是通过devm_kzalloc(). 在设置驱动程序数据之前,platform_set_drvdata()有一些错误情况会返回,而不会释放分配的私有设备结构。我找不到这个结构将被释放的地方。你能指出结构在哪里被释放。下面是 Linux 内核源代码 (v5.0) 中的示例平台驱动程序,分配失败ep时不会释放该驱动程序。pci

0 投票
1 回答
419 浏览

c - 如何修复 copy_from_user 不起作用?

我正在尝试在 Linux 中编写加密驱动程序,但是当我加密字符串并使用copy_from_user()它将其复制到缓冲区中时不起作用,并且 k 值是字符串中的字符数

如果我改变temp它工作copy_from_user正常buf

这是代码的一部分

0 投票
0 回答
479 浏览

c - kmalloc() 和 vmalloc() 如何在 32 位和 64 位系统中使用?

架构:X86、Linux

我已经经历了几个与 and 相关的线程kmalloc()vmalloc()并且我知道它们之间的基本区别,但仍然有一些疑问。我需要你的帮助来理解基本原理。

所以正如我们所知,在 32 位系统中,虚拟地址空间在用户和内核之间划分。高 1GB 内存地址分配给内核,低 3GB 分配给用户空间。

请纠正我我在这里错了:

  1. 因此,在 1GB 中,896MB 被 1:1 映射(物理上连续)到内核逻辑地址,而 128MB 用于访问高内存地址意味着通过使用 ? 将其映射到 128MB 来访问超过 896 MB 的物理(RAM)vmalloc()?(假设我们有 2GB 的 RAM)

  2. 如果我们在第 1 点只有 1GB 的物理 RAM 会发生什么。896MB 是内核逻辑地址和通过 kmalloc() 实现的物理地址之间的 1:1 映射。那么 128MB 有什么用,为什么我们还需要vmalloc()呢?因此,假设我们有 1GB 的 RAM 完全可以通过内核逻辑地址访问,那么这是否意味着只有当线程/进程请求的内存量可以在物理上连续的地址中分配时才有可能。如果没有可用的物理连续内存,在这种情况下分配的内存将不会是物理连续的,因此我们需要将vmalloc()它映射到 128MB 的空间中并通过那里访问它?

  3. 当我们使用 64 位系统时会发生什么?kmalloc()两者都vmalloc()可以拥有大量的地址空间并且可以访问整个RAM ,这是真的吗?

0 投票
1 回答
1162 浏览

c - Linux 内核中的内存映射 - vamlloc() 和 kmalloc() 的使用

考虑具有 4 GB RAM内存的32 位 x86 Linux系统,因此如书籍以及许多论坛中所述,内存映射如下:

  1. 内核逻辑地址-最多896 MB - 一对一映射,可以使用kmalloc()分配。
  2. 内核虚拟地址- 128MB(高于 896MB - 内核逻辑地址) - 使用vmalloc()分配并分配虚拟连续但物理(分散在RAM中)非连续内存页面。

我无法完全理解并需要澄清的几点。

  1. 我的理解是,当kmalloc()用于分配内存时,它总是来自 RAM 中的 0 到 896MB,而不是超出这个范围。

  2. 当我们使用vmalloc()分配内存时,分配的内存是否在 RAM 内从 896MB 到 4GB 范围内?还是仅在 RAM 内从 896MB 到 1GB 范围内分配?

  3. 当我们说内核只有 1GB 的虚拟地址空间时,这是否意味着内核无法访问超过 1GB 的 RAM?如果可以,那么它是如何完成的?128MB 的内核虚拟地址空间是否用于此目的?

请帮忙。

0 投票
2 回答
585 浏览

c - 来自 kzalloc 的 memset 中的 Linux 内核 NULL 指针取消引用

很偶然地在内核丛林中偶然发现了一些代码并且有点困惑。有两种实现kzalloc():在tools/virtio/linux/kernel.h和主要的linux/slab.h 中。显然,在大多数情况下使用第二个。但有时会使用“virtio” kzalloc()

“virtio”kzalloc()看起来像这样:

我的困惑是kmalloc()“工具”目录中使用的“假”可以返回 NULL 指针。此外,看起来memset()实现不检查 NULL 指针,因此可能存在 NULL 指针取消引用。这是一个错误还是我错过了什么?

0 投票
1 回答
275 浏览

c - 最小 kmalloc() 分配和内存页大小有什么关系?

这篇文章中我意识到:

kmalloc 可以处理的最小分配是 32 或 64 字节

您取回的实际内存取决于系统的架构

但在那里和其他网站上也提到了内存页面大小。我无法弄清楚页面大小与最小kmalloc()分配有何关系?页面大小通常是 4096 字节,但最小的分配是 32 或 64 字节(取决于 arch)。

那么最小kmalloc()分配和页面大小有什么关系呢?为什么最小的分配是 32 或 64 字节而不是 16(例如)?