PatchworkOS  3984a1d
A non-POSIX operating system.
Loading...
Searching...
No Matches
main.c
Go to the documentation of this file.
1#include <stdint.h>
2#include <stdio.h>
3#include <stdlib.h>
4#include <time.h>
5
6#define MMAP_ITER 10000
7#define GETPID_ITER 100000
8
9#ifdef _PATCHWORK_OS_
10#include <sys/io.h>
11#include <sys/proc.h>
12
13static fd_t zeroDev;
14
15static void init_generic()
16{
17 zeroDev = open("/dev/const/zero");
18 if (zeroDev == ERR)
19 {
20 perror("Failed to open /dev/const/zero");
21 abort();
22 }
23}
24
25static void* mmap_generic(size_t length)
26{
27 void* ptr = mmap(zeroDev, NULL, length, PROT_READ | PROT_WRITE);
28 if (ptr == NULL)
29 {
30 return NULL;
31 }
32 return ptr;
33}
34
35static uint64_t munmap_generic(void* addr, size_t length)
36{
37 return munmap(addr, length) == NULL ? ERR : 0;
38}
39
40static void benchmark_getpid(void)
41{
43
44 for (uint64_t i = 0; i < GETPID_ITER; i++)
45 {
46 getpid();
47 }
48
49 clock_t end = clock();
50 printf("getpid: %llums\n", (end - start) / (CLOCKS_PER_SEC / 1000));
51
53
54 for (uint64_t i = 0; i < GETPID_ITER; i++)
55 {
56 readfile("/proc/self/pid", NULL, 0, 0);
57 }
58
60 printf("/proc/self/pid: %llums\n", (procEnd - procStart) / (CLOCKS_PER_SEC / 1000));
61
62 printf("overhead: %lluns\n", ((procEnd - procStart) - (end - start)) / GETPID_ITER);
63}
64
65#else
66
67#include <fcntl.h>
68#include <sys/mman.h>
69#include <unistd.h>
70#define ERR ((uint64_t)-1)
71
72static void init_generic()
73{
74 // Nothing to do
75}
76
77static void* mmap_generic(size_t length)
78{
79 void* ptr = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
80 if (ptr == MAP_FAILED)
81 {
82 return NULL;
83 }
84 return ptr;
85}
86
87static uint64_t munmap_generic(void* addr, size_t length)
88{
89 return munmap(addr, length) == -1 ? ERR : 0;
90}
91
92#endif
93
94static void benchmark_mmap(uint64_t pages)
95{
97
98 for (uint64_t i = 0; i < MMAP_ITER; i++)
99 {
100 void* ptr = mmap_generic(pages * 0x1000);
101 if (ptr == NULL)
102 {
103 perror("mmap failed");
104 return;
105 }
106
107 for (uint64_t j = 0; j < pages; j++)
108 {
109 ((uint8_t*)ptr)[j * 0x1000] = 0;
110 }
111
112 if (munmap_generic(ptr, pages * 0x1000) != 0)
113 {
114 perror("munmap failed");
115 return;
116 }
117 }
118
119 clock_t end = clock();
120 printf("mmap pages=%llu bytes: %llums\n", pages, (end - start) / (CLOCKS_PER_SEC / 1000));
121}
122
123int main()
124{
125 init_generic();
126
127#ifdef _PATCHWORK_OS_
129#endif
130
132 for (uint64_t i = 50; i <= 1500; i += 50)
133 {
135 }
136
137 return 0;
138}
int main(void)
Definition main.c:5
int64_t y
Definition main.c:153
static void start()
Definition main.c:542
#define CLOCKS_PER_SEC
Definition clock_t.h:15
fd_t open(const char *path)
System call for opening files.
Definition open.c:8
size_t readfile(const char *path, void *buffer, size_t count, size_t offset)
Wrapper for reading a file directly using a path.
Definition readfile.c:3
void * mmap(fd_t fd, void *address, size_t length, prot_t prot)
System call to map memory from a file.
Definition mmap.c:6
pid_t getpid(void)
System call to retrieve the current pid.
Definition getpid.c:6
void * munmap(void *address, size_t length)
System call to unmap mapped memory.
Definition munmap.c:6
@ PROT_READ
Readable memory.
Definition proc.h:128
@ PROT_WRITE
Writable memory.
Definition proc.h:129
#define NULL
Pointer error value.
Definition NULL.h:23
#define ERR
Integer error value.
Definition ERR.h:17
__UINT64_TYPE__ fd_t
A file descriptor.
Definition fd_t.h:12
__UINT64_TYPE__ clock_t
A nanosecond time.
Definition clock_t.h:13
static fd_t zeroDev
Definition heap.c:37
static void init_generic()
Definition main.c:72
#define MMAP_ITER
Definition main.c:6
static uint64_t munmap_generic(void *addr, size_t length)
Definition main.c:87
static void benchmark_mmap(uint64_t pages)
Definition main.c:94
static void * mmap_generic(size_t length)
Definition main.c:77
#define GETPID_ITER
Definition main.c:7
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
__UINT8_TYPE__ uint8_t
Definition stdint.h:11
_PUBLIC int printf(const char *_RESTRICT format,...)
Definition printf.c:3
_PUBLIC void perror(const char *s)
Definition perror.c:5
_PUBLIC _NORETURN void abort(void)
Definition abort.c:9
_PUBLIC clock_t clock(void)
Definition clock.c:5