summaryrefslogtreecommitdiff
path: root/user
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-04-28 13:21:58 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-28 13:21:58 -0400
commit3ff27507ccbffba7adf09b2322271606717a9164 (patch)
treed5bebb27d3bd906ad25cd9687ba0ac28e556e33a /user
parentallocate vaddrs when given directly (diff)
downloadcomus-3ff27507ccbffba7adf09b2322271606717a9164.tar.gz
comus-3ff27507ccbffba7adf09b2322271606717a9164.tar.bz2
comus-3ff27507ccbffba7adf09b2322271606717a9164.zip
heap (brk / sbrk)
Diffstat (limited to 'user')
-rw-r--r--user/heap.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/user/heap.c b/user/heap.c
new file mode 100644
index 0000000..ffa107b
--- /dev/null
+++ b/user/heap.c
@@ -0,0 +1,46 @@
+
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+
+#define PAGE_SIZE 4096
+
+int main(void)
+{
+ void *start, *brk;
+
+ start = sbrk(0);
+ printf("heap start: %p\n", start);
+
+ // test extending
+ if (sbrk(PAGE_SIZE) == NULL) {
+ fprintf(stderr, "failed to extend break\n");
+ return 1;
+ }
+
+ brk = sbrk(0);
+ printf("new break: %p\n", brk);
+
+ // test reextending
+ if (sbrk(PAGE_SIZE) == NULL) {
+ fprintf(stderr, "failed to extend break\n");
+ return 1;
+ }
+
+ brk = sbrk(0);
+ printf("new new break: %p\n", brk);
+
+ // test shrinking
+ if (sbrk(-PAGE_SIZE) == NULL) {
+ fprintf(stderr, "failed to shrink break\n");
+ return 1;
+ }
+
+ brk = sbrk(0);
+ printf("new new new break: %p\n", brk);
+
+ // test write
+ memset(start, 1, PAGE_SIZE);
+
+ return 0;
+}