Files are represented with struct file
[akaros.git] / kern / include / mm.h
1 /*
2  * Copyright (c) 2009 The Regents of the University of California
3  * Barret Rhoden <brho@cs.berkeley.edu>
4  * See LICENSE for details.
5  *
6  * Memory management for processes: syscall related functions, virtual memory
7  * regions, etc.
8  */
9
10 #ifndef ROS_KERN_MM_H
11 #define ROS_KERN_MM_H
12
13 #include <ros/common.h>
14 #include <process.h>
15 #include <atomic.h>
16 #include <sys/queue.h>
17
18 /* Memory region for a process, consisting of linear(virtual) addresses.  This
19  * is what the kernel allocates a process, and the physical mapping can be done
20  * lazily (or not).  This way, if a page is swapped out, and the PTE says it
21  * isn't present, we still have a way to account for how the whole region ought
22  * to be dealt with.
23  * Some things are per-region:
24  * - probably something with shared memory
25  * - mmaping files: we can have a logical connection to something other than
26  *   anonymous memory
27  * - on a fault, was this memory supposed to be there? (swap, lazy, etc), or is
28  *   the region free?
29  * Others are per-page:
30  * - was this page supposed to be protected somehow(guard)? could be per-region
31  * - where is this page in the swap?
32  * If we try to store this info in the PTE, we only have 31 bits, and it's more
33  * arch dependent.  Handling jumbos is a pain.  And it's replicated across all
34  * pages for a coarse granularity things.  And we can't add things easily.
35  *
36  * so a process has a (sorted) list of these for it's VA space, hanging off it's
37  * struct proc.  or off it's mm?
38  * - we don't share an mm between processes anymore (tasks/threads)
39  *   - though we share most everything with vpm.
40  *   - want to be able to do all the same things with vpm as with regular mem
41  *     (file back mmap, etc)
42  *   - contexts or whatever share lots of mem things, like accounting, limits,
43  *   overall process stuff, the rest of the page tables.
44  *      - so there should be some overall mm, and probably directly in the
45  *      struct proc (or just one other struct directly embedded, not a pointer
46  *      to one where a bunch of processes use it)
47  *              - if we embed, mm.h doesn't need to know about process.h
48  *   so an mm can have a bunch of "address spaces" - or at least different
49  *   contexts
50  *
51  * how does this change or where does this belong with virtual private memory?
52  * will also affect get_free_va_range
53  *      - also, do we want a separate brk per?  or just support mmap on private mem?
54  */
55 struct vm_region {
56         TAILQ_ENTRY(vm_region) link; // actually, i'd like a sorted tree of these
57         uintptr_t base;
58         size_t len;
59         int perm;
60 };
61 TAILQ_HEAD(vm_region_list, vm_region); // Declares 'struct memregion_list'
62
63 struct mm {
64         spinlock_t mm_lock;
65         // per-process memory management stuff
66         // cr3(s), accounting, possibly handler methods for certain types of faults
67         // lists of vm_regions for all contexts
68         // base cr3 for all contexts
69         // previous brk, last checked vm_region
70
71 };
72 // would rather this be a mm struct
73 void *mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
74            int fd, size_t offset);
75 struct file;
76 void *do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
77              struct file* f, size_t offset);
78 int mprotect(struct proc* p, void* addr, size_t len, int prot);
79 int munmap(struct proc* p, void* addr, size_t len);
80
81 int handle_page_fault(struct proc* p, uintptr_t va, int prot);
82
83 #endif // !ROS_KERN_MM_H