首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >aarch64 EL0模式与用户空间范围

aarch64 EL0模式与用户空间范围
EN

Stack Overflow用户
提问于 2022-04-13 07:56:29
回答 1查看 256关注 0票数 0

我目前正在Aarch64架构上移植Aarch64操作系统。我正在使用QEMU/virt64 64仿真进行此操作。只要我在内核空间中运行EL1中的代码,一切都进行得很顺利。但是当我开始处理用户空间方面的问题时,我遇到了一些问题,并发现了各种各样的事情。我想确认一下我的判断是否正确。

(SO3机制在非常简化的形式上非常类似于Linux。我们考虑48位VA寻址,ttbr0/ttbr1el1目前使用相同的页面表)。

首先,不可能在EL0模式下运行内核代码(因此代码位于地址>0 xff00.),对吗?(目前,第一个用户线程序言在内核空间开始执行,但在用户模式下,所以我需要重新映射应用程序区域中的一些页面),或者我忽略了一些armv8支持的特性?

其次,我注意到在EL0中,任何使用位47访问内存位置的方法都会导致异常(在EL1中)(我将堆栈放在用户范围的最后几页中),并且知道为什么会失败?(SCTRL/TCR的配置方式与Linux略有相同)

这两种情况都导致esr_el1: 0x92000044 (MMU故障)。

ADDINGS

翻译有四个层次。

更奇怪的是:如果我在块描述符的TTE中设置了位6 (AP1),当MMU切换到L0页面表时,它就会失败。它只适用于页面TTE (级别3)。

以下是系统寄存器的值:

0x15b5503510

  • SCTLR_EL1: 0x34f4d91d

与技合制度相对应的是:

代码语言:javascript
运行
复制
#define TCR_CACHE_FLAGS TCR_IRGN_WBWA | TCR_ORGN_WBWA
#define TCR_TG_FLAGS    TCR_TG0_4K | TCR_TG1_4K
#define TCR_SMP_FLAGS   (TCR_SH0_INNER | TCR_SH1_INNER)

tcr = TCR_CACHE_FLAGS | TCR_SMP_FLAGS | TCR_TG_FLAGS | TCR_ASID16 | TCR_A1;
tcr |= TCR_TxSZ(48) | (TCR_PS_BITS_256TB << TCR_IPS_SHIFT);

和SCTLR:

代码语言:javascript
运行
复制
#define SCTLR_EL1_SET   (SCTLR_ELx_M    | SCTLR_ELx_C    | SCTLR_ELx_SA   |\
             SCTLR_EL1_SA0  | SCTLR_EL1_SED  | SCTLR_ELx_I    |\
             SCTLR_EL1_DZE  | SCTLR_EL1_UCT           |\
             SCTLR_EL1_NTWE | SCTLR_ELx_IESB | SCTLR_EL1_SPAN |\
             ENDIAN_SET_EL1 | SCTLR_EL1_UCI  | SCTLR_EL1_RES1)

内存区域属性取自Linux:

代码语言:javascript
运行
复制
#define MT_NORMAL       0
#define MT_NORMAL_TAGGED    1
#define MT_NORMAL_NC        2
#define MT_NORMAL_WT        3
#define MT_DEVICE_nGnRnE    4
#define MT_DEVICE_nGnRE     5
#define MT_DEVICE_GRE       6

/* MAIR_ELx memory attributes (used by Linux) */
#define MAIR_ATTR_DEVICE_nGnRnE     UL(0x00)
#define MAIR_ATTR_DEVICE_nGnRE      UL(0x04)
#define MAIR_ATTR_DEVICE_GRE        UL(0x0c)
#define MAIR_ATTR_NORMAL_NC     UL(0x44)
#define MAIR_ATTR_NORMAL_WT     UL(0xbb)
#define MAIR_ATTR_NORMAL_TAGGED     UL(0xf0)
#define MAIR_ATTR_NORMAL        UL(0xff)
#define MAIR_ATTR_MASK          UL(0xff)

/* Position the attr at the correct index */
#define MAIR_ATTRIDX(attr, idx)     ((attr) << ((idx) * 8))

#define MAIR_EL1_SET                            \
    (MAIR_ATTRIDX(MAIR_ATTR_DEVICE_nGnRnE, MT_DEVICE_nGnRnE) |  \
     MAIR_ATTRIDX(MAIR_ATTR_DEVICE_nGnRE, MT_DEVICE_nGnRE) |    \
     MAIR_ATTRIDX(MAIR_ATTR_DEVICE_GRE, MT_DEVICE_GRE) |        \
     MAIR_ATTRIDX(MAIR_ATTR_NORMAL_NC, MT_NORMAL_NC) |      \
     MAIR_ATTRIDX(MAIR_ATTR_NORMAL, MT_NORMAL) |            \
     MAIR_ATTRIDX(MAIR_ATTR_NORMAL_WT, MT_NORMAL_WT) |      \
     MAIR_ATTRIDX(MAIR_ATTR_NORMAL, MT_NORMAL_TAGGED))

内核代码映射为MT_NORMAL

而TTE配置有以下功能:

代码语言:javascript
运行
复制
static inline void set_pte_table(u64 *pte, enum dcache_option option)
{
    u64 attrs = PTE_TABLE_NS;

    *pte |= PTE_TYPE_TABLE;
    *pte |= attrs;
}

static inline void set_pte_block(u64 *pte, enum dcache_option option)
{
    u64 attrs = PTE_BLOCK_MEMTYPE(option);

    /* Set the PTE with R/W permissions for both kernel and user mode */
    *pte |= PTE_TYPE_BLOCK | PTE_BLOCK_AF | PTE_BLOCK_INNER_SHARE | PTE_BLOCK_NS;
    *pte |= attrs;
}

static inline void set_pte_page(u64 *pte, enum dcache_option option)
{
    u64 attrs = PTE_BLOCK_MEMTYPE(option);

    /* Set the PTE with R/W permissions for both kernel and user mode */
    *pte |= PTE_TYPE_PAGE | PTE_BLOCK_AF | PTE_BLOCK_INNER_SHARE | PTE_BLOCK_NS | PTE_BLOCK_AP1;
    *pte |= attrs;
}

如果我试图在PTE_BLOCK_AP1函数中设置set_pte_block,它就会失败。

EN

回答 1

Stack Overflow用户

发布于 2022-04-13 08:24:25

适用于EL1和EL0的翻译制度是同一的。因此,如果正确配置内存系统,则绝对可以在内核模式下运行代码。你想确保:

  • AP[1] (bit 6)在TTE中页应该是可执行的,TTE中的UXN (bit 54)是页面表的0.
  • None,它们的APTableUXNTable位被设置为一个值,不允许它们将页面映射为您在ARMv8.1或更高版本上的“用户可访问/用户土地executable.
  • If”,PAN被禁用。为此,运行msr pan, 0并将SCTLR_EL1.SPAN (位23)设置为1 (否则在每个异常项上将重新启用PAN )。如果您的目标具有FEAT_E0PD (在ARMv8.5中是强制性的,在ARMv8.4中是可选的),则确保TCR_EL1.E0PD1 (位56)是0 (假设内核位于地址空间的上半部分,否则是E0PD0,位55)。H 223f 224

(位数从0开始编号,与ARMv8参考手册中的编号相同。)

对于第二个问题,我们需要知道加载到TCR_EL1中的确切值,但我的猜测是,T0SZ的值使TTBR0 0映射的地址空间小于48位。在这两种情况下,ESR_EL1在异常向量读取时都会持有异常综合症。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71853873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档