forked from cahirwpz/mimiker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvm_map.c
92 lines (69 loc) · 2.37 KB
/
vm_map.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdc.h>
#include <vm_pager.h>
#include <vm_object.h>
#include <vm_map.h>
#include <errno.h>
static void paging_on_demand_and_memory_protection_demo() {
vm_map_activate(vm_map_new());
vm_map_t *kmap = get_kernel_vm_map();
vm_map_t *umap = get_user_vm_map();
log("Kernel physical map : %08lx-%08lx", kmap->pmap->start, kmap->pmap->end);
log("User physical map : %08lx-%08lx", umap->pmap->start, umap->pmap->end);
vm_addr_t start = 0x1001000;
vm_addr_t end = 0x1001000 + 2 * PAGESIZE;
vm_map_entry_t *redzone0 =
vm_map_add_entry(umap, start - PAGESIZE, start, VM_PROT_NONE);
vm_map_entry_t *redzone1 =
vm_map_add_entry(umap, end, end + PAGESIZE, VM_PROT_NONE);
vm_map_entry_t *data =
vm_map_add_entry(umap, start, end, VM_PROT_READ | VM_PROT_WRITE);
redzone0->object = vm_object_alloc();
redzone1->object = vm_object_alloc();
data->object = default_pager->pgr_alloc();
vm_map_dump(umap);
vm_map_dump(kmap);
/* Start in paged on demand range, but end outside, to cause fault */
for (int *ptr = (int *)start; ptr != (int *)end; ptr += 256) {
log("%p", ptr);
*ptr = 0xfeedbabe;
}
vm_map_dump(umap);
vm_map_dump(kmap);
log("Test passed.");
}
void findspace_demo() {
vm_map_t *umap = vm_map_new();
vm_map_activate(umap);
#define addr1 0x10000000
#define addr2 0x30000000
vm_map_add_entry(umap, addr1, addr2, VM_PROT_NONE);
#define addr3 0x30005000
#define addr4 0x60000000
vm_map_add_entry(umap, addr3, addr4, VM_PROT_NONE);
vm_addr_t t;
int n;
n = vm_map_findspace(umap, 0x00010000, PAGESIZE, &t);
assert(n == 0 && t == 0x00010000);
n = vm_map_findspace(umap, addr1, PAGESIZE, &t);
assert(n == 0 && t == addr2);
n = vm_map_findspace(umap, addr1 + 20 * PAGESIZE, PAGESIZE, &t);
assert(n == 0 && t == addr2);
n = vm_map_findspace(umap, addr1, 0x6000, &t);
assert(n == 0 && t == addr4);
n = vm_map_findspace(umap, addr1, 0x5000, &t);
assert(n == 0 && t == addr2);
/* Fill the gap exactly */
vm_map_add_entry(umap, t, t + 0x5000, VM_PROT_NONE);
n = vm_map_findspace(umap, addr1, 0x5000, &t);
assert(n == 0 && t == addr4);
n = vm_map_findspace(umap, addr4, 0x6000, &t);
assert(n == 0 && t == addr4);
n = vm_map_findspace(umap, 0, 0x40000000, &t);
assert(n == -ENOMEM);
log("Test passed.");
}
int main() {
paging_on_demand_and_memory_protection_demo();
findspace_demo();
return 0;
}