基本概念
进程虚拟地址空间
ARM64的地址空间分配如下:
- 用户地址空间
0x0000000000000000–0000ffffffffffffffff - 内核地址空间
0xffff000000000000–0xffffffffffffffff
每一个用户进程拥有自己独立的用户地址空间,但内核地址空间只有一个,所有进程共用。
task_struct有两个成员mm和active_mm,用来描述进程的虚拟地址空间。对于用户进程来说,mm和active_mm是一致的,用来描述该进程的虚拟地址空间;对于内核进程来说,mm是NULL,因为内核进程使用统一的地址空间,active_mm借用用户进程的active_mm,至于为什么借用用户进程的active_mm暂时不得而知,后面搞清楚会补充进来。
ASID(Address Space ID)
进程切换的时候,有事会同时需要切换页表,对于ARM64来说,切换页表就是更新TTBR0,TTBR寄存器的第一如下:
除了页表地址以外,还定义了ASID。之所以引入ASID,主要是为了避免在页表切换的时候刷掉TLB。页表会以缓存的形式存在TLB中,如果没有ASID,一旦页表切换,必须要刷掉TLB,因为MMU无法区分TLB中的转换表属于谁。