使用mpu的一个region模拟缺页
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
12
mkrtos_user/lib/sys/inc/u_mm.h
Normal file
12
mkrtos_user/lib/sys/inc/u_mm.h
Normal 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);
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
43
mkrtos_user/lib/sys/src/u_mm.c
Normal file
43
mkrtos_user/lib/sys/src/u_mm.c
Normal 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);
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user