虚拟存储器作为计算机系统中重要概念,很多操作系统书籍都已经详细地阐述了具体技术理论。但是,要真正地理解和明白,其实还是有一定难度的。本文将以linux 虚拟存储器系统来阐述虚拟存储器系统的相关知识,如果本人理解有误,希望大家指正。
1、 linux 可执行文件的格式(ELF),
计算机系统中,虚拟存储器肯定与运行的程序(即进程)息息相关。可执行程序是文件系统中的一个可执行文件,因此首先将可执行文件的格式ELF简要介绍下。本文讲述的可执行文件,并不是所有linux 下面具有执行权限的文件,而是利用C/C++ 语言编写,C/C++ 编译器生成的ELF 格式的可执行文件。比如,利用gcc –o hello hello.c 程序生成的hello 文件就是ELF 格式的。ELF 格式如下图所示(摘取自深入计算机系统):
可执行文件被划分为段,以段结构进行组织,每一段都对应不同的内容。其中.text 段就是程序代码经过编译以后形成的。.rodata 就是程序中的只读数据,.data 段是程序中声明的全局的可变变量等。
2、运行可执行目标文件
当在shell 窗口敲入如下命令:> ./hello 时,操作系统就会创建一个进程,有自己的虚拟地址空间(其实就是一个地址范围,并且每个进程的范围都一样),操作系统会将该进程相关信息与可执行文件进行关联。关联过程如下:
左边的图片可以理解为一个linux 进程的虚拟存储器,它的虚拟地址空间(即计算机指令的地址范围)为:0-2的32次方(64位机器就是2的64次方),这个虚拟地址空间范围告诉大家可以去使用这个空间的任何地址,但是一般一个程序只会使用其中一部分。既然是“虚拟”,说明它不是真实存在的,是逻辑上的概念,用于说明计算机中如何去组织这些信息。在计算机中不存在实际空间存放图片中左边这样的结构。操作系统是这样实现的:利用数据结构分别记录.text 段,.data段等的相关信息,当程序执行的时候,再利用这些记录的信息去将可执行文件的信息加载到内存中进行运行(具体参考深入理解计算机系统的9.7.2)。
a、可执行文件中的text 段的内容如何知道对应到左边的哪个地址范围之内?
这是因为可执行文件中的text段中有虚拟地址信息。所有进程能使用的虚拟地址空间范围都是一样的(0-2的32次方),所有可执行程序的text 段中的地址完全有可能相同。它通过这些虚拟地址信息,映射到进程的虚拟地址空间的相应范围,实际的实现过程就是在数据结构中记录这个地址范围。
b、为什么同样的地址在内存中不会产生冲突呢?
这是因为这些地址都是虚拟存储器中的地址,程序在运行的过程中,操作系统通过一定的地址翻译机制(参考深入理解计算机系统9.6节)将虚拟地址翻译为实际内存中的地址。
3、虚拟内存(linux中叫交换空间)
a、内存才256M,为什么运行比256M 大的可执行文件都能运行呢?
操作系统运行程序的时候,并不是将所有的信息都加载到内存中,它是按需加载,先加载程序现在运行所需的代码和数据到内存中,当程序运行一段时间后,如果需要别的代码和数据时,操作系统会将该进程目前在内存的某一部分代码换出来存储在磁盘的某个空间(也就是虚拟内存或交换空间,注意这个空间并不是可执行文件的硬盘空间),并将所需的代码加载到内存中。这种方式就解决了程序比内存大的情况,而刚才的那个交换空间默默地作为内存的扩展,因此称为虚拟内存。
4、参考文献
a、Playing with Virtual Memory (这篇文章从程序的角度讲解了虚拟内存)
翻译地址:http://blog.nosqlfan.com/html/2956.html
b、Computer Systems-A Programmer’s Perspective(深入理解计算机系统第二版,主要参考第7章和第9章)–很好的一本书,强烈推荐
看完这篇文档,大家可能还是云里雾里,希望大家留言进行交流!
相关推荐
操作系统课程设计任务书存储器管理6.doc操作系统课程设计任务书存储器管理7.doc
思维导图:2020.10.23-计算机操作系统(第四版)(汤小丹)-第四章:存储器管理 #P120.png 原文:http://t.csdn.cn/vAY4Q
以下评论转自 元鹰 的空间: http://hi.baidu.com/%D4%AA%D3%A5 简介: 中国石油大学远程教育课件 授课教师:张柳村 学时:30 所用教材:数据结构(C语言版)严蔚敏.吴伟民编 清华大学出版社 《数据结构》在...
./redis-server --port 6379 3.从http://tomcat.apache.org/download-70.cgi下载tomcat7,按照tomcat7 4.从https://github.com/xetorthio/jedis/downloads下载jedis作为java的redis客户端, 从...
4.存储器:4GB eMMC高速Flash 5.显示分辨率:1280*720P PC客户端: 1.CPU处理器:Intel Pentium 4 1.6GHz以上 2.内存:1GB以上 3.硬盘:80GB以上 4.显示器分辨率:1280*720P以上 软件配置 Web服务端: 1.操作系统:...
云存储器网址 https://demo.owncloud.org/ test test Android代码路径 https://github.com/owncloud/android https://github.com/owncloud/android-library https://github.com/JakeWharton/ActionBarSherlock ...
使用TrackAudio与Jlayer播放AES加密的mp3,不必保存到外部存储器上。 github:https://github.com/54wall/EncryptionAudioTrackMP3 csdn:...简书:http://www.jianshu.com/p/456e455d64ab
通过自己动手制作一个简单然而功能完整的CPU,可以更系统的理解数字电路逻辑、时序、汇编语言,加深对硬件和软件的认识,更深刻的理解计算机的本质。 自己动手使用74系列芯片制作CPU TD4,所有资料均可在 ...
实验二 虚拟存储器 一. 实验内容 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。 二. 实验目的 在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主...
如果有其他疑问或建议,请联系:E-mail: WJW-Davy@QQ.com 或 登陆我的主页:http://hi.baidu.com/wjwdavy<br><br> iSecurity Fill 是iSecurity Suite 软件套装中一员,用于填充存储器上的空闲字节。一个小小的...
2.1.3 存储器组织 12 2.1.4 8086/8088的标志寄存器 13 2.2 Intel 80286微处理器 14 2.3 Intel 80386微处理器 15 习题与思考题 16 第3章 8086/8088指令系统 17 3.1 指令的基本格式 17 3.1.1 指令的构成 17 3.1.2 8086...
task_json=./tasks/copy_long_ntm.json NUTM: python train_toys.py -task_json=./tasks/copy_long.json 训练重复复制NTM baseline: python train_toys.py -task_json=./tasks/repeatcopy_ntm.json NUTM: python ...
语言:English 扩展名为Bans Battlefield 3服务器 英语: 有助于处理Battlefield 3服务器的禁令列表, 需要注册http://b3ban.ugame.pw/ 或者实现您的个人禁忌士HTTP1.1获取具有字符串禁止数据的服务器 B3Ban....
实验4:双端口存储器实验 ----独立方式.pdf实验4:双端口存储器实验 ----独立方式.pdf实验4:双端口存储器实验 ----独立方式.pdf实验4:双端口存储器实验 ----独立方式.pdf实验4:双端口存储器实验 ----独立方式.pdf...
W27E12-12是存储器电路,为28脚双列直插式塑料封装,在先科AL-P628B型VCD影碟机电路[U3]上的正常工作电压典型检测数据如表所列,用DT890C型数字式多用表检测(DC挡)。 表 W27E12-12在先科AL-P628B型影碟机上的...
阿里旺旺:jingminsz阿里巴巴网上店:http://newton0627.cn.alibaba.com淘宝店铺:http://shop35650247.taobao.com/公司网址:www.jingmindm.com 中华工控网店铺:http://www.gkong.com/comm/userdetail.asp?...
瑞萨e2studio(22)----移植兆易创新SPI Nor Flash之GD25Q64Flash ...总的来说,移植GD25Q64到e2studio环境中需要理解Flash存储器的特性,选择合适的接口类型,配置正确的参数,并编写相应的读写函数。
高速缓冲存储器Cache的原理、设计及实现 更多资源请访问http://www.59186618.com
微机原理:第6章 存储器.ppt