使用mpu的一个region模拟缺页

This commit is contained in:
root
2023-08-27 16:52:53 +08:00
parent 32a77c697d
commit 363c2da50c
35 changed files with 496 additions and 78 deletions

View File

@@ -17,7 +17,7 @@ static long be_write(long fd, char *buf, long size)
case 0:
case 1:
case 2:
ulog_write_bytes(buf, size);
ulog_write_bytes(LOG_PROT, buf, size);
return size;
default:
return -ENOSYS;
@@ -29,7 +29,7 @@ static long be_writev(long fd, const struct iovec *iov, long iovcnt)
long wlen = 0;
for (int i = 0; i < iovcnt; i++)
{
ulog_write_bytes(iov[i].iov_base, iov[i].iov_len);
ulog_write_bytes(LOG_PROT, iov[i].iov_base, iov[i].iov_len);
wlen += iov[i].iov_len;
}
return wlen;

View File

@@ -3,5 +3,5 @@
#include "u_arch.h"
#include "u_types.h"
#define ULOG_RW_MAX_BYTES (WORD_BYTES * 5)
void ulog_write_bytes(const uint8_t *data, umword_t len);
void ulog_write_str(const char *str);
void ulog_write_bytes(obj_handler_t obj_inx, const uint8_t *data, umword_t len);
void ulog_write_str(obj_handler_t obj_inx, const char *str);

View File

@@ -0,0 +1,12 @@
#pragma once
#include "u_types.h"
enum region_rights
{
REGION_PRIV = 1,
REGION_RO = 2,
REGION_RWX = 3,
};
void *mm_alloc_page(obj_handler_t obj_inx, umword_t pnf_nr, uint8_t attrs);
void mm_free_page(obj_handler_t obj_inx, void *addr, umword_t pfn_nr);

View File

@@ -7,6 +7,7 @@
#define TASK_PROT 3
#define LOG_PROT 4
#define IPC_PROT 5
#define MM_PROT 6
typedef struct msg_tag
{
@@ -27,3 +28,6 @@ typedef struct msg_tag
#define msg_tag_init3(t, t2, p) \
msg_tag_init(((umword_t)(t)&0xf) | (((umword_t)(t2)&0xff) << 4) | (((umword_t)(p)) << 12))
#define msg_tag_get_prot(tag) \
((mword_t)((tag).prot))

View File

@@ -9,6 +9,7 @@ typedef long mword_t;
typedef umword_t ptr_t;
typedef char bool_t;
typedef unsigned long obj_addr_t;
typedef unsigned long obj_handler_t;
#ifndef NULL
#define NULL ((void *)0)
#endif

View File

@@ -5,7 +5,7 @@
#include "u_types.h"
#include <string.h>
void ulog_write_bytes(const uint8_t *data, umword_t len)
void ulog_write_bytes(obj_handler_t obj_inx, const uint8_t *data, umword_t len)
{
uint8_t write_buf[ULOG_RW_MAX_BYTES];
umword_t j = 0;
@@ -20,7 +20,7 @@ void ulog_write_bytes(const uint8_t *data, umword_t len)
if (i > 0)
{
umword_t *write_word_buf = (umword_t *)write_buf;
syscall(LOG_PROT, msg_tag_init3(0, i, LOG_PROT).raw,
syscall(obj_inx, msg_tag_init3(0, i, LOG_PROT).raw,
write_word_buf[0],
write_word_buf[1],
write_word_buf[2],
@@ -34,7 +34,7 @@ void ulog_write_bytes(const uint8_t *data, umword_t len)
}
}
void ulog_write_str(const char *str)
void ulog_write_str(obj_handler_t obj_inx, const char *str)
{
ulog_write_bytes((uint8_t *)str, strlen(str));
ulog_write_bytes(obj_inx, (uint8_t *)str, strlen(str));
}

View File

@@ -0,0 +1,43 @@
#include "u_mm.h"
#include "u_types.h"
#include "u_prot.h"
enum mm_op
{
MM_ALLOC,
MM_FREE,
MM_MOD_ATTRS,
};
void *mm_alloc_page(obj_handler_t obj_inx, umword_t pnf_nr, uint8_t attrs)
{
register volatile umword_t r0 asm("r0");
register volatile umword_t r1 asm("r1");
register volatile umword_t r2 asm("r2");
register volatile umword_t r3 asm("r3");
syscall(obj_inx, msg_tag_init3(MM_ALLOC, 1, MM_PROT).raw,
pnf_nr,
attrs,
0,
0,
0);
{
msg_tag_t tag = msg_tag_init(r0);
if (msg_tag_get_prot(tag) < 0)
{
return NULL;
}
return (void *)r1;
}
return NULL; /*TODO:*/
}
void mm_free_page(obj_handler_t obj_inx, void *addr, umword_t pfn_nr)
{
syscall(obj_inx, msg_tag_init3(MM_FREE, 1, MM_PROT).raw,
addr,
pfn_nr,
0,
0,
0);
}

View File

@@ -1,27 +1,53 @@
#include "u_log.h"
#include "u_prot.h"
#include "u_mm.h"
#include <assert.h>
#include <stdio.h>
// char ad = 'a';
void ulog_test(void)
{
ulog_write_str("Init task running..\n");
ulog_write_str("todo..\n");
// char data[2] = {ad,0};
// ulog_write_str(data);
ulog_write_str(LOG_PROT, "Init task running..\n");
ulog_write_str(LOG_PROT, "todo..\n");
}
void mm_test(void)
{
void *mem = mm_alloc_page(MM_PROT, 1, REGION_RWX);
assert(mem);
memset(mem, 0, 512);
void *mem1 = mm_alloc_page(MM_PROT, 1, REGION_RWX);
assert(mem1);
memset(mem1, 0, 512);
// mm_free_page(MM_PROT, mem1, 1);
// mm_free_page(MM_PROT, mem, 1);
// memset(mem, 0, 512);
// memset(mem1, 0, 512);
}
void mpu_test(void)
{
#if 0
// mpu保护测试
int *test = ((int *)0x8000000);
*test = 1;
printf("test is %d\n", *test);
#endif
}
void printf_test(void)
{
printf("print test0.\n");
printf("print test1.\n");
printf("print test2.\n");
float a=1.1;
float b=1.2;
float c=a+b;
c=c;
float a = 1.1;
float b = 1.2;
float c = a + b;
c = c;
printf("%c %d %lf\n", 'a', 1234, 1.1);
}
int main(int argc, char *args[])
{
mm_test();
mpu_test();
ulog_test();
printf_test();
while (1)