系统相关
首页 > 系统相关> > 在Linux中,考虑到32位体系结构,将为每个进程提供4GB的虚拟地址空间

在Linux中,考虑到32位体系结构,将为每个进程提供4GB的虚拟地址空间

作者:互联网

嗨,我是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.*

>这是否意味着linux中的每个进程都分配了1GB 3GB这么多的内存空间?
>如果是,那么linux中有数百个进程,那么从系统获得如此多的内存空间的100 * 4GB空间呢?
>它与内核堆栈和用户堆栈有什么关系?
> Linux中的每个进程是否都有内核和用户堆栈?

解决方法:

介绍

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

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

分页

可以在页面中映射内存(放置在地址上),这是内存块依赖于体系结构的大小.因此,如果您想将内存放在某个地址以便进程可以使用它,那么您就必须选择一个页面对齐编号(页面大小的倍数)并在其中放置至少一页.

保护

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

从磁盘加载进程时(在Linux中使用exec系统调用),该进程将被放置在内存中,并且已经映射了多个内存区域.这些区域是程序,数据段和堆栈中的可执行代码.该进程可以要求使用mmap或brk系统调用在以后映射更多的内存.

当进程尝试访问未映射的内存时,它将触发臭名昭著的SEGFAULT错误,内核将杀死您的程序.有时,硬件会发生故障,但是程序确实映射了内存,这是因为内核将其解映射以保存它,直到需要它为止.这里发生的是进程停止运行,内核重新映射内存,并且您的进程再次开始运行,就像什么也没有发生.

地址空间

因此,如果程序将可能的每个地址映射到实际的RAM内存,则地址空间的大小仅是内存的上限.

内核部分的一个千兆地址空间是内核跟踪的进程的元数据.例如,它将在进程头中保留打开文件的列表以及映射的内存.它还将线程头保留在那里.同样,所有内容均未映射,仅需要它映射.

请注意,每个进程都有自己的地址范围,它永远不会看到另一个进程在这些地址上映射了什么.这样,该进程就好像它是计算机上唯一的进程一样,将内存映射到它选择的任何地址.

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

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

标签:kernel,linux-kernel,kernel-module,memory-management,linux
来源: https://codeday.me/bug/20191120/2041864.html