mpu缺页模拟支持

This commit is contained in:
ATShining
2024-09-23 00:11:15 +08:00
parent b7ae180c4e
commit 8d2d26b9c7
12 changed files with 326 additions and 103 deletions

View File

@@ -15,8 +15,8 @@ enum vpage_prot_attrs
VPAGE_PROT_IN_KNL = 0x20, //!< 内核中使用
};
#define VMA_ADDR_RESV 0x1 //!< 保留内存
// #define VMA_ADDR_UNCACHE 0x2 //!< uncache内存
#define VMA_ADDR_RESV 0x1 //!< flags 保留内存
#define VMA_ADDR_PAGE_FAULT_SIM 0x2 //!< page fault模拟
typedef union vma_addr
{

View File

@@ -53,7 +53,8 @@ static void vmm_press_block_test(CuTest *cu)
for (i = 0; i < TEST_MEM_CN; i++)
{
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, 0, 0), TEST_MM_SIZE, 0, &addr);
if (msg_tag_get_val(tag) < 0) {
if (msg_tag_get_val(tag) < 0)
{
break;
}
memset((void *)addr, 0x55, TEST_MM_SIZE);
@@ -77,6 +78,53 @@ static void vmm_press_block_test(CuTest *cu)
#undef TEST_MM_SIZE
#undef TEST_MEM_CN
}
#if IS_ENABLED(CONFIG_MPU_PAGE_FAULT_SUPPORT)
#define TEST_MEM_CN 30
static void vmm_press_block_sim_page_fault_test(CuTest *cu)
{
int i;
int m;
addr_t addr;
msg_tag_t tag;
memset(test_main, 0, sizeof(test_main));
#define TEST_MM_SIZE (PAGE_SIZE)
for (i = 0; i < TEST_MEM_CN; i++)
{
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0), TEST_MM_SIZE, 0, &addr);
if (msg_tag_get_val(tag) < 0)
{
break;
}
memset((void *)addr, 0x55, TEST_MM_SIZE);
// printf("alloc umem:0x%lx\n", addr);
test_main[i] = (void *)addr;
}
uint8_t *mem0 = test_main[0];
uint8_t *mem1 = test_main[1];
for (int i = 0; i < 100; i++)
{
*mem0 = *mem1;
*mem1 = *mem0;
}
for (m = 0; m < i; m++)
{
for (int j = 0; j < TEST_MM_SIZE; j++)
{
uint8_t *tmp_mm = test_main[m];
if (tmp_mm[j] != 0x55)
{
printf("mem test fail. i:%d j:%d\n", m, j);
}
assert(tmp_mm[j] == 0x55);
}
u_vmam_free(VMA_PROT, (addr_t)(test_main[m]), TEST_MM_SIZE);
}
#undef TEST_MM_SIZE
#undef TEST_MEM_CN
}
#endif
static CuSuite suite;
CuSuite *vmm_test_suite(void)
{
@@ -87,6 +135,8 @@ CuSuite *vmm_test_suite(void)
#endif
SUITE_ADD_TEST(&suite, vmm_small_block_test);
SUITE_ADD_TEST(&suite, vmm_press_block_test);
#if IS_ENABLED(CONFIG_MPU_PAGE_FAULT_SUPPORT)
SUITE_ADD_TEST(&suite, vmm_press_block_sim_page_fault_test);
#endif
return &suite;
}