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
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
- kernel支持4k/16k/64k pagesize
- k
- k
- k,
- k
- k
- k
- K -
- K
- K
- K
- K
- K
- k
- K
- K
- K
- K
- C++之public、private、protected(二)构造函数定义private或protected好处详解
- JVM内存分配、垃圾收集器和常用参数
- Installation failed with message INSTALL_CANCELED_BY_USER.
- MFC-对话框
- ubuntu上安装smb,将linux文件映射到windows下
- kernel支持4k/16k/64k pagesize
- 动态规划之数字三角形问题
- 第46篇一对多实现(三)array_intersect_assoc及array_uintersect_uassoc及array_intersect_ukey及用JavaScript输出文本
- 58到家数据库30条军规解读
- PHP autoload机制详解
- 求二叉树的叶子结点个数及深度
- 浅谈对DDD领域驱动设计的理解(转载自开发者头条)
- 七牛云存储____容灾备份策略
- win7+bugzilla+apache+mysql+activePerl环境安装bugzilla