在linux系统中 每个进程都有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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值