属性部分在UEFI memmap中意味着什么?



当我在UEFI shell中调用memmap时,我得到了两个不同的属性,如下所示:

Shell> memmap
Type       Start            End              # Pages          Attributes
Available  0000000080000000-00000000CFFFFFFF 0000000000050000 000000000000000E
Available  0000002000000000-000000237FFFFFFF 0000000000380000 000000000000000F

问题是我不能使用属性标记为000000000000000F的内存的第二个区域。我已经将这部分内存注册到页表中了。但是,当我将物理地址从该区域转换为虚拟地址时,我的操作系统会panic。

所以,我的问题是:

  1. 这个属性是什么意思?
  2. 我如何改变属性,以便我可以使用内存的那一部分?

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,即内存不可缓存。

最新更新