如何进行ARM64 Linux内核页表的块映射

2023-04-11 06:52:00 内核 映射 ARM64
如何进行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。

相关文章