Linux的虚拟内存
一、物理地址
在说虚拟地址之前先说一下物理地址的相关概念,物理地址即我们在指令中能够实际操作的物理存储空间,CPU内核设计的时候会有自己的寻址空间,通过控制总线,地址总线和数据总线,访问物理地址空间(外设寄存器或者内存)。我们在裸机上运行程序时,使用的都是实际的物理地址,通过物理地址我们可以访问外设寄存器,从而控制对应的外设,也可以访问内存,运行我们加载到内存上的程序。
看起来很合理但是如果我们使用物理地址运行逻辑程序而不对内存加以管理,则很容易出现一些问题。如程序间存储空间没有隔离,导致某个程序可能访问到另一个程序中去;程序结束后释放内存之后,这块内存并不能很好的和其他程序适配,容易造成内存碎片;CPU的寻址空间是和地址总线的位数相关的,现在所说的多少位处理器,说的就是地址总线的位数(一般也指寄存器的位数),如果是32位处理器,那么处理器内核所能寻址空间大小为4G,一般会分配约3G的寻址空间用来控制内存条,这也是为什么我们的32位机器多加内存条也无法提高机器性能的原因,而我们的64位计算机理论的寻址空间很大,但是一般会受主板的限制,往往不会有那么多的内存条插口,不过我们的个人PC也用不了那么多的内存。由于内存的价格较高,所以我们的个人电脑在没有外加内存条的情况下一般为8G或者16G或者32G,但是随着软件的日益成熟,很多大型软件的运行如果没有很好的管理内存的话,依然是不够用的。所以我们就发现了内存管理的重要性,所以我们的操作系统就“进化”出了虚拟内存机制,来合理的管理和分配我们的内存。
二、虚拟内存
1、虚拟内存原理概述
虚拟内存是内存管理的一种方式,这种方式会在磁盘上划分出一块空间由操作系统管理,当物理内存耗尽时,操作系统会将一部分暂时不运行的程序搬移到这块磁盘上,这就腾出了一部分内存,其实虚拟内存就是来回的处理这些运行和不运行的程序,从而使内存得到充分的利用。操作系统会妥协内存和磁盘上的空间,通过MMU(Memory Management Unit)机制,将这些物理内存转换为虚拟地址。MMU使用专门的集成在SOC上的模块实现,MMU会将物理地址和虚拟地址的映射关系存储在页表中。CPU在访问系统提供的虚拟地址后,会经过MMU的转换,从而访问到物理地址。并且操作系统中的每个进程都会有一份自己的虚拟内存页表,每个进程通过使用页表中的地址就好像每个进程都拥有4G的内存一样。
2、Linux虚拟内存地址空间分布
通过虚拟内存,Linux系统中的每个进程都拥有自己的4G的虚拟内存。这4G的内存如何分布是我们需要掌握的重点,虚拟内存的分布决定着程序如何在内存中装载,即决定了编译器在链接阶段,地址如何重定向。
2.1内核段
每个进程的内核段映射的物理地址是相同的,这个地址空间运行的是内核程序。内核程序是不允许程序直接调用的,需要通过系统提供的接口函数然后进入内核态运行相应的程序。
2.2命令行参数和环境变量是操作系统使用的一些全局变量
2.3栈区
栈区是由高地址向低地址扩展的连续的内存(内存池),Linux系统虚拟内存中栈的大小为8M,所以我们设计程序时尽量不要使用栈区的空间。栈区由系统分配系统释放,以函数为单位进行栈内存分配,调用函数时,开辟函数栈帧存储函数的局部变量和形参。
2.4堆区
堆区是由低地址向高地址扩展的非连续内存,堆区空间较大,由用户自己管理,因此堆区内存有内存泄漏的风险,所以使用堆区内存一定要考虑释放的问题。堆内存不一定连续,容易产生内存碎片,但是灵活性较高。
2.5BSS段
BSS段存储未初始化的全局变量,BSS段的起始地址和结束地址一般是在编译阶段就固定的,所以BSS段的未初始化的全局变量,系统会自动初始化为0.
2.6data段
data段存储初始化的全局变量
2.7text段
text段存储二进制的程序代码,当运行一个程序的时候,PC寄存器中的值就会存储text的首地址,然后执行text段的程序
2.8其他段
除了这些段外还有只读数据段、符号段等。还可以看到0-4k地址也是一个段,一个指针指向NULL时其实就是指向了这个段,这个段是没有实际的物理地址与其对应的,所以如果对于NULL指针存储数据或者读取数据都会引发错误,至于为什么要分配4k,这可能和内存分配有关,操作系统总不能就分配一个0地址吧。
Linux的虚拟内存相关推荐
- 理解 Linux 的虚拟内存
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://zhenbianshu.github.io/ 虚拟内存 毋庸置疑,虚拟内存绝对是操作系统中最重要的概念之一.我 ...
- linux存储--虚拟内存详解MMU、页表(十)
内存是程序得以运行的重要物质基础.如何在有限的内存空间运行较大的应用程序,曾是困扰人们的一个难题.为解决这个问题,人们设计了许多的方案,其中最成功的当属虚拟内存技术.Linux作为一个以通用为目的的现 ...
- linux虚拟内存当硬盘,linux里面虚拟内存和swap有什么不同?
为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page ...
- linux服务器虚拟内存设置,修改Linux服务器虚拟内存Swap大小
Linux的Swap相当于Windows的虚拟内存,当物理内存不够的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用. 那些被释放出来的空间可能来自一些很长时间没有什么操作的程序, ...
- Linux内存管理:为什么 Linux 需要虚拟内存?为什么 Linux 默认页大小是 4KB?
Table of Contents 为什么 Linux 需要虚拟内存? 缓存 内存管理 内存保护 总结 推荐阅读 为什么 Linux 默认页大小是 4KB? 页表项 碎片化 总结 推荐阅读 为什么 L ...
- linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解?
问: linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解? 每个进程所拥有的4G独立的虚拟内存空间是什么意思?linux系统的虚拟4G空间中,高位的1G是用于系统内核运行的,那 ...
- Linux为什么虚拟内存大于物理内存?
对于精通 CURD 的业务同学,内存管理好像离我们很远,但这个知识点虽然冷门(估计很多人学完根本就没机会用上)但绝对是基础中的基础. 这就像武侠小说中的内功修炼,学完之后看不到立竿见影的效果,但对你日 ...
- linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解?进程虚拟地址4G指拥有4G的寻址能力,需要页表转换为实际物理地址,每个进程用到的内核是直接映射,地址的进程地址-3G的关系
linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解? 问: linux的虚拟内存是4G,而每个进程都有自己独立的4G内存空间,怎么理解? 每个进程所拥有的4G独立的虚拟内存空间 ...
- 【Linux】Linux的虚拟内存详解(MMU、页表结构)
内存是程序得以运行的重要物质基础.如何在有限的内存空间运行较大的应用程序,曾是困扰人们的一个难题.为解决这个问题,人们设计了许多的方案,其中最成功的当属虚拟内存技术.Linux作为一个以通用为目的的现 ...
最新文章
- 从2012年到现在深度学习领域标志成果
- ios 设置属性的center_ios center.x设置
- 五大关键物联网应用助力优化数据中心基础设施管理
- 十八般武艺教你如何解决问题
- 管道符、重定向与环境变量
- modbus tcp主站和从站_【智】S7200PLC与台达变频器MODBUS轮询实时读取详解
- Galaxy Fold可折叠屏手机何时能发售?三星自己也不知道
- 国科大 多媒体分析与理解_国科大图书文献资源使用(上)
- 第二章开发环境搭建——第2节-高德开放平台
- 怎么解决Myeclipse导入项目中文乱码?
- 菩提千年,你是我红尘中最美的缘
- 站内信功能 java_站内信功能
- 一日一命令:find 命令详解
- WPF 个人音乐播放器
- 移动APP基于支付宝支付实现用户提现功能
- MQTT 客户端收发 MQTT 消息
- 2019年:两成开发者月薪超1.7万,算法工程师最紧缺
- windows开启Hyper-V虚拟化功能并创建虚拟机
- android7源码结构分析
- cloudcanal集群资源充足,任务却提示“集群机器内存不足,无法分配任务”
热门文章
- shell脚本以服务形式被调用失败,返回127
- 网络游戏开发中的通讯杂谈
- python安装ipython出现警告和错误怎么解决_ipython在最新python版本中出现事件循环问题...
- robots文件的Crawl-delay是什么意思
- 年末放大招,Java进阶大数据3W全套视频免费领!
- ssm+jsp计算机毕业设计大媛小南美味佳肴网站8p0nh(程序+LW+源码+远程部署)
- google earth中显示点云
- 得力计算机半音乐曲,60条最全音乐知识科普,让你轻松开启音乐之门!
- 麻省理工学院研发可编程数字纤维
- skywalking内部测试服务器安装记录