Skip to content

Lab5: BowerAccess Lab #95

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 15, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Lab5/filelist.mk
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ FS_WRAPPER := $(FS_BASE_DIR)/fs_wrapper.c
FS_OPS := $(FS_BASE_DIR)/fs_wrapper_ops.c
FSM := $(FSM_DIR)/fsm.c
FSM_CLIENT_CAP := $(FSM_DIR)/fsm_client_cap.c
FS_FILE_FAULT := $(FS_BASE_DIR)/fs_page_fault.c

FILES := $(FS_VNODE) $(FS_WRAPPER) $(FS_OPS) $(FSM) $(FSM_CLIENT_CAP)
FILES := $(FS_VNODE) $(FS_WRAPPER) $(FS_OPS) $(FSM) $(FSM_CLIENT_CAP) $(FS_FILE_FAULT)
10 changes: 9 additions & 1 deletion Lab5/kernel/include/mm/vmspace.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,15 @@ struct vmregion {
vmr_prop_t perm;
struct pmobject *pmo;
struct list_head cow_private_pages;
/* for Lab5, llm page lru list */
struct list_head llm_pages;
int num_llm_pages;
};

#define MAX_LLM_PAGE_NUM 16
struct llm_page {
struct list_head node;
vaddr_t vaddr;
};

/* This struct represents one virtual address space */
Expand All @@ -60,7 +69,6 @@ struct vmspace {
unsigned char history_cpus[PLAT_CPU_NUM];

struct vmregion *heap_boundary_vmr;

/* Records size of memory mapped. Protected by pgtbl_lock. */
long rss;
};
Expand Down
2 changes: 2 additions & 0 deletions Lab5/kernel/include/object/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ struct pmobject {
*/
void *private;
struct list_head mapping_list;
/* Lab5, counting page faults */
long page_faults;
};

/* kernel internal interfaces */
Expand Down
3 changes: 3 additions & 0 deletions Lab5/kernel/include/object/user_fault.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,5 +62,8 @@ void handle_user_fault(struct pmobject *pmo, vaddr_t fault_va);
int sys_user_fault_register(cap_t notific_cap, vaddr_t msg_buffer);
int sys_user_fault_map(badge_t client_badge, vaddr_t fault_va, vaddr_t remap_va,
bool copy, unsigned long perm);
/* Syscall for Lab5 only */
int sys_user_fault_map_batched(badge_t client_badge, vaddr_t fault_va, vaddr_t remap_va,
bool copy, unsigned long perm, bool completed, vaddr_t orig_fault_va);

#endif /* OBJECT_USER_FAULT_H */
Binary file modified Lab5/kernel/mm/vmspace.c.dbg.obj
Binary file not shown.
Binary file modified Lab5/kernel/mm/vmspace.c.obj
Binary file not shown.
Binary file modified Lab5/kernel/object/memory.c.dbg.obj
Binary file not shown.
Binary file modified Lab5/kernel/object/memory.c.obj
Binary file not shown.
Binary file modified Lab5/kernel/object/user_fault.c.dbg.obj
Binary file not shown.
Binary file modified Lab5/kernel/object/user_fault.c.obj
Binary file not shown.
Binary file modified Lab5/kernel/syscall/syscall.c.dbg.obj
Binary file not shown.
Binary file modified Lab5/kernel/syscall/syscall.c.obj
Binary file not shown.
2 changes: 1 addition & 1 deletion Lab5/kernel/user-include/uapi/memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ typedef unsigned pmo_type_t;
#define PMO_TZ_NS 7
#define PMO_TZ_SHM 8
#endif /* CHCORE_OPENTRUSTEE */

#define PMO_FILE_LLM 9 /* Only for Lab5 test, temporary type for starting page fault counting */
#define PMO_FORBID 10 /* Forbidden area: avoid overflow */

/* vmr permissions */
Expand Down
2 changes: 2 additions & 0 deletions Lab5/kernel/user-include/uapi/syscall_num.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@
/* - page fault */
#define CHCORE_SYS_user_fault_register 41
#define CHCORE_SYS_user_fault_map 42
/* Only for Lab5 */
#define CHCORE_SYS_user_fault_map_batched 60

