读笔 汇编语言-基于Linux环境(第4章-位置:寄存器、内存寻址以及了解数据存储位置III)

文章也同时在简书更新

引言

本文将作为第四章的收尾,主要介绍三种主要的汇编编程模型,并顺带提及64位长模式。

摘录

实模式平面模型

  • 在实模式平面模型下,程序和它处理的所有数据都必须位于一个64KB大小的内存块中。
  • 所有的段寄存器都被设置为指向你能使用的64KB内存块的起始位置,操作系统会设置这些寄存器,它们指向同一个地方,而且永远也不会改变,你可以完全忘记它们。
  • 由于16位寄存器(如BX)可以容纳从0到65535之间的任意值,所以它能够精确定位程序使用的64KB空间中的任一字节,你不必以任何方式访问段寄存器。

实模式段模型

  • 在实模式段模型下,程序可以看到在实模式下CPU可用的整个1MB内存。
  • 段地址指定了段到底从65536个可用“插槽”中的哪一个开始,从内存底部到顶端每16个字节都有一个这种插槽。可以通过把一个段地址乘以16来将其翻译成一个真实的20位内存地址。
  • 段寄存器指定从哪一个段落边界开始一个段。段寄存器并不包含内存地址本身。
  • 你可以同时访问两个数据段,因为有两个段寄存器可以做这项工作:DSES。(在386及更高版本处理器中,还有两个附加段寄存器:FS和GS)。
  • 但是你只有一个代码段寄存器:CS。CS总是指向当前的代码段,IP寄存器指向下一条即将执行的指令的地址。[CS:IP]。
  • 任意一个单独的程序都只有一个堆栈段,它由堆栈段寄存器SS来指定,堆栈指针寄存器SP指向下一条堆栈操作即将发生的内存地址。

###保护模式平面模型

  • 在保护模式下,应用程序(就是你写的程序,与操作系统或设备驱动程序相对)不能破坏操作系统或其他在内存中运行的应用程序。
  • 在保护模式平面模型中,程序看到的是一块地址从0到4G-1的内存。每个地址都是一个32位的量,所有通用寄存器的大小都是32位,因此一个通用寄存器可以指向整个4GB地址空间的任何位置。
  • 在保护模式下,段寄存器仍然存在,但以一种完全不同的方式工作,它们的新工作是定义你的4GB内存空间出现在物理内存或者虚拟内存的什么地方。一个32位寄存器只能表示4294967296(2的32次方)个不同的位置。如果你的计算机拥有超过4GB的内存,操作系统必须在内存中安排出4GB区域,你的程序仅限于操纵该区域内的内存。
  • 任何一个32位寄存器完全依靠自己就可以访问这40亿内存中的任一位置,但并非所有4GB内存你的程序都可以支配,有些内存你不但不能使用,甚至连看都不能看(受保护的)

###展望未来:64位长模式
x86-64体系结构定义了三个一般模式:实模式保护模式长模式

  • 实模式下,CPU像8086或其他x86 CPU在实模式下一样工作,并且支持实模式平面模型和实模式段模型。
  • 保护模式也是一种兼容模式,并且是的CPU看起来就像是一个IA-32 CPU
  • 长模式是实64位模式:当CPU在长模式下,所有寄存器都是64位宽,所有工作于64位的机器指令都是可用的。
  • 2的64次方的空间非常巨大,目前似乎根本无法用完。管理所有这64位地址需要CPU位架构内部的晶体管,但是芯片制造商们不是浪费芯片上的晶体管来管理在CPU(甚至x86-64体系结构本身)有生之年都不会用到的内存地址线,而是限制了当前CPU实现中的真正功能性地址线的数量。今天可以买到的x86-64 CPU芯片能够实现48位虚拟内存地址,但是只能实现40位物理内存地址

感想

说64位足够用的今后或许会打脸,就和当年说32位够用一样。

周鶏🐣(Kimiko) wechat
拿起手机扫一扫,欢迎关注我的个人微信公众号:「洛斯里克的大书库」。
坚持原创技术分享,您的支持将鼓励我继续创作!