首页
社区
课程
招聘
[求助]有关虚拟内存的原理
发表于: 2018-1-23 15:51 4238

[求助]有关虚拟内存的原理

2018-1-23 15:51
4238
以下是我的想法,不知道对不对?
不开启分页,只使用分段

1.所有的任务(包括操作系统)共享一个4G的物理内存,即所有的任务的段都在物理内存上 

实现方法:加载可执行文件时,所有任务的段都加载到内存,并设置所有的任务的段的P位=1。
《x86汇编语言:从实模式到保护模式》分段的内容采用的这种方法

2.所有的任务都独享一个4G虚拟内存(操作系统占用部分,且为所有任务共享)。虚拟内存空间通过内存置换到物理内存空间

也就是说不开启分页的情况下,通过段的描述符的P位就实现每个任务独占4G的虚拟空间。这能实现?

实现方法: 
1.以段为基本置换单位
加载可执行文件时,设置所有的任务段的P位=0。当访问一个任务的段时,因为P=0,产生中断,中断流程:保存内存中要访问段选择子指向的原始数据,再把从磁盘中要访问的段的数据加载到内
2.以任务为基本置换单位(这是我的猜想:最简单的实现方法,但是由于效率低是不会被采用的) 比如一个任务占用虚拟内存空间的低3G空间,任务切换时,直接把这个3G空间从内存和磁盘中调换


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 185
活跃值: (313)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
1.所有任务共享一个4G的物理内存是对的,但是所有任务共享一个虚拟内存地址是什么意思,都是虚拟内存地址了,从各个任务或者说进程的角度看,自己肯定都是独占了4G的内存空间,进程的虚拟内存地址(其实应该叫逻辑内存地址?)不一定或者说一般是不等于物理地址的.
这个涉及到编译,链接和装入,具体就是
编译时,将源代码编译成一个一个的目标模块(windows下貌似就是.lib和.dll文件),模块里的地址都是逻辑地址,
链接,分为静态链接和动态链接
                静态链接就是把所有用到的模块都链接成为一个装入模块,这是会把不同模块的地址统一修改为装入模块的地址,这是还是逻辑地址
                动态链接分为装入时动态链接和运行时动态链接
                                                            装入时动态链接就是在装入的时候才把一个个模块链接到一起,这时候看你使用的是装入时重定位还是运行时重定位,装入时重定位就进行地址变换了,运行时就没有.这个比静态链接好的就是对每个模块的更新可以分开进行,静态链接是改一个模块就要全部重新编译一次.
                                                            运行时动态链接是先把需要的模块装入到内存,需要用到哪个模块再装入哪个模块.
                                                           
装入,就是把编译出来的模块放到内存,分为绝对装入和可重定位装入
                  绝对装入就是需要程序员知道把模块放到物理内存那个地方,编译的时候就确定了模块里的地址,这种方式编译出来的模块中的逻辑地址和内存地址是一样的
                  可重定位装入又分为两种,装入时重定位和运行时重定位
                                装入时重定位就是装入模块时进行地址变换,把模块中的逻辑地址都修改为物理地址
                                运行时重定位就是等到要访问数据的时候才由地址变换机构进行地址变换.

所以你看,逻辑地址一般是不等于物理地址的,需要看你使用哪种方式才在不同时间进行变换.所以没有虚拟内存空间和物理内存空间重合的说法,比如你在代码里写一个指针指向3GB处的内存地址,从程序的角度看,3GB的内存就是我指向的,但是真实情况是在装入时对逻辑地址进行了变换,所以你指向3GB处的地址实际上访问的可能是物理内存的2GB处(或者其他任何地方)的数据,但是每个程序都觉得自己访问的是3GB处的数据,所以叫做虚拟存储,意即程序中的地址都是虚的,是逻辑的,需要变换.
              虚拟存储一般不会把一个程序所需的所有段都装入内存,操作系统会给每一个程序一定的内存空间.根据程序的局部性原理,只需要程序的几段就可以保证程序的运行,然后运行到程序需要的其他段再进行置换,置换也有几种方法,或者是把当前程序的段换出给所需段,或者是操作系统再给程序分配一点当前的剩余空间.楼主你说的要把所有程序的段都装入,内存一般是不够大的.
还有,我的理解是段描述符中段的P位一般是操作系统来修改吧!程序员可以修改吗?
好久没看操作系统了.上述文字可能有误.
2018-1-23 17:52
0
雪    币: 68
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
真的非常感谢你的长文,我再慢慢消化。
我所有地方提到的虚拟内存都是指上面问题的第二种模式:每个任务可以独占4G虚拟内存。
我刚找到了这篇文章 http://blog.csdn.net/longintchar/article/details/52072253 支持我的观点:分页本质上是解决分段的粒度太大导致效率的问题,而不是为实现虚拟内存而必须的
另外80286没有分页,而它又支持多任务。如果说没有分页就不能实现虚拟内存,那它的多任务是怎么实现的?
2018-1-23 18:02
0
雪    币: 68
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
征途雄兵 1.所有任务共享一个4G的物理内存是对的,但是所有任务共享一个虚拟内存地址是什么意思,都是虚拟内存地址了,从各个任务或者说进程的角度看,自己肯定都是独占了4G的内存空间,进程的虚拟内存地址(其实应该叫 ...
我把【1】的情况虚拟内存的部分删了,就直接认为在【1】 的情况下没有虚拟内存这种概念吧
2018-1-23 18:05
0
雪    币: 185
活跃值: (313)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
sodarkbit 征途雄兵 1.所有任务共享一个4G的物理内存是对的,但是所有任务共享一个虚拟内存地址是什么意思,都是虚拟内存地址了,从各个任务或者说进程的角度看,自己肯定都是 ...
其实楼主,我没有搞懂你的问题是什么,虚拟内存不是必须分页啊,分段也可以啊!操作系统一书不是讲了吗,内存的管理有页式,段氏,段页式,虚拟页式,虚拟段式,虚拟段页式.虚拟内存的原理或者说本质就是程序的局部性原理,就是只把程序的一部分装入内存运行,然后需要哪一部分再换入哪一部分.
2018-1-23 18:21
0
雪    币: 68
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
征途雄兵 其实楼主,我没有搞懂你的问题是什么,虚拟内存不是必须分页啊,分段也可以啊!操作系统一书不是讲了吗,内存的管理有页式,段氏,段页式,虚拟页式,虚拟段式,虚拟段页式.虚拟内存的原理或者说本质就是程序的局部 ...
你错了,分段是必须x86必须存在的,所以只有两种情况:开启分段,不开启分页;开启分段,同时开启分页。我的问题针对的是前一种。另外我觉得你对虚拟内存的理解也错了。虚拟内存实现了每个任务独享4G内存,不是什么局部性原理。当CPU执行一个任务的某条指令时,CPU与这个任务相关的所有寄存器,比如CS,DS,...,TSS,LDT所有地址都是这个任务4G虚拟地址空间的地址。我想调试的时候你观察到这些值也都是虚拟地址。好像这个任务独占了CPU
2018-1-23 18:34
0
雪    币: 185
活跃值: (313)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
sodarkbit 征途雄兵 其实楼主,我没有搞懂你的问题是什么,虚拟内存不是必须分页啊,分段也可以啊!操作系统一书不是讲了吗,内存的管理有页式,段氏,段页式,虚拟页式,虚拟段式 ...
哦,我的回答是对所有的方式的概括,并没有特指某个平台,如果具体到某个平台的话有自己独特的规定的话我确实不是很清楚,但是虚拟内存确实是属于操作系统这一块的,也是程序局部性原理为前提的,可以百度...,嗯...你说的CPU执行某个任务时这些寄存器的所有地址都是这个任务的虚拟空间的地址,这个我不是很清楚,不过这应该是属于进程的并发这一块儿的,即某一时刻时CPU(单核来说)执行的的只有一个进程,进程控制块保留该进程切换时的所有寄存器状态.虚拟内存我觉得我的理解应该没有错,请问一下你是看了哪本书或者哪篇博客而产生这个疑问的?我也想拜读一下
2018-1-23 22:30
0
雪    币: 68
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
征途雄兵 哦,我的回答是对所有的方式的概括,并没有特指某个平台,如果具体到某个平台的话有自己独特的规定的话我确实不是很清楚,但是虚拟内存确实是属于操作系统这一块的,也是程序局部性原理为前提的,可以百度...,嗯 ...
虚拟内存是CPU这个级别就支持的
2018-1-23 22:42
0
雪    币: 185
活跃值: (313)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
sodarkbit 虚拟内存是CPU这个级别就支持的
其实我印象中虚拟内存和CPU关系不大,最多有一组地址变换用的寄存器,主要是和操作系统的页表段表有关系,可能你说的是更底层的东西吧
2018-1-23 22:55
0
雪    币: 7360
活跃值: (477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我是新手.说的也不知道对不对,我看{保护方式下x80386及其编程}后得到的理解是windows(cpu)中的分段机制,不起分段机制的真正作用,而只是任务的保护机制的一部分吗?
2018-1-23 23:37
0
雪    币: 68
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
征途雄兵 其实我印象中虚拟内存和CPU关系不大,最多有一组地址变换用的寄存器,主要是和操作系统的页表段表有关系,可能你说的是更底层的东西吧
x86的CPU手册里就有虚拟内存这种概念,你可以看看
2018-1-24 00:10
0
雪    币: 68
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
征途雄兵 其实我印象中虚拟内存和CPU关系不大,最多有一组地址变换用的寄存器,主要是和操作系统的页表段表有关系,可能你说的是更底层的东西吧
我更正一下,虚拟内存应该是CPU提供基础功能,然后操作系统在这个基础再实现剩下的部分
2018-1-24 09:36
0
游客
登录 | 注册 方可回帖
返回
//