文具网站建设策划书,wordpress固定连接无法访问,中国搜索引擎排名2021,教育网站安全建设方案ARM32页表和Linux页表那些奇葩的地方
ARM32硬件页表中PGD页目录项PGD是从20位开始的#xff0c;但是为何头文件定义是从21位开始#xff1f;
历史原因#xff1a;Linux最初是基于x86的体系结构设计的#xff0c;因此Linux内核很多的头文件的定义都是基于x86的#xff0c…ARM32页表和Linux页表那些奇葩的地方
ARM32硬件页表中PGD页目录项PGD是从20位开始的但是为何头文件定义是从21位开始
历史原因Linux最初是基于x86的体系结构设计的因此Linux内核很多的头文件的定义都是基于x86的特别是关于PTE页表项里面的很多比特位的定义。因此ARM在移植到Linux时只能参考x86版本的Linux内核的实现。
X86的PGD是从bit22 ~ bit31总共10bit位1024页表项。PT页表从bit12 ~ bit 21 总共 10 bit位1024页表项。
ARM的PGD是从bit20 ~ bit31总共12bit 4096页表项。PT域从bit12 ~ bit 19总共8bit2556页表项。
X86和ARM页表最大的差异在于PTE页表内容的不同。 Linux内核版本的PTE比特位的定义
/** Linux PTE definitions for LPAE.** These bits overlap with the hardware bits but the naming is preserved for* consistency with the classic page table format.*/
#define L_PTE_VALID (_AT(pteval_t, 1) 0) /* Valid */
#define L_PTE_PRESENT (_AT(pteval_t, 3) 0) /* Present */
#define L_PTE_USER (_AT(pteval_t, 1) 6) /* AP[1] */
#define L_PTE_SHARED (_AT(pteval_t, 3) 8) /* SH[1:0], inner shareable */
#define L_PTE_YOUNG (_AT(pteval_t, 1) 10) /* AF */
#define L_PTE_XN (_AT(pteval_t, 1) 54) /* XN */
#define L_PTE_DIRTY (_AT(pteval_t, 1) 55)
#define L_PTE_SPECIAL (_AT(pteval_t, 1) 56)
#define L_PTE_NONE (_AT(pteval_t, 1) 57) /* PROT_NONE */
#define L_PTE_RDONLY (_AT(pteval_t, 1) 58) /* READ ONLY */#define L_PMD_SECT_VALID (_AT(pmdval_t, 1) 0)
#define L_PMD_SECT_DIRTY (_AT(pmdval_t, 1) 55)
#define L_PMD_SECT_NONE (_AT(pmdval_t, 1) 57)
#define L_PMD_SECT_RDONLY (_AT(pteval_t, 1) 58)
ARM32的PTE比特位的定义
/** - extended small page/tiny page*/
#define PTE_EXT_XN (_AT(pteval_t, 1) 0) /* v6 */
#define PTE_EXT_AP_MASK (_AT(pteval_t, 3) 4)
#define PTE_EXT_AP0 (_AT(pteval_t, 1) 4)
#define PTE_EXT_AP1 (_AT(pteval_t, 2) 4)
#define PTE_EXT_AP_UNO_SRO (_AT(pteval_t, 0) 4)
#define PTE_EXT_AP_UNO_SRW (PTE_EXT_AP0)
#define PTE_EXT_AP_URO_SRW (PTE_EXT_AP1)
#define PTE_EXT_AP_URW_SRW (PTE_EXT_AP1|PTE_EXT_AP0)
#define PTE_EXT_TEX(x) (_AT(pteval_t, (x)) 6) /* v5 */
#define PTE_EXT_APX (_AT(pteval_t, 1) 9) /* v6 */
#define PTE_EXT_COHERENT (_AT(pteval_t, 1) 9) /* XScale3 */
#define PTE_EXT_SHARED (_AT(pteval_t, 1) 10) /* v6 */
#define PTE_EXT_NG (_AT(pteval_t, 1) 11) /* v6 */
那X86和ARM的页表差距这么大软件怎么设计呢Linux内核的内存管理已经适配了X86的页表项我们可以通过软件适配的办法来解决这个问题。因此ARM公司在移植该方案时提出了两套页表的方案。一套页表是为了迎合ARM硬件的真实页表另一套页表是为了迎合Linux真实的页表。
对于PTE页表来说一下子就多出了一套页表一套页表256表项每个表项占用4字节。为了软件实现的方便软件会把两个页表合并成一个页表。4套页表正好占用256 * 4 * 4 4K的空间。因此Linux实现的时候就分配了一个page 来存放这些页表。
这一套方案的话相当于每个PGD页表项有8字节包含指向两套PTE页表项的entry。每4个字节指向一个物理的二级页表。