ARM-linux内存管理

https://blog.csdn.net/tianxiawuzhei/article/details/7490984

1、ARM地址是32位,所以虚拟地址总容量也是4GB。同样分为系统空间和用户空间。

对于SA-1100,也是3GB为界。

 #define TASK_SIZE   0xc0000000(定义每个进程用户空间大小)

#define  PAGE_OFFSET 0xc0000000

#define PHYS_OFFSET  0xc0000000(内存的物理地址起点)

所以在系统空间,即在内核中,虚拟地址与物理地址在数值上是相同的,这反映在

#define _ _pa(x)  _ _virt_to_phys((unsigned long)(x))

#define _ _va(x)  ((void*)_ _phys_to_virt((unsigned long)(x)))

#define  _ _virt_to_phys(x)  (x)

#define  _ _phys_to_virt   (x)

至于用户空间的地址映射,动态的,根据需要分配物理内存,并且建立起具体进程的虚拟地址与所分配的物理内存间的映射。

系统空间的一部分不是映射到物理内存,而是映射到一些I/O设备,包括寄存器和一些小块的存储器。

2、在ARM系统结构,地址映射可以是单层的按段映射,也可以是二层的按页面映射。段的大小是1MB,而页的大小可以是64KB的大页面,或者是4KB的小页面,还可以是1KB的细小页面。其中64KB和4KB的页面映射称为粗页面映射,1KB的页面映射称为细页面映射。

3、采用单层映射,内存中的段映射表共有4096个表项,每个描述项为4个字节,所以整个映射表,大小为16KB,而且,位置必须与16KB边界对齐。当CPU访问内存时,其32为虚拟地址的高12位被用作访问段映射表的下标,从表中找到相应的表项。每个表项提供了12位的物理地址,以及对这个段的访问许可标志。将这12位物理段地址与虚拟地址的低20位拼接在一起,就得到了32伟位的物理地址。整个过程由MMU硬件完成,无需CPU介入。

4、如果采用页面映射,段映射表就成了首层映射表,其表项提供的不再是物理段地址,而是相应二层映射表所在的地址。凡是首层映射表的表项都对应一个二层映射表。二层映射表的大小因页面映射的“粗”“细”而异。如果是4KB的页面,则二层映射表中有256个表项。

CPU访问内存时,映射过程如下:

(1)以32位虚拟地址的高12位作为访问首层映射表的下标,从表中找到相应的表项,每个表项指向一个二层映射表。

(2)以虚拟地址的次8位(12-19bit)作为访问所得二层映射表的下标,进一步从相应表项中取得20位的物理页面地址。

(3)最后,将此20位的物理页面地址与虚拟地址中的最低12位拼接在一起,就得到了32位的物理地址。

同样,整个过程由MMU硬件完成,CPU并不介入。

5、由于首层映射表项用途上的多样性,表项中有两位的位段,表示其用途。00表示无映射,01表示“粗”页面表,即页面大小为64KB或4KB的二层映射表,10表示段映射,11则表示指向“细”页面表,即页面大小为1KB的二层映射表。

6、同样二层映射表中还提供了对页面的访问许可,以及页面大小等信息。因为二层表项所给出的只是20位的物理页面地址,表项中还有12位可以另作它用。二层映射表项的大小也是4个字节,所以当页面大小为4KB是,二层映射表大小为1KB,并且须与1KB边界对齐。页面为1KB时,有1K个表项,所以表的大小为4KB。页面为64KB时,按理说二层映射表只要16个就够了,但实际是ARM系统结构中的二层映射表只有粗细之分,页面大小为64KB时的二层映射表仍有256个表项,而每个大页面在表中占16个连续的表项,即把相同的表项重复16次,

7、ARM系统结构还把大页面和小页面划分成4个子页面。子页面不是确定地址映射的最小单位,而是确定访问权限的最小单位。

8、ARM的系统结构还有个“域Domain”的概念。一个域是若干段,从而是若干页面的集合,而每一个页面都属于某一个特定的域,在首层映射表项中都有4位的Domain位段,说明本段属于那一个域。另一方面,MMU中有个域访问控制寄存器,通过这个寄存器可以将16个域分别设置成不可访问、访问时检查访问权限(Client类型)、或不检查访问权限(Manager类型)。

9、协处理器中与MMU有关的处理器主要有三个:

猜你喜欢

转载自blog.csdn.net/chengde6896383/article/details/81085838