在Linux内核中分配用户空间内存

问题描述 投票:0回答:2

是否允许从内核空间分配用户空间内存?我知道Linux中的进程使用虚拟内存和虚拟地址。并且存在一种保护,不允许使用不同进程的内存(它会引发分段错误)。那么,有没有办法分配一个缓冲区并将指向它的有效指针返回给用户空间进程?

c linux memory kernel
2个回答
1
投票

是否允许从内核空间分配用户空间内存?我知道Linux中的进程使用虚拟内存和虚拟地址。并且存在一种保护,不允许使用不同进程的内存(它会引发分段错误)。那么,有没有办法分配一个缓冲区并将指向它的有效指针返回给用户空间进程?

内存分配例程通常有一个返回值,它是内核分配该值的指针(在虚拟内存坐标中)。如果用户没有请求新的内存,那么在用户空间中为他分配内存而不告诉它已分配到哪里是不正常的....

但你可以做到。我认为了解如何做到这一点的最好方法是研究

mmap(2)
系统调用是如何工作的(因为它将分配的内存映射到用户空间,并返回一个用户空间指针,以便用户知道它被分配到哪里),并使用内部内核函数来分配用户内存。内核 malloc 例程组需要知道如何将内存页面(即使对于内核虚拟空间,因为内核也在虚拟地址内存空间中运行)映射到虚拟内存地址。不这样做会导致无法访问内存。


0
投票

不允许从内核空间直接分配用户空间内存。这是因为内核空间和用户空间是两个隔离的空间,每个空间都有自己的虚拟地址空间。如果内核空间可以直接分配用户空间内存,则可能会绕过内核的安全保护并导致安全漏洞。

但是,可以在内核空间中使用 mmap() 系统调用来创建可由内核空间进程和用户空间进程使用的共享内存区域。 mmap() 系统调用将返回一个指向共享内存区域的指针,该指针可供用户空间进程使用。 像这样:

#include <sys/mman.h

int main() {
  // Create a shared memory area, 1 MB in size.
  void *ptr = mmap(NULL, 1024 * 1024, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);

  // Check if the shared memory region was created successfully.
  if (ptr == MAP_FAILED) {
    return -1;
  }

  // Return the pointer to the shared memory region to user space.
  return (int)ptr; }
}
© www.soinside.com 2019 - 2024. All rights reserved.