内存地址
在 64 位机上,内存地址由一个 64 bit数表示,为什么说是地址呢,因为这个 64 bit 数代表内存上的一个字节,也就是 8 个 bit 位。内存地址在使用的时候,最小单位就是字节。一个地址代表一个字节,但实际上有 8 bit。
内存页
操作系统为了更好的进行内存的分配和回收,对内存地址按页进行编排,页是由内核决定的,在 x86 arm 等系统上, 页大小都是固定 4k,这个 4k 会带来什么问题呢,我们知道 64 机器上,表示一个数字最大可以用 64 位,但是实际上物理地址能寻址有效地址往往低于 64 位。因为引入 当 CPU 寻址时,对于一个 64 位数,其前 N 位用来寻找页号,然后后 12 位用于定位页内地址,即是一种 pg+offset 的模式。因为 12 位数能表示的最大数字是 4096,所以能表示页内有 4096 个字节。所以 4K 全称应该是 4KB。
地址对齐
比如 CPU 的访存指令,load r0, mem,意思是从 mem 这个地址加载多少个字节的数据到 r0 寄存器中,这个 mem 不能是任意数值,通常是一个 16 字节对齐的数据,也就是说 mem | 0x0f = mem。这个 mem 的后 4 位都是 0。如果地址不是对齐的,CPU 可能会发生非对其例外,这个例外可能硬件自身处理,也可能是内核处理,如果内核不处理,程序就会崩了。