如何进行ARM64 Linux内核页表的块映射
如何进行ARM64 Linux内核页表的块映射
Linux内核页表是由页表项(PTE)组成的。页表项包含了映射到物理内存的信息。为了能够将虚拟地址空间映射到物理地址空间,需要建立页表。
页表的建立是在初始化过程中完成的。首先,需要为页表分配内存空间。然后,需要将页表项填充为正确的值,以便能够将虚拟地址空间映射到物理地址空间。
页表项的格式如下所示:
typedef struct { unsigned long long int pte; } pte_t;
pte_t结构体包含了页表项的值。页表项的值由以下几部分组成:
页面基地址(Page Base Address)
页面属性(Page Attributes)
页面尺寸(Page Size)
页面基地址是指页表项映射的物理页面的基地址。页面属性指定页面的访问权限,页面尺寸指定页面的大小。
页面基地址的格式如下所示:
typedef union { unsigned long long int pte; struct { unsigned long long int page_base_address : 52; unsigned long long int : 12; } pte; } pte_t;
pte_t结构体包含了页面基地址的值。页面基地址的值占据了页表项的前52位。
页面属性的格式如下所示:
typedef union { unsigned long long int pte; struct { unsigned long long int : 8; unsigned long long int page_ap : 2; unsigned long long int page_tex : 3; unsigned long long int page_s : 1; unsigned long long int page_ng : 1; unsigned long long int page_domain : 4; unsigned long long int : 4; unsigned long long int page_xn : 1; unsigned long long int page_pxn : 1; unsigned long long int page_contiguous : 1; unsigned long long int : 4; unsigned long long int page_frame : 36; } pte; } pte_t;
pte_t结构体包含了页面属性的值。页面属性的值占据了页表项的第8位至第51位。其中,page_ap指定页面的访问权限;page_tex指定页面的缓存属性;page_s指定页面是否被shareable;page_ng指定页面是否被global;page_domain指定页面所属的domain;page_xn指定页面是否被execute never;page_pxn指定页面是否被privileged execute never;page_contiguous指定页面是否被连续;page_frame指定页面所映射的物理页面帧。
页面尺寸的格式如下所示:
typedef union { unsigned long long int pte; struct { unsigned long long int page_size : 4; unsigned long long int : 60; } pte; } pte_t;
pte_t结构体包含了页面尺寸的值。页面尺寸的值占据了页表项的第4位至第63位。其中,page_size指定页面的大小。
页面大小的取值如下所示:
4KB
64KB
1MB
16MB
页面大小取决于页表项所映射的物理页面帧的大小。如果页表项所映射的物理页面帧的大小为4KB,则页面大小也为4KB;如果页表项所映射的物理页面帧的大小为64KB,则页面大小也为64KB;如果页表项所映射的物理页面帧的大小为1MB,则页面大小也为1MB;如果页表项所映射的物理页面帧的大小为16MB,则页面大小也为16MB。
相关文章