内存编址方式
1.内存在逻辑上就是一个一个的格子,这些格子可以用来装东西,也就是内存中的数据,每个格子都有一个固定的编号,这个编号0、1、2、3就是
内存地址,这个内存地址(一个数字)和这个格子的空间是一一对应的并且是永久绑定的。这就是内存的编址方式
2.在程序运行时,CPU只认识内存地址,而不关心这个地址所代表的空间在哪里以及分布,因为硬件的设计保证了只要有地址,就一定能找到这个盒子在
哪里,所以内存单元有两个概念:地址和空间
3.内存编址是以字节为单位,每一个内存地址对应的内存大小的空间是固定的,就是一个字节8bit
内存寻址方式
1.逻辑地址:包含在机器语言指令中用来指定一个操作数或者一条指令的地址
2.线性地址(也称虚拟地址):是一个32位无符号整数,可以用来表示高达4G的地址,通常使用16进制数来表示,范围从0x00000000到0xffffffff
3.物理地址:用于内存芯片级内存单元寻址,他们从微处理器的地址引脚发送到内存总线上的电信号相对应。物理地址由32位或36位无符号整数表示
MMU
MMU内存管理单元)的功能是将逻辑地址转换为物理地址,其中包括:
1.分页单元,将逻辑地址转换为线性地址
2.分页单元,将线性地址转换为物理地址
内存对齐
typedef abc{ char a; short b; int c; } typedef my{ char a; int c; short b; }
sizeof(abc)=8而sizeof(my)=12????为什么会产生这种问题呢
为什么要字节对齐
1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。