【问题标题】:What does attributte section mean in UEFI memmap?UEFI memmap中的属性部分是什么意思?
【发布时间】:2021-06-02 23:34:36
【问题描述】:

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

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

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

所以,我的问题是:

  1. 属性是什么意思?
  2. 如何更改属性以使用这部分内存?

【问题讨论】:

  • 属性值显示在内核源代码“include/linux/efi.h”中的EFI_MEMORY_...宏中。
  • 属性定义可以在 UEFI 规范第 7.2 节或UEFI spec 2.8 Errata A 的 P166 中找到

标签: linux-kernel arm embedded uefi


【解决方案1】:

memmap 命令通过列出每个内存区域的 EFI_MEMORY_DESCRIPTOR 的内容来显示由 UEFI 环境维护的内存映射。

typedef struct {
 UINT32                 Type;
 EFI_PHYSICAL_ADDRESS   PhysicalStart;
 EFI_VIRTUAL_ADDRESS    VirtualStart;
 UINT64                 NumberOfPages;
 UINT64                 Attribute;
} EFI_MEMORY_DESCRIPTOR;

内存区域的属性字段描述了该内存区域的功能位掩码,不一定是该内存区域的当前设置。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 2011-05-16
    • 2013-06-13
    • 2016-01-13
    相关资源
    最近更新 更多