linux - 考虑到 32 位架构,在 Linux 中每个进程都被赋予 4GB 的虚拟地址空间

标签 linux memory-management linux-kernel kernel kernel-module

大家好,我是 Linux 内核开发的新手。因此,希望对以下声明有所了解。

*> 在内存中,每个进程都有4GB的虚拟地址空间

considering a 32-bit architecture. The lower 3GB virtual addresses is accessible to the user space portion of the process and the upper 1GB is accessible to the kernel space portion.*

  1. 是不是说linux中每个进程都分配了1GB+3GB那么大的内存空间?
  2. 如果是,那么 linux 中有数百个进程,那么 100*4GB 的空间是系统从哪里获得这么多内存空间的?
  3. 它与内核栈和用户栈有什么关系?
  4. Linux 中的每个进程是否都有内核和用户堆栈?

最佳答案

简介

与大多数现代操作系统一样,Linux 使用大多数现代架构(包括 x86 系列)提供的虚拟页面。

在具有虚拟内存的系统中,物理内存(实际 RAM 资源)是从系统上运行的进程中抽象出来的。地址空间就是内存可能所在的所有数字。

分页

内存可以映射(放在一个地址)页面,这是内存块的架构相关大小。因此,如果您想将内存放在某个地址以便进程可以使用它,那么您必须选择一个页面对齐数(页面大小的倍数)并在那里放置至少一个页面。

保护

虚拟内存还允许内存保护,设置进程将拥有的权限。当一个进程的可执行内存被映射时(它执行的指令)它是只读/执行的。这意味着处理器可以执行该内存,您可以读取它,但不能写入它。

当进程从磁盘加载时(在 Linux 中使用 exec 系统调用),它被放置在内存中,并且已经映射了几个内存区域。这些区域是来自程序、数据段和堆栈的可执行代码。该进程可以通过使用 mmapbrk 系统调用请求更多内存以便稍后映射。

当一个进程试图访问它没有映射的内存时,它会触发臭名昭著的 SEGFAULT 错误,内核将终止您的程序。其他时候,硬件会出现故障,但程序确实映射了内存,这是因为内核取消映射以保存它,直到需要它为止。这里发生的是进程停止运行,内核重新映射内存,然后您的进程再次开始运行,就像什么也没发生一样。

地址空间

因此,地址空间的大小只是您可以拥有的内存的上限,前提是程序已将可能的每个地址映射到实际的 RAM 内存。

内核部分的 one gig 地址空间是关于内核跟踪的进程的元数据。例如,它将在进程 header 中保留打开文件列表和映射内存。它还将在那里保留线程 header 。同样,所有这些都没有映射,只有它需要的。

请注意,每个进程都有自己的地址域,它永远看不到其他进程映射到这些地址的内容。这样,该进程就好像它是机器上的唯一进程一样,将内存映射到它选择的任何地址。

另请注意,4gb 数字是因为进行寻址的硬件仅支持 32 位数字,一个 32 位数字中可以容纳的最大数字是 2^32 = 4,294,967,296。这是 4 GB。所以一个人只能将 4gb 的地址映射到内存。

这只是一个糟糕的介绍,请在虚拟内存上进行一些谷歌搜索。

关于linux - 考虑到 32 位架构,在 Linux 中每个进程都被赋予 4GB 的虚拟地址空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30820383/

相关文章:

Python Setuptools 构建 RPM 错误

c++ - Window 的 GetAsyncKeyState 的 Linux 等效项是什么?

php - 语法错误在ubuntu中安装xampp

c++ - 设置了 LARGEADDRESSAWARE 标志的应用程序获得更少的虚拟内存

linux - register_pernet_subsys 和 register_pernet_device 有什么区别?

linux - CMake忽略自定义命令中的变量

c++ - 3维数组的重新分配

c - Valgrind 在我的机器上产生错误的输出

linux - Linux 内核是如何测试的?

linux - 如何更改Linux内核2.4中sys_call_table的大小?