读书笔记 计算机系统--系统架构与操作系统的高度集成 第二章处理器体系结构
处理器设计所围绕的两个问题:
指令集设计(软件)
机器结构设计(硬件)
第二章为指令集设计,第三章为机器结构设计。
指令集设计所受影响:
程序语言(精度,寻址模式,跳转指令)
应用(科学计算 -> 应用)
操作系统(内存管理,程序的不连续性)
指令集如何设计:
早期,硬件可否实现 -> 如今, 是否实际有用。
*能否有利于高级语言编写高效而紧凑的程序。-----------一
*要优雅,体系结构---------------------------------------------二
一:指令集与高级语言
高级语言的功能集:
表达式和赋值语句-------------------------------------------(一)
高级数据抽象-------------------------------------------------(二)
条件语句和循环----------------------------------------------(三)
过程调用-------------------------------------------------------(四)
(一)表达式和赋值语句
a = b + c;
add a, b, c;高级语言(上)都可以映射为指令(下),称为双操作数指令(两个操作数产生一个结果),也称为三操作数指令(两个源操作数和一个目的操作数)
所有的算数/逻辑运算来说,操作数都在处理器的寄存器中:
1、算数/逻辑运算用的alu在处理器中,位置更接近。
2、操作数的可寻址性,如果操作数在内存中,随着内存大小的增加,内存的唯一寻址的地址大小也增加,指令大小也会增加。
寄存器数量必须较小,以限制寻址的位数,并引入寻址模式,寄存器寻址。
将操作数从内存搬到寄存器需要两条指令:
加载:ld r2, b; r2 <- b
存储:st r1, a; a <- r1
将操作数搬到寄存器而不是直接使用内存操作数的好处:重用速度快(d=a*b+a*c+b*c;)
为了防止在从内存搬运的地址操作数的长度不受操作数可寻址性的影响,引入基址加偏移量寻址模式。
ld r2, offset(rb); r2 <- mem[rb + offset]
约定,一个字32位,半字16位,字节8位
操作数宽度与其精度有关:
精度越低内存中占用空间就越小,在算数/逻辑运算时还有一定的时间优势。
操作数精度最好恰好满足类型需求。
指令集应该包含不同精度操作数:
ld r1, offset(rb); 从地址offset+rb处装一个字到r1中
ldb r1, offset(rb); 从地址offset+rb处装一个字节到r1中
可寻址性:与前面的不同,这里的可寻址性指的是内存中能被寻址的最小精度,因为不可能一位一位寻址。
字节序,一个字中的各个字节排列的顺序:
0x11223344
大端模式,高位在小地址
小端模式,高位在大地址
声明某种数据类型,不要用别的精度访问,因为字节序。在网络有关代码需要在不同机器上使用格式转换来回切换。
程序在内存中占据的空间被称为内存印记。
如果数据结构中有多种不同精度的变量,打包很有意义,保证没有空间浪费。
例:struct {char a;char b[3];}可能为这种布局
浪费了50%的存储空间,有效的编译器会将这种情况打包为
上面除了节省空间外,还能减少处理器和内存之间的访问次数,非常高效。
但打包并非总是正确的途径:
struct {char a; int b;} char一个字节,int四个字节,可能为
lsb为低位,msb为高位
上面这种非常低效,为了读取int,需要访问两次,所以往往要求操作数从可寻址地址开始。这就是对齐限制。
所以编译器会使用
尽管浪费了37.5%空间,但变得更加高效了。
明天继续写。。。
上一篇: ES6 如何改变JS内置行为的代理与反射
下一篇: 蒸鲍鱼要几分钟,你知道吗