上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.8 内存子系统
内存子系统(memory subsystem)保存程序变量、常量、机器指令和其他信息等数据。内存由内存单元(或称为内存位置)组成,每个内存单元都保存着一小段信息。系统可以将来自这些小的内存单元的信息组合成更大的信息片段。
x86-64支持字节可寻址内存(byte-addressable memory),这意味着基本内存单元是一个字节,足以容纳单个字符或者(非常)小的整数值(我们将在第2章中详细讨论)。
可以把内存想象成一个线性字节数组,第一个字节的地址为0,最后一个字节的地址为232-1。对于安装了4GB内存的x86处理器[4],以下伪Pascal数组声明是对内存的最佳近似表示:
Memory:array[0..4294967295]of byte;
C/C++和Java用户可能更喜欢以下的语法:
byte Memory[4294967296];
例如,为了执行等价于Pascal语句“Memory[125]:=0;”的操作,CPU将值0放在数据总线上,将地址125放在地址总线上,并断言写入线(该操作通常将该写入线设置为0),如图1-3所示。
为了执行等价于语句“CPU:=Memory[125];”的操作,CPU将地址125放置在地址总线上,并断言读取线(因为CPU正在从内存读取数据),然后从数据总线读取结果数据(请参见图1-4)。
图1-3 内存写入操作
图1-4 内存读取操作
为了存储更大的值,x86使用一系列连续的内存位置。图1-5显示了x86如何在内存中存储字节、字(2个字节)和双字(4个字节)。对象的内存地址是其第一个字节的地址(即最低地址)。
图1-5 内存中字节、字和双字的存储方式