当我在UEFI shell中调用memmap
时,我得到了两个不同的属性,如下所示:
Shell> memmap
Type Start End # Pages Attributes
Available 0000000080000000-00000000CFFFFFFF 0000000000050000 000000000000000E
Available 0000002000000000-000000237FFFFFFF 0000000000380000 000000000000000F
问题是我不能使用属性标记为000000000000000F
的内存的第二个区域。我已经将这部分内存注册到页表中了。但是,当我将物理地址从该区域转换为虚拟地址时,我的操作系统会panic。
所以,我的问题是:
- 这个属性是什么意思?
- 我如何改变属性,以便我可以使用内存的那一部分?
memmap
命令通过列出每个内存区域的EFI_MEMORY_DESCRIPTOR的内容来显示UEFI环境维护的内存映射。
typedef struct {
UINT32 Type;
EFI_PHYSICAL_ADDRESS PhysicalStart;
EFI_VIRTUAL_ADDRESS VirtualStart;
UINT64 NumberOfPages;
UINT64 Attribute;
} EFI_MEMORY_DESCRIPTOR;
内存区域的Attribute字段描述了该内存区域功能的位掩码,而不一定是该内存区域的当前设置。
//*******************************************************
// Memory Attribute Definitions
//*******************************************************
// These types can be “ORed” together as needed.
#define EFI_MEMORY_UC 0x0000000000000001
#define EFI_MEMORY_WC 0x0000000000000002
#define EFI_MEMORY_WT 0x0000000000000004
#define EFI_MEMORY_WB 0x0000000000000008
#define EFI_MEMORY_UCE 0x0000000000000010
#define EFI_MEMORY_WP 0x0000000000001000
#define EFI_MEMORY_RP 0x0000000000002000
#define EFI_MEMORY_XP 0x0000000000004000
#define EFI_MEMORY_NV 0x0000000000008000
#define EFI_MEMORY_MORE_RELIABLE 0x0000000000010000
#define EFI_MEMORY_RO 0x0000000000020000
#define EFI_MEMORY_SP 0x0000000000040000
#define EFI_MEMORY_CPU_CRYPTO 0x0000000000080000
#define EFI_MEMORY_RUNTIME 0x8000000000000000
关于这些属性的详细信息可以在UEFI规范7.2节GetMemoryMap
下找到。
两个内存区域属性值的唯一区别是EFI_MEMORY_UC,即内存不可缓存。