前言
本文章描述处理器体系结构相关的一部分必备基础知识。
必备知识
存储方式
大端存储模式
指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。
内存视图:
0000430: 1234 5678 0100 1800 53ef 0100 0100 0000
0000440: c7b6 1100 0000 3400 0000 0000 0100 ffff
在大端模式下,前32位为12 34 56 78
大端模式下地址的正常顺序与值的增长顺序相同。
小端存储模式
指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。
内存视图:
0000430: 7856 3412 0100 1800 53ef 0100 0100 0000
0000440: c7b6 1100 0000 3400 0000 0000 0100 ffff
在小端模式下,前32位为12 34 56 78
小端模式下地址的正常顺序与值的增长顺序相反。
判断方式
利用“联合体union的存放顺序是所有成员都是从地址值开始存放”的特性,可以判断CPU对内存采用的是大端模式还是小端模式读写。
int checkCPU(void)
{
union w {
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
}
如果返回结果为true,则是小端模式,否则是大端模式。
内存管理单元 MMU
ARM处理器的内存管理单元(Memory Management Unit, MMU)包括TLB(Translation Look-aside Buffer)和Table Walk Unit两个部件。
TLB
TLB是一块高速缓存,用于缓存页表转换的结果,从而减少内存访问的时间。TLB表项(TLB entry)数量比较少,每个TLB表项包含一个页面的相关信息,例如有效位、虚拟页号、修改位、物理页帧号等。
一个完整的页表翻译和查找的过程叫做页表查找(Translation table walk),页表查询的过程由硬件自动完成,但是页表的维护需要软件来完成。页表查询是一个相对耗时的过程,理想的状态下是TLB里存有页表相关信息。如果TLB表项中有相应的表项,直接从TLB表项中获取物理地址,称为TLB命中。如果TLB表项中没有相应的表项,称为TLB miss。当TLB miss时,才会取查询页表,并且开始读入页表的内容。
页的大小
超级大段(superSection):支持16MB大小的超级大块。
段(section):支持1MB大小的段。
大页面(Large page):支持64KB大小的大页。
页面(page):4KB的页,Linux内核默认使用4KB的页。
AArch64架构的异常等级(Exception Levels)
EL0:用户特权,用于运行普通用户程序。
EL1:系统特权,通常用于运行操作系统。
EL2:运行虚拟化扩展的Hypervisor。
EL3:运行安全世界中的Secure Monitor。
NUMA
绝大多数ARM都采用UMA(Uniform Memory Architecture)的内存架构,即内存时统一结构和统一寻址的。
对称多处理器(Symmetric Multiple Processing,SMP)系统大部分都采用UMA内存架构。
在UMA架构的系统中有如下特点.
1. 所有硬件资源都是共享的,每个处理器都能访问到系统中的内存和外设资源。
2. 所有处理器都是平等关系。
3. 统一寻址访问内存。
4. 处理器和内存通过内部的一条总线连接在一起。
随着处理器数量的增多,系统总线成为系统的最大瓶颈。
NUMA系统从SMP系统演化过来。
NUMA系统由多个内存结点组成,整个内存体系可以作为一个整体,任何处理器都可以访问,只是处理器访问本地内存结点拥有更小的延迟和更大的带宽,处理器访问远程内存结点速度要慢一些。每个处理器除了拥有本地的内存之外,还可以拥有本地总线,例如PCIE、SATA等。