kernel支持4k/16k/64k pagesize

来源:互联网 发布:软件系统验收报告 编辑:程序博客网 时间:2024/05/16 18:27
在从arm64-stub.c 中会进行pagesize的check,从arm64 spec来看,arm64主要支持4k/16/64 这三种pagesize
efi_status_t check_platform_features(efi_system_table_t *sys_table_arg)
{
    u64 tg;

    /* UEFI mandates support for 4 KB granularity, no need to check */
    if (IS_ENABLED(CONFIG_ARM64_4K_PAGES))
        return EFI_SUCCESS;

    tg = (read_cpuid(ID_AA64MMFR0_EL1) >> ID_AA64MMFR0_TGRAN_SHIFT) & 0xf;
    if (tg != ID_AA64MMFR0_TGRAN_SUPPORTED) {
        if (IS_ENABLED(CONFIG_ARM64_64K_PAGES))
            pr_efi_err(sys_table_arg, "This 64 KB granular kernel is not supported by your CPU\n");
        else
            pr_efi_err(sys_table_arg, "This 16 KB granular kernel is not supported by your CPU\n");
        return EFI_UNSUPPORTED;
    }
    return EFI_SUCCESS;
}
从check_platform_features 中可以看出如果是4k直接返回success,否则就要读取ID_AA64MMFR0_EL1,这个时候pagesize 就是根据ID_AA64MMFR0_EL1来决定是否是16/64k的,
可见[23:20] TGran16    表示16k
[27:24]    TGran64    表示64k
[31:28]    TGran4    表示4k
Table 4.56. ID_AA64MMFR0_EL1 bit assignments
Bits    Name    Function
[63:32]    -    
Reserved, res0.
[31:28]    TGran4    
Support for 4 KB memory translation granule size:
0x0
Indicates that the 4KB granule is supported.
[27:24]    TGran64    
Support for 64 KB memory translation granule size:
0x0
Indicates that the 64KB granule is supported.
[23:20]    TGran16    
Support for 16 KB memory translation granule size:
0x0
Indicates that the 16KB granule is not supported.
[19:16]    BigEndEL0    
Mixed-endian support only at EL0.
res0
[15:12]    SNSMem    
Secure versus Non-secure Memory distinction:
0b0001
Supports a distinction between Secure and Non-secure Memory.
[11:8]    BigEnd    
Mixed-endian configuration support:
0b0001
Mixed-endian support. The SCTLR_ELx.EE and SCTLR_EL1.E0E bits are RW.
[7:4]    ASIDBits    
Number of ASID bits:
0b0010
16 bits.
[3:0]    PARange    
Physical address range supported:
0b0010
40 bits, 1 TB.
#define ID_AA64MMFR0_TGRAN4_SHIFT    28
#define ID_AA64MMFR0_TGRAN64_SHIFT    24
#define ID_AA64MMFR0_TGRAN16_SHIFT    20

从kernel中的定义也可以看出
#if defined(CONFIG_ARM64_4K_PAGES)
#define ID_AA64MMFR0_TGRAN_SHIFT    ID_AA64MMFR0_TGRAN4_SHIFT
#define ID_AA64MMFR0_TGRAN_SUPPORTED    ID_AA64MMFR0_TGRAN4_SUPPORTED
#elif defined(CONFIG_ARM64_16K_PAGES)
#define ID_AA64MMFR0_TGRAN_SHIFT    ID_AA64MMFR0_TGRAN16_SHIFT
#define ID_AA64MMFR0_TGRAN_SUPPORTED    ID_AA64MMFR0_TGRAN16_SUPPORTED
#elif defined(CONFIG_ARM64_64K_PAGES)
#define ID_AA64MMFR0_TGRAN_SHIFT    ID_AA64MMFR0_TGRAN64_SHIFT
#define ID_AA64MMFR0_TGRAN_SUPPORTED    ID_AA64MMFR0_TGRAN64_SUPPORTED
#endif

0 0