如何理解内存
本文最后更新于:4 分钟前
如何理解内存
首先我们要知道,计算机的工作就是计算. 最重要的组件是cpu——计算机的运算单元,另外,需要计算的数据从哪里来?
那就是从内存(memory)中来. 当一个程序运行时, 以这样的一个简单程序为例:
1 | |
- 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 | |
来解释一下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 协议 ,转载请注明出处!