Memory 分段存储器与平面存储器

Memory 分段存储器与平面存储器,memory,assembly,flat,Memory,Assembly,Flat,我就是不明白。任何手册都太技术化了。什么是平面和分段内存?如何寻址内存,如何组织内存中的字节?哪一种最适合32位计算机?有人能解释一下吗?实模式和保护模式与平坦或分段内存有什么关系?谢谢 如果您只对运行在现有32/64位操作系统上的应用程序感兴趣,您可以简单地忘记分段内存。在32位操作系统上,您可以假设您有4 GB的“平坦”内存空间。Flat意味着您可以像预期的那样,使用32位值和寄存器操作地址 在16位处理器上,我相信一个地址有20位宽,不能存储在寄存器中,所以必须在一个寄存器中存储一个基址,

我就是不明白。任何手册都太技术化了。什么是平面和分段内存?如何寻址内存,如何组织内存中的字节?哪一种最适合32位计算机?有人能解释一下吗?实模式和保护模式与平坦或分段内存有什么关系?谢谢

如果您只对运行在现有32/64位操作系统上的应用程序感兴趣,您可以简单地忘记分段内存。在32位操作系统上,您可以假设您有4 GB的“平坦”内存空间。Flat意味着您可以像预期的那样,使用32位值和寄存器操作地址

在16位处理器上,我相信一个地址有20位宽,不能存储在寄存器中,所以必须在一个寄存器中存储一个基址,要指定一个实际地址,必须在该基址上添加一个偏移量。(如果我没记错的话,基数乘以16,然后加上偏移量以得到实际地址。)这意味着您一次只能寻址64 KB;内存必须“分段”成64 KB的块

老实说,我认为初学者仍然听说这一点的唯一原因是因为仍然有很多旧的16位教程和书籍。实际上,不需要了解程序在汇编级别是如何工作的。现在,如果你想学习操作系统开发,那就另当别论了。由于电脑是在16位模式下启动的,因此您至少需要学习足够的知识才能激活平面32位模式

刚才注意到你还问了真实模式和保护模式。实模式是MS DOS使用的模式。任何程序都可以访问任何硬件功能,例如,通常直接与图形卡的控制器对话以打印某些内容。它没有引起任何问题,因为它不是一个多任务操作系统


但在任何现代操作系统上,普通程序都不会直接访问硬件,甚至不会直接访问内存。操作系统管理硬件并决定在处理器上运行哪个进程。它还为每个进程管理一个虚拟地址空间。这种功能在受保护模式下可用,我相信386是PC机的第一个32位处理器。使用地址(内存、I/O、内存映射I/O等)访问某些内容的指令有时会提供完整的(从处理器执行层的角度来看)地址,有时它们提供了一种补偿。您的近跳或相对跳,例如程序计数器是基址,指令提供到该基址的偏移量,将两者相加,就得到了地址(在该级别)

以16位系统为例,其中有16位寄存器和64KB的最大地址空间限制。扩展内存的一个非常简单的方法是分段。指令中的寄存器不是包含整个地址的寄存器,而是包含到基址的偏移量,很像pc相对指令。除此之外,还有另一个寄存器用作基址。您可以在许多体系结构中看到这一点,这些体系结构希望轻松扩展其地址范围,而无需对核心进行太多修改。(可以在内存控制器中完成,无需修改内核)对于x86,有几个寄存器。一个是用来扩大执行范围的分支。另一个功能是扩展数据访问、加载和存储的范围。使用左移4位的代码段计算非pc相对分支的地址,然后将其添加到指令中指定的寄存器中。对于使用的数据段寄存器与pc无关的加载和存储,向左移位4添加指令中指定的寄存器。因此,如果要寻址0x123456789,可以让段寄存器包含0x12340000,用于寻址的寄存器包含0x56789,或者让段0x12345678和gpr包含0x9。Pc相对寻址当然是段+Pc+偏移量

这导致了各种内存模型的采用。小,小,中,大,大。您可以想象,最小的模型会有规则,或者假设在x86的情况下,所有内容都在64K内存空间内,编译器和代码不必担心段寄存器,它们被假定为保持固定。对于较大的型号,或者当使用远指针到达更远的地方没有什么大不了的时候,可以设置数据段,然后设置数据偏移量并执行加载或存储。对于代码,您可以想象它会有点困难,因为只要更改代码段寄存器,它就会影响获取指令的总地址。您可能需要一个硬件解决方案来允许分支同时修改段和偏移量,或者您可以在代码中这样做(如果硬件允许的话)。我现在不会把你和那个混淆

每当代码中有数组时:

unsigned char abc[123];
这基本上是一样的。基址,数组在内存中的起始地址,类似于您的段,索引是您的偏移量。如果上述abc位于地址0x1004,则abc[5]位于地址0x1004+5=0x1009。不像x86段那样移位:偏移量寻址,但添加基址和偏移量的概念相同。有些分段架构没有加法,有些寄存器中的某些位是高位。这些系统之一上的Take地址0x12345 0x1必须在段中,0x2345必须在16位gpr中。如果需要,您可以将其视为shift和add,但与x86段:offset不同,您也可以将其视为shift和or

平坦的内存空间是一种错觉,尤其是在x86系统中。x86计算机,32位,甚至许多64位,将插件卡的平面内存空间总量限制为1Gig,对于32位系统来说非常有意义,因为在32位系统中,总的地址空间为4 gig,这就是为什么其中一些计算机会给你3 gig的限制,或者给你4 gig的错觉,但却删掉了一些