如何理解内存

本文最后更新于:4 分钟前

如何理解内存

首先我们要知道,计算机的工作就是计算. 最重要的组件是cpu——计算机的运算单元,另外,需要计算的数据从哪里来?
那就是从内存(memory)中来. 当一个程序运行时, 以这样的一个简单程序为例:

1
2
3
4
5
6
7
#include <iostream>
int main() {
int a = 1, b = 2;
int c = a + b;

return 0;
}
  • cpu运行到主函数中的初始化语句int a = 1, b = 2时, 首先在内存中的两块各32bits(我们知道一般int类型的变量大小为32bits)的空间上存放1和2,
    编译器自己知道这两块空间分别叫做a和b, 大小是32位
  • 然后运行到int c = a + b时, 也在内存上开辟一块临时的空间, 标记为c, 大小为32bits,
  • 然后向内存询问地址为a和b的内存空间上的数据是什么? 需要它们进行计算.

cpu首先将a和b的地址通过地址总线传递给内存, 内存在地址总线上读到a的地址后, 将这块地址上存放的数据(1)放到数据总线上, cpu去读数据总线上的数据, 那么就得到了,a的数据, b的数据获取同理.

再看一下我们的汇编代码加深理解

1
2
3
4
5
6
7
8
9
10
11
12
0000000000001149 <main>:
1149: 55 push rbp
114a: 48 89 e5 mov rbp,rsp
114d: c7 45 f4 01 00 00 00 mov DWORD PTR [rbp-0xc],0x1 "int a = 1; 把1放到a的内存空间中
1154: c7 45 f8 02 00 00 00 mov DWORD PTR [rbp-0x8],0x2 "int b = 1; 把2放到b的内存中间中
115b: 8b 55 f4 mov edx,DWORD PTR [rbp-0xc] "把a的值从内存中读到cpu的edx寄存器中, 准备计算
115e: 8b 45 f8 mov eax,DWORD PTR [rbp-0x8] "把b的值从内存中读到cpu的eax寄存器中, 准备计算
1161: 01 d0 add eax,edx "a + b; 计算a + b, 将结果存放到寄存器eax中
1163: 89 45 fc mov DWORD PTR [rbp-0x4],eax "int c = a + b; 将eax中的值存放到c的内存空间中
1166: b8 00 00 00 00 mov eax,0x0
116b: 5d pop rbp
116c: c3 ret

来解释一下mov DWORD PTR [rbp-0xc],0x1:

  • [rbp-0xc]是一个数值, 表示的是内存中的某一块内存的起始地址(比如说是0x7fffffffdc94)
  • dword是double word的意思, 双字, intel格式的汇编语言是将一个word表示2个bytes, double word就是4个bytes,
    那么就是32bits(这里知道了大小)
  • ptr是pointer, 指针的意思.

总而言之, 将1存放到以[rpc-0xc]这块内存地址开头的, 总长度为32bits的内存空间中
实际上a在内存中是从0x7fffffffdc94~0x7fffffffdc98 (左闭右开的区间) 这一块连续的32bits大小的空间, 这里是4个间隔, 每一个间隔表示一个字节byte)

你问到为什么要将8个256-bit的memory连起来?

这样传一个地址, 那么就能一次性读8bit也就是1byte的数据, 至于为什么不只读1bit或者大一些32bits的数据, 这是当时的历史条件决定的.
当时也有6bits这样的大小, 但是因为ascii码用8bits来表示正好, 那么8bits就流行开来, 不管是内存还是磁盘, 都以8bits作为最小的寻址单位
这里有一些介绍


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!