/* POSIX */
/* - time */
Expand Down
Binary file added Lab5/ramdisk/test_llm.bin
Binary file not shown.
2 changes: 1 addition & 1 deletion Lab5/scores-part2.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{
"capture": "All fs tests passed",
"msg": "FS_Base Vnode",
"proposed": 15,
"proposed": 10,
"userland": true
}
]
2 changes: 1 addition & 1 deletion Lab5/scores-part3.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
{
"capture": "All fs tests passed",
"msg": "FS Server Entry",
"proposed": 15,
"proposed": 10,
"userland": true
}
]
18 changes: 18 additions & 0 deletions Lab5/scores-part4.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,23 @@
"msg": "wrapper mmap",
"proposed": 10,
"userland": true
},
{
"capture": "llm page fault times <= 16",
"msg": "llm page fault 1",
"proposed": 2,
"userland": true
},
{
"capture": "llm page fault time <= 8",
"msg": "llm page fault 2",
"proposed": 5,
"userland": true
},
{
"capture": "llm page fault time <= 2",
"msg": "llm page fault 3",
"proposed": 3,
"userland": true
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,9 @@ void usys_top(void);
int usys_user_fault_register(cap_t notific_cap, vaddr_t msg_buffer);
int usys_user_fault_map(badge_t client_badge, vaddr_t fault_va,
vaddr_t remap_va, bool copy, vmr_prop_t perm);
/* Only for Lab7 */
int usys_user_fault_map_batched(badge_t client_badge, vaddr_t fault_va,
vaddr_t remap_va, bool copy, vmr_prop_t perm, bool completed, vaddr_t orig_fault_va);
int usys_map_pmo_with_length(cap_t pmo_cap, vaddr_t addr, unsigned long perm,
size_t length);
int usys_unmap_pmo_with_length(cap_t pmo_cap, unsigned long addr, size_t size);
Expand Down
153 changes: 153 additions & 0 deletions Lab5/user/chcore-libc/libchcore/porting/overrides/include/sys/mman.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
#ifndef _SYS_MMAN_H
#define _SYS_MMAN_H
#ifdef __cplusplus
extern "C" {
#endif

#include <features.h>

#define __NEED_mode_t
#define __NEED_size_t
#define __NEED_off_t

#if defined(_GNU_SOURCE)
#define __NEED_ssize_t
#endif

#include <bits/alltypes.h>

#define MAP_FAILED ((void *) -1)

#define MAP_SHARED 0x01
#define MAP_PRIVATE 0x02
#define MAP_LLM 0x04
#define MAP_SHARED_VALIDATE 0x03
#define MAP_TYPE 0x0f
#define MAP_FIXED 0x10
#define MAP_ANON 0x20
#define MAP_ANONYMOUS MAP_ANON
#define MAP_NORESERVE 0x4000
#define MAP_GROWSDOWN 0x0100
#define MAP_DENYWRITE 0x0800
#define MAP_EXECUTABLE 0x1000
#define MAP_LOCKED 0x2000
#define MAP_POPULATE 0x8000
#define MAP_NONBLOCK 0x10000
#define MAP_STACK 0x20000
#define MAP_HUGETLB 0x40000
#define MAP_SYNC 0x80000
#define MAP_FIXED_NOREPLACE 0x100000
#define MAP_FILE 0

#define MAP_HUGE_SHIFT 26
#define MAP_HUGE_MASK 0x3f
#define MAP_HUGE_16KB (14 << 26)
#define MAP_HUGE_64KB (16 << 26)
#define MAP_HUGE_512KB (19 << 26)
#define MAP_HUGE_1MB (20 << 26)
#define MAP_HUGE_2MB (21 << 26)
#define MAP_HUGE_8MB (23 << 26)
#define MAP_HUGE_16MB (24 << 26)
#define MAP_HUGE_32MB (25 << 26)
#define MAP_HUGE_256MB (28 << 26)
#define MAP_HUGE_512MB (29 << 26)
#define MAP_HUGE_1GB (30 << 26)
#define MAP_HUGE_2GB (31 << 26)
#define MAP_HUGE_16GB (34U << 26)

#define PROT_NONE 0
#define PROT_READ 1
#define PROT_WRITE 2
#define PROT_EXEC 4
#define PROT_GROWSDOWN 0x01000000
#define PROT_GROWSUP 0x02000000

#define MS_ASYNC 1
#define MS_INVALIDATE 2
#define MS_SYNC 4

#define MCL_CURRENT 1
#define MCL_FUTURE 2
#define MCL_ONFAULT 4

#define POSIX_MADV_NORMAL 0
#define POSIX_MADV_RANDOM 1
#define POSIX_MADV_SEQUENTIAL 2
#define POSIX_MADV_WILLNEED 3
#define POSIX_MADV_DONTNEED 4

#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
#define MADV_NORMAL 0
#define MADV_RANDOM 1
#define MADV_SEQUENTIAL 2
#define MADV_WILLNEED 3
#define MADV_DONTNEED 4
#define MADV_FREE 8
#define MADV_REMOVE 9
#define MADV_DONTFORK 10
#define MADV_DOFORK 11
#define MADV_MERGEABLE 12
#define MADV_UNMERGEABLE 13
#define MADV_HUGEPAGE 14
#define MADV_NOHUGEPAGE 15
#define MADV_DONTDUMP 16
#define MADV_DODUMP 17
#define MADV_WIPEONFORK 18
#define MADV_KEEPONFORK 19
#define MADV_COLD 20
#define MADV_PAGEOUT 21
#define MADV_HWPOISON 100
#define MADV_SOFT_OFFLINE 101
#endif

#ifdef _GNU_SOURCE
#define MREMAP_MAYMOVE 1
#define MREMAP_FIXED 2
#define MREMAP_DONTUNMAP 4

#define MLOCK_ONFAULT 0x01

#define MFD_CLOEXEC 0x0001U
#define MFD_ALLOW_SEALING 0x0002U
#define MFD_HUGETLB 0x0004U
#endif

#include <bits/mman.h>

void *mmap (void *, size_t, int, int, int, off_t);
int munmap (void *, size_t);

int mprotect (void *, size_t, int);
int msync (void *, size_t, int);

int posix_madvise (void *, size_t, int);

int mlock (const void *, size_t);
int munlock (const void *, size_t);
int mlockall (int);
int munlockall (void);

#ifdef _GNU_SOURCE
void *mremap (void *, size_t, size_t, int, ...);
int remap_file_pages (void *, size_t, int, size_t, int);
int memfd_create (const char *, unsigned);
int mlock2 (const void *, size_t, unsigned);
#endif

#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
int madvise (void *, size_t, int);
int mincore (void *, size_t, unsigned char *);
#endif

int shm_open (const char *, int, mode_t);
int shm_unlink (const char *);

#if defined(_LARGEFILE64_SOURCE)
#define mmap64 mmap
#define off64_t off_t
#endif

#ifdef __cplusplus
}
#endif
#endif
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,19 @@ int usys_user_fault_map(badge_t client_badge, vaddr_t fault_va,
perm);
}

int usys_user_fault_map_batched(badge_t client_badge, vaddr_t fault_va,
vaddr_t remap_va, bool copy, vmr_prop_t perm, bool completed, vaddr_t orig_fault_va)
{
return chcore_syscall7(CHCORE_SYS_user_fault_map_batched,
client_badge,
fault_va,
remap_va,
copy,
perm,
completed,
orig_fault_va);
}

int usys_map_pmo_with_length(cap_t pmo_cap, vaddr_t addr, unsigned long perm,
size_t length)
{
Expand Down
56 changes: 53 additions & 3 deletions Lab5/user/system-services/system-servers/fs_base/fs_page_fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ cap_t notific_cap;
struct list_head fmap_area_mappings;
pthread_rwlock_t fmap_area_lock;

#define MAX_LLM_PAGE_NUM 16

/**
* If page cache module is available,
* use addr of page cache page first.
Expand Down Expand Up @@ -70,6 +72,15 @@ vaddr_t fs_wrapper_fmap_get_page_addr(struct fs_vnode *vnode, off_t offset)
return (vaddr_t)page_buf;
}

static int predict_prefetch_pages(int fault_page_id,
int prefetch_page_ids[MAX_LLM_PAGE_NUM])
{
/* LAB7 TODO BEGIN */
prefetch_page_ids[0] = fault_page_id;
return 0;
/* LAB7 TODO END */
}

static int handle_one_fault(badge_t fault_badge, vaddr_t fault_va)
{
vaddr_t server_page_addr;
Expand All @@ -81,8 +92,14 @@ static int handle_one_fault(badge_t fault_badge, vaddr_t fault_va)
bool copy = 0;
int ret;

/* declared for prefetching */
int prefetch_page_ids[MAX_LLM_PAGE_NUM];
size_t prefetch_offset;
bool completed;

fs_debug_trace_fswrapper(
"badge=0x%x, va=0x%lx\n", fault_badge, fault_va);
// printf("page fault at 0x%lx\n", fault_va);

/* Find mapping area info */
ret = fmap_area_find(fault_badge,
Expand Down Expand Up @@ -149,9 +166,42 @@ static int handle_one_fault(badge_t fault_badge, vaddr_t fault_va)
}
}

/* Map client page table, and notify fault thread */
ret = usys_user_fault_map(
fault_badge, fault_va, server_page_addr, copy, map_perm);
if (flags & MAP_LLM) {
/* LAB7 TODO BEGIN */
/* predict prefetch pages and map them in one fault */
ret = predict_prefetch_pages(area_off / PAGE_SIZE, prefetch_page_ids);
if (ret < 0) {
BUG_ON("this call should always be success here\n");
}
/* notify pending thread only when prefetch is completed */
completed = true;
prefetch_offset = prefetch_page_ids[0] * PAGE_SIZE;
server_page_addr = fs_wrapper_fmap_get_page_addr(
vnode, file_offset + prefetch_offset);
if (!server_page_addr) {
/* The file offset is out-of-range */
fs_debug_warn("vnode->size=0x%lx, offset=0x%lx\n",
vnode->size,
file_offset + prefetch_offset);
}
ret = usys_user_fault_map_batched(
fault_badge,
fault_va - area_off + prefetch_offset,
server_page_addr,
copy,
map_perm,
completed,
fault_va);
if (ret < 0) {
BUG_ON("this call should always be success here\n");
}
/* LAB7 TODO END */
}
else {
/* Map client page table, and notify fault thread */
ret = usys_user_fault_map(
fault_badge, fault_va, server_page_addr, copy, map_perm);
}
if (ret < 0) {
BUG_ON("this call should always be success here\n");
}
Expand Down
Loading