Skip to content

Commit b47a4a4

Browse files
committed
Add solution for exercise 2.9.1 (free memory)
1 parent 8ec8226 commit b47a4a4

7 files changed

Lines changed: 34 additions & 0 deletions

File tree

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ UPROGS=\
132132
$U/_grind\
133133
$U/_wc\
134134
$U/_zombie\
135+
$U/_mfree\
135136

136137
fs.img: mkfs/mkfs README $(UPROGS)
137138
mkfs/mkfs fs.img README $(UPROGS)

kernel/kalloc.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,20 @@ kalloc(void)
8080
memset((char*)r, 5, PGSIZE); // fill with junk
8181
return (void*)r;
8282
}
83+
84+
uint64
85+
sys_mfree(void)
86+
{
87+
int free = 0;
88+
struct run *r;
89+
90+
// Iterate through the freelist and count free pages.
91+
acquire(&kmem.lock);
92+
for(r = kmem.freelist; r != 0; r = r->next) {
93+
free++;
94+
}
95+
release(&kmem.lock);
96+
97+
// Return the number of bytes of all free pages.
98+
return free * PGSIZE;
99+
}

kernel/syscall.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ extern uint64 sys_unlink(void);
104104
extern uint64 sys_wait(void);
105105
extern uint64 sys_write(void);
106106
extern uint64 sys_uptime(void);
107+
extern uint64 sys_mfree(void);
107108

108109
static uint64 (*syscalls[])(void) = {
109110
[SYS_fork] sys_fork,
@@ -127,6 +128,7 @@ static uint64 (*syscalls[])(void) = {
127128
[SYS_link] sys_link,
128129
[SYS_mkdir] sys_mkdir,
129130
[SYS_close] sys_close,
131+
[SYS_mfree] sys_mfree,
130132
};
131133

132134
void

kernel/syscall.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@
2020
#define SYS_link 19
2121
#define SYS_mkdir 20
2222
#define SYS_close 21
23+
#define SYS_mfree 22

user/mfree.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include "kernel/types.h"
2+
#include "kernel/stat.h"
3+
#include "user/user.h"
4+
5+
int
6+
main(int argc, char *argv[])
7+
{
8+
printf("%d\n", mfree());
9+
10+
exit(0);
11+
}

user/user.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ int getpid(void);
2323
char* sbrk(int);
2424
int sleep(int);
2525
int uptime(void);
26+
int mfree(void);
2627

2728
// ulib.c
2829
int stat(const char*, struct stat*);

user/usys.pl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,4 @@ sub entry {
3636
entry("sbrk");
3737
entry("sleep");
3838
entry("uptime");
39+
entry("mfree");

0 commit comments

Comments
 (0)