diff options
author | Mole Shang <[email protected]> | 2024-02-19 21:51:26 +0800 |
---|---|---|
committer | Mole Shang <[email protected]> | 2024-02-19 22:13:01 +0800 |
commit | 09ba9112386d5d59d7f2a31c469768c582acb939 (patch) | |
tree | b1dce737cdd94164e8d7f3f651ea7a86a22a42f3 /kernel/file.c | |
parent | d86118fc80267649b4791c8c0c72ebd60edf1ef2 (diff) | |
download | xv6-labs-09ba9112386d5d59d7f2a31c469768c582acb939.tar.gz xv6-labs-09ba9112386d5d59d7f2a31c469768c582acb939.tar.bz2 xv6-labs-09ba9112386d5d59d7f2a31c469768c582acb939.zip |
lab mmap: finish
Diffstat (limited to 'kernel/file.c')
-rw-r--r-- | kernel/file.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/kernel/file.c b/kernel/file.c index 0fba21b..add6575 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -6,6 +6,7 @@ #include "riscv.h" #include "defs.h" #include "param.h" +#include "fcntl.h" #include "fs.h" #include "spinlock.h" #include "sleeplock.h" @@ -197,3 +198,33 @@ filewrite(struct file *f, uint64 addr, int n) return ret; } +int fileperm(struct file* f) +{ + int flags = 0; + if(f->writable) + flags |= PROT_WRITE; + if(f->readable) + flags |= PROT_READ; + return flags; +} + +// reads file from disk to physical address, needed by mmap +int mmap_read(struct file *file, uint64 pa, uint64 off, int size) { + int n = 0; + ilock(file->ip); + n = readi(file->ip, 0, pa, off, size); + off += n; + iunlock(file->ip); + return off; +} + +// writes from virtual address to disk, needed by munmap +int munmap_write(struct file *file, uint64 va, uint64 off, int size) { + int r; + begin_op(); + ilock(file->ip); + r = writei(file->ip, 1, va, off, size); + iunlock(file->ip); + end_op(); + return r; +} |