1.2.3 架构扩展

Intel 64 对冯诺伊曼架构做了多种扩展。下面是比较重要的扩展特性一览。

寄存器:CPU 芯片中直接集成的内存单元。这些单元很快也很复杂且昂贵。寄存器的访问不使用总线。其响应时间一般也就只有几个 CPU 周期。参考 1.3 节。

硬件栈:栈通常是一种数据结构,支持从顶部 push 进栈一个元素或者 pop 出栈顶元素。硬件栈在内存中,通过特殊的指令和一个寄存器,实现了这种抽象,过程中使用的寄存器始终指向栈顶元素。无论是计算过程、局部变量存储或者是编程语言中的函数调用序列都是用栈来实现的。参考 1.5 节。

中断:这个特性可以使你在程序外部触发事件从而影响到程序内部的逻辑执行顺序。在程序捕捉到信号(外部内部信号都有可能)时,程序的执行被挂起,一些寄存器会被保存起来,CPU 开始执行一个特殊流程来处理这种情况。下面是一些中断发生时的典型场景(以及一段用来处理中断的片段代码):

  • 外部设备发来了信号
  • 除法中除数为零
  • 非法指令(CPU 不认识指令的二进制表示形式)
  • 在非特权模式下常识执行特权指令。参考 6.2 节“中断”来获知详情

Protection rings:CPU 总会工作在 protection rings 中定义的多种状态之一的状态下。每一个 ring 都会定义一些可以被执行的指令。ring-0 允许执行 CPU 指令集中的任意指令,也就是说这是最大权限的模式。ring-3 只允许那些保证安全的指令执行。如果尝试执行特权指令,那么就会触发中断。大多数应用程序是在 ring-3 状态下工作的,这样可以确保它们不能修改关键的系统数据结构(例如页表),且不会越过 OS 直接操作外部设备。另外的两个 ring (ring-1 和 ring-2)是中间状态,不过现代操作系统没有使用它们。

参考 3.2 节“保护模式”来获取详情。

虚拟内存:是对物理内存的一层抽象,在这种抽象下程序可以安全且有效地进行部署。在运行期也可以彼此实现隔离。

参见 4.2 节“动机”获取详情。

上面提到的扩展并不都对程序员可见(e.g.缓存和 shadow 寄存器)。我们也会介绍到这些知识。

Table1-1 概括了现代计算机对冯诺伊曼架构的扩展。

Table 1-1.冯诺伊曼架构:现代扩展

Problem Solution
无论做什么事情都需要访问缓慢的内存 寄存器,缓存
缺乏交互 中断
无法支持代码方法隔离,也不支持上下文切换 硬件栈
多任务:任何程序可以执行任何指令 Protection rings
多任务:程序没法和其它程序进行隔离 虚拟内存

■信息源 没有哪本书能够覆盖指令集和处理器的全部信息,很多书尝试包含详尽的指令集信息,但这些信息很快就过时了。然后让这本书变得毫无价值。

我们会经常引导你去查询 intel® 64 and ia-32 architectures software Developer’s manual,参考[15]。现在就下载吧!

把指令集的介绍直接从源拷贝到这里也不是什么美德;还是学会直接去查询开发手册较好。

上述手册的第二卷中完全覆盖了指令集,并且有很多有用的信息。请在每次需要了解指令集信息时,去查询它。这样不但是最佳实践,手册本身也是最可靠的信息源。

注意,互联网上很多关于汇编的教育资源都严重过期(毕竟现在很少有人直接写汇编)了,而且也完全没有覆盖 64 位模式。这些过期的老代码可能使用了老的 cpu 模式,老模式的代码在最新的长模式中都有类似的替代品,但是现在工作方式却可能不一样了。这也是我们不建议使用搜索引擎去查询指令描述的原因。


results matching ""

    No results matching ""