当前位置: 代码迷 >> 汇编语言 >> 请帮忙解释下内存分段的好处!该怎么解决
  详细解决方案

请帮忙解释下内存分段的好处!该怎么解决

热度:4135   发布时间:2013-02-26 00:00:00.0
请帮忙解释下内存分段的好处!
最近在看那本《The   Art   of   Assembly   Language   Programming》DOS版,其中讲到内存分段的优点时提到了如下几点(英文太差,不敢乱翻):
(1)segmentation   provides   a   powerful   memory   management   mechanism.  
(2)It   allows   programmers   to   partition   their   programs   into   modules   that   operate   independently   of   one   another.  
(3)Segments   provide   a   way   to   easily   implement   object-oriented   programs.   Segments   allow   two   processes   to   easily   share   data.
但是我理解不了:
(1)内存分段与内存管理之间有什么关系?
(2)内存分段可以让程序员把程序分成相互独立的模块;
(3)内存分段还可以方便的实现面向对象编程;
这些东西我还是第一次听说(各位别笑我),请高手指点一下。

------解决方案--------------------------------------------------------
(1)内存分段和内存分页一样都是一种内存管理技术,分段是为了权限保护,分页是为了虚拟内存.
(2)分段后,程序员可以定义自己的段,各段有独立的地址空间,象进程的地址空间互相独立一样.
(3)同一个类的实例分配在一个段中,只有该类的方法可以访问,如果其他类的方法去访问,会因为段保护而出错.可以从硬件上实现类的数据保护和隐藏
------解决方案--------------------------------------------------------
看看我原来写的这篇:

http://community.csdn.net/Expert/topic/4874/4874821.xml?temp=.2047541
------解决方案--------------------------------------------------------
我也只是学生,说说我的想法。

1。我想第一个分段可能是由于历史的原因。古老的计算机内存小,16根地址线便可操控整个内存。但由于技术进步后,内存容量扩大,一维的地址空间无法覆盖整个内存地址,便采用分段的思想。由16位的地址空间做为段址,再加上16位的有效地址(段址偏移4位,即 段址*16 + 有效地址),便形成了20位的二维地址空间,使得16根地址线所能控制的地址范围扩大了64倍,这也是在实模式下的内存寻址方式吧。不过似乎目前pc机上分段的思想也已经被分页和段页式取代了,但我觉得它们在思想上都有很大的共通之处。

2。程序分段的好处。cpu中的段寄存器中保存了段址(base)和偏移值的上限(limit)。段址:有效地址 中,如果有效地址大于limit,便会引发异常。这样就可以限制程序不能范围当前段外的数据,不能访问其他程序的数据。总之就是不能访问它不能访问的数据。

3。面向对象的好处。对象就是一块连续的内存中的数据吧。这点跟上面一点类似。通过限制访问,就做到了private的效果吧。
------解决方案--------------------------------------------------------
axx1611(long long *&ago)你要是不懂就不要说话了。看了你的好多回复。都不对!虽然热情很高。但水平欠佳。虚心点啊!
1 段是一种硬件管理功能。
2 说可以方便的进行多任务的处理。
3 面向对象编程是一种编程思想。这种程序编译出来结构很复杂。如果有mmu会很方便的。

多任务中的每个任务要互相隔离。每个任务就好像是在用一个单独的机器。但是,是在不同的内存中。你看一下操作系统原理的书吧!
------解决方案--------------------------------------------------------
(1)
x86 CPU 段有两个意义,

一个是早期实模式下,寄存器16位,地址线20位。为了用16位的寄存器寻址20位的地址,引入了段(segment)的概念,所有的段都在一个地址空间。

第二个是保护模式下,段(segmentation)强调的是分割,用来把内存分成不同的地址空间,每个段一个空间,而后通过CPU的MMU转换成实际物理地址。由于程序运行在不同的段里,根本上保护了CPU保护模式下的各个不相关的代码,所谓进程或者作业。

注意,x86 CPU的段是永远存在的,不论哪个模式,不能禁止,参看Intel开发手册。

(2)
理由同上,每个段都是不同的地址空间。由于段会增加编程的困难,以及32位CPU段的大小是4G,足够大。所以,win32程序抽象出了一个flat memeory model,一个程序的所有模块都在一个段里,这样普通编程人员看到的是一个4G的连续空间。会觉得没有段的概念。所以,段虽然用来分模块,但少有操作系统这么做。

(3)
可以假设不分段。那么所有进程都在一个地址空间。也就是回到了DOS。再看看windows的虚拟内存的概念。
  相关解决方案