diff options
Diffstat (limited to 'testcase/hptest.c')
| -rw-r--r-- | testcase/hptest.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/testcase/hptest.c b/testcase/hptest.c new file mode 100644 index 0000000..ab2f0a8 --- /dev/null +++ b/testcase/hptest.c @@ -0,0 +1,62 @@ +#include "../user/monitor_user.h" +#include <fcntl.h> +#include <stdio.h> +#include <sys/mman.h> +#include <unistd.h> + +#define HUGEPAGE_SIZE (1024 * 1024 * 1024) // Huge Page 大小为 1GB + +int main() { + int fd; + void *addr; + watch_arg w_arg = {0}; + + // 打开一个 hugetlbfs 文件 + fd = open("/run/mrzcpd/huge_pages/hugepagefile", O_CREAT | O_RDWR, 0755); + if (fd < 0) { + perror("open"); + return 1; + } + + // 映射 Huge Page 内存 + addr = mmap(0, HUGEPAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + close(fd); + return 1; + } + + // 大页内存 int 类型变量, for ++ + int *p = (int *)addr; + *p = 0; + + w_arg = (watch_arg){ + .task_id = getpid(), + .ptr = p, + .name = "hptest", + .length_byte = sizeof(int), + .threshold = 20, + .unsigned_flag = 0, + .greater_flag = 1, + .time_ns = 2000, // on hyper-v, 1us will block all system. 2us just fine, maybe 1us is too short for hyper-v + }; + start_watch(w_arg); + + for (int i = 0; i < 100; i++) + { + (*p)++; + printf("p = %d\n", *p); + sleep(1); + } + + // 释放 Huge Page 内存 + if (munmap(addr, HUGEPAGE_SIZE) == -1) { + perror("munmap"); + close(fd); + return 1; + } + + close(fd); + + return 0; +}
\ No newline at end of file |
