first
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2023-9-25 tangzz98 the first version
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
#include <mprotect.h>
|
||||
|
||||
void mprotect_example_exception_hook(rt_mem_exception_info_t *info)
|
||||
{
|
||||
rt_kprintf("Memory manage exception\n");
|
||||
rt_kprintf("Faulting thread: %s\n", info->thread->parent.name);
|
||||
rt_kprintf("Faulting address: %p\n", info->addr);
|
||||
rt_kprintf("Faulting region: %p - %p", info->region.start, (void *)((rt_size_t)info->region.start + info->region.size));
|
||||
}
|
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2023-09-25 tangzz98 the first version
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
#include <mprotect.h>
|
||||
|
||||
#define THREAD_PRIORITY 25
|
||||
#define THREAD_STACK_SIZE 512
|
||||
#define THREAD_TIMESLICE 5
|
||||
|
||||
rt_align(MPU_MIN_REGION_SIZE) rt_uint8_t thread1_private_data[MPU_MIN_REGION_SIZE];
|
||||
|
||||
static void thread1_entry(void *parameter)
|
||||
{
|
||||
(void)parameter;
|
||||
/* Thread 1 configures thread1_private_data for exclusive access */
|
||||
rt_kprintf("Thread 1 configures private data\n");
|
||||
rt_mprotect_add_exclusive_region((void *)thread1_private_data, MPU_MIN_REGION_SIZE);
|
||||
rt_kprintf("Thread 1 private data address: %p - %p\n", &thread1_private_data[0], &thread1_private_data[MPU_MIN_REGION_SIZE]);
|
||||
rt_kprintf("Thread 1 reads and writes to its private data\n");
|
||||
for (int i = 0; i < MPU_MIN_REGION_SIZE; i++)
|
||||
{
|
||||
/* Thread 1 has access to its private data */
|
||||
thread1_private_data[i] = i;
|
||||
rt_kprintf("thread1_private_data[%d] = %d\n", i, thread1_private_data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void thread2_entry(void *parameter)
|
||||
{
|
||||
(void)parameter;
|
||||
rt_kprintf("Thread 2 writes to thread 1's private data\n");
|
||||
for (int i = 0; i < MPU_MIN_REGION_SIZE; i++)
|
||||
{
|
||||
/*
|
||||
* Thread 2 does not have access to thread 1's private data.
|
||||
* Access generates an exception.
|
||||
*/
|
||||
thread1_private_data[i] = i;
|
||||
}
|
||||
}
|
||||
|
||||
int mprotect_example_exclusive_region()
|
||||
{
|
||||
extern void mprotect_example_exception_hook(rt_mem_exception_info_t *info);
|
||||
rt_hw_mpu_exception_set_hook(mprotect_example_exception_hook);
|
||||
rt_thread_t tid1 = RT_NULL;
|
||||
tid1 = rt_thread_create("thread1",
|
||||
thread1_entry, RT_NULL,
|
||||
THREAD_STACK_SIZE,
|
||||
THREAD_PRIORITY - 1,
|
||||
THREAD_TIMESLICE);
|
||||
if (tid1 != RT_NULL)
|
||||
rt_thread_startup(tid1);
|
||||
|
||||
rt_thread_t tid2 = RT_NULL;
|
||||
tid2 = rt_thread_create("thread2",
|
||||
thread2_entry, RT_NULL,
|
||||
THREAD_STACK_SIZE,
|
||||
THREAD_PRIORITY,
|
||||
THREAD_TIMESLICE);
|
||||
if (tid2 != RT_NULL)
|
||||
rt_thread_startup(tid2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
MSH_CMD_EXPORT(mprotect_example_exclusive_region, Memory protection example (exclusive_region));
|
@@ -0,0 +1,88 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2023-09-25 tangzz98 the first version
|
||||
*/
|
||||
|
||||
#include <rtthread.h>
|
||||
#include <mprotect.h>
|
||||
|
||||
#define THREAD_PRIORITY 25
|
||||
#define THREAD_STACK_SIZE 512
|
||||
#define THREAD_TIMESLICE 5
|
||||
|
||||
rt_align(MPU_MIN_REGION_SIZE) rt_uint8_t ro_data[MPU_MIN_REGION_SIZE];
|
||||
|
||||
static void thread1_entry(void *parameter)
|
||||
{
|
||||
(void)parameter;
|
||||
rt_kprintf("ro_data address: %p - %p\n", &ro_data[0], &ro_data[MPU_MIN_REGION_SIZE]);
|
||||
/* Thread 1 can write ro_data before configuring memory protection. */
|
||||
rt_kprintf("Thread 1 writes to ro_data before configuring memory protection\n");
|
||||
for (int i = 0; i < MPU_MIN_REGION_SIZE; i++)
|
||||
{
|
||||
ro_data[i] = i;
|
||||
rt_kprintf("ro_data[%d] = %d\n", i, ro_data[i]);
|
||||
}
|
||||
rt_mem_region_t ro_region =
|
||||
{
|
||||
.start = (void *)ro_data,
|
||||
.size = MPU_MIN_REGION_SIZE,
|
||||
.attr = RT_MEM_REGION_P_RO_U_RO,
|
||||
};
|
||||
/* Thread 1 configures ro_data as read only. */
|
||||
rt_kprintf("Thread 1 configures ro_data for read-only access for thread 1\n");
|
||||
rt_mprotect_add_region(RT_NULL, &ro_region);
|
||||
rt_kprintf("Thread 1 reads ro_data\n");
|
||||
for (int i = 0; i < MPU_MIN_REGION_SIZE; i++)
|
||||
{
|
||||
rt_kprintf("ro_data[%d] = %d\n", i, ro_data[i]);
|
||||
}
|
||||
rt_thread_delay(RT_TICK_PER_SECOND * 1);
|
||||
/* Thread 1 cannot write ro_data. */
|
||||
rt_kprintf("Thread 1 writes to ro_data\n");
|
||||
for (int i = 0; i < MPU_MIN_REGION_SIZE; i++)
|
||||
{
|
||||
ro_data[i] = i;
|
||||
}
|
||||
}
|
||||
|
||||
static void thread2_entry(void *parameter)
|
||||
{
|
||||
(void)parameter;
|
||||
rt_kprintf("Thread 2 writes to ro_data\n");
|
||||
for (int i = 0; i < MPU_MIN_REGION_SIZE; i++)
|
||||
{
|
||||
/* Thread 2 can write ro_data. */
|
||||
ro_data[i] = i;
|
||||
rt_kprintf("ro_data[%d] = %d\n", i, ro_data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
int mprotect_example_ro_data()
|
||||
{
|
||||
extern void mprotect_example_exception_hook(rt_mem_exception_info_t *info);
|
||||
rt_hw_mpu_exception_set_hook(mprotect_example_exception_hook);
|
||||
rt_thread_t tid1 = RT_NULL;
|
||||
tid1 = rt_thread_create("thread1",
|
||||
thread1_entry, RT_NULL,
|
||||
THREAD_STACK_SIZE,
|
||||
THREAD_PRIORITY - 1,
|
||||
THREAD_TIMESLICE);
|
||||
rt_thread_startup(tid1);
|
||||
rt_thread_t tid2 = RT_NULL;
|
||||
tid2 = rt_thread_create("thread2",
|
||||
thread2_entry, RT_NULL,
|
||||
THREAD_STACK_SIZE,
|
||||
THREAD_PRIORITY,
|
||||
THREAD_TIMESLICE);
|
||||
rt_thread_startup(tid2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
MSH_CMD_EXPORT(mprotect_example_ro_data, Memory protection example (read-only data));
|
Reference in New Issue
Block a user