Commit 4c5b3dff authored by 你说什么's avatar 你说什么
Browse files

技术文档

No related merge requests found
Showing with 38 additions and 20 deletions
+38 -20
......@@ -51,7 +51,7 @@
### 工具链
riscv64-linux-gnu- 工具链,例:
riscv64-linux-gnu-toolchain,例:
riscv64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04)11.4.0
......
......@@ -20,8 +20,6 @@ void main() {
int cpuid = r_tp();
print_init();
printf("Enter main, cpuid: %d \n",cpuid);
......@@ -37,33 +35,56 @@ void main() {
kvm_init();
kvm_hartinit();
printf("----------------physical memorry test ----------------\n");
int* mem[16];
for (int i = 0; i < 16; i++)
{
mem[i] = pmem_alloc(1);
memset(mem[i],1,PAGESIZE);
printf("mem[%d]: %p alloced ,data= %d\n",i,mem[i],mem[i][0]);
}
for (int i = 0; i < 16; i++)
{
pmem_free(1,mem[i]);
printf("mem[%d]: %p free\n",i,mem[i]);
}
printf("----------------Page table test ----------------\n");
pgtbl_t test_pgtbl = pmem_alloc(true);
uint64 mem[5];
uint64 mem2[5];
for(int i = 0; i < 5; i++)
mem[i] = (uint64)pmem_alloc(false);
mem2[i] = (uint64)pmem_alloc(false);
vm_map_pages(test_pgtbl, PAGESIZE * 10, mem[1], PAGESIZE / 2, PTE_R | PTE_W);
vm_map_pages(test_pgtbl, PAGESIZE * 512, mem[2], PAGESIZE - 1, PTE_R | PTE_X);
vm_map_pages(test_pgtbl, 0, mem[0], PAGESIZE, PTE_R);
vm_map_pages(test_pgtbl, PAGESIZE * 512 * 512, mem[2], PAGESIZE, PTE_R | PTE_X);
vm_map_pages(test_pgtbl, PAGESIZE * 10, mem2[1], PAGESIZE / 2, PTE_R | PTE_W);
vm_map_pages(test_pgtbl, PAGESIZE * 512, mem2[2], PAGESIZE - 1, PTE_R | PTE_X);
vm_map_pages(test_pgtbl, 0, mem2[0], PAGESIZE, PTE_R);
vm_map_pages(test_pgtbl, PAGESIZE * 512 * 512, mem2[2], PAGESIZE, PTE_R | PTE_X);
vm_map_pages(test_pgtbl, VA_MAX - PAGESIZE, mem[4], PAGESIZE, PTE_W);
vm_map_pages(test_pgtbl, VA_MAX - PAGESIZE, mem2[4], PAGESIZE, PTE_W);
vm_print(test_pgtbl);
// while (1) {} // 无限循环
while (1) {} // 无限循环
}
......@@ -6,15 +6,12 @@
#include "memlayout.h"
typedef struct page_node
{
struct page_node* next;
}page_node_t;
typedef struct alloc_zone
{
uint64 start;
......@@ -26,16 +23,16 @@ typedef struct alloc_zone
page_node_t alloc_head;
}alloc_zone_t;
static alloc_zone_t kernel_zone,user_zone;
void memset(void* begin,uint8 value,uint32 n);
void pmem_init();
void* pmem_alloc(bool inkernel);
void* pmem_alloc(bool inkernel);
void pmem_free(bool inkernel,uint64 addr);
......
......@@ -211,7 +211,7 @@ void printf(char *fmt, ...)
ptr++;
}
va_end(args);
spinlock_release(&print_lk);
......
......@@ -107,7 +107,7 @@ void vm_map_pages(pgtbl_t pgtbl, uint64 va, uint64 pa, uint64 length, int perm)
}
// 解除pgtbl中[va, va+len)区域的映射
// 解除映射
// 如果freeit == true则释放对应物理页, 默认是用户的物理页
void vm_unmap_pages(pgtbl_t pgtbl, uint64 va, uint64 len, bool freeit)
{
......@@ -150,7 +150,7 @@ void vm_unmap_pages(pgtbl_t pgtbl, uint64 va, uint64 len, bool freeit)
}
// 完成 UART CLINT PLIC 内核代码区 内核数据区 可分配区域 的映射
// 相当于填充kernel_pgtbl
// 填充kernel_pgtbl
void kvm_init()
{
kernel_pgtbl = (pgtbl_t)pmem_alloc(true);
......
......@@ -85,7 +85,7 @@ pte_t* vm_get_pte(pgtbl_t pgtbl,uint64 va,bool alloc);
void vm_map_pages(pgtbl_t pgtbl,uint64 va,uint64 pa,uint64 len,int perm);
void vm_unmap_pages(pgtbl_t pgtbl,uint64 va,uint64 len,bool free);
void vm_unmap_pages(pgtbl_t pgtbl,uint64 va,uint64 len,bool freeit);
void kvm_init();
void kvm_hartinit();
......
File added
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment