From 3f164c6b828e0c889f862875e999fb7fc919a511 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Fri, 29 Sep 2023 18:59:37 +0300 Subject: [PATCH] Userspace: Implement basic test for MAP_SHARED --- userspace/CMakeLists.txt | 1 + userspace/mmap-shared-test/CMakeLists.txt | 17 ++++ userspace/mmap-shared-test/main.cpp | 115 ++++++++++++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 userspace/mmap-shared-test/CMakeLists.txt create mode 100644 userspace/mmap-shared-test/main.cpp diff --git a/userspace/CMakeLists.txt b/userspace/CMakeLists.txt index 3b4577391..aaedf8a38 100644 --- a/userspace/CMakeLists.txt +++ b/userspace/CMakeLists.txt @@ -10,6 +10,7 @@ set(USERSPACE_PROJECTS id init ls + mmap-shared-test poweroff Shell snake diff --git a/userspace/mmap-shared-test/CMakeLists.txt b/userspace/mmap-shared-test/CMakeLists.txt new file mode 100644 index 000000000..b44dabf96 --- /dev/null +++ b/userspace/mmap-shared-test/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.26) + +project(mmap-shared-test CXX) + +set(SOURCES + main.cpp +) + +add_executable(mmap-shared-test ${SOURCES}) +target_compile_options(mmap-shared-test PUBLIC -O2 -g) +target_link_libraries(mmap-shared-test PUBLIC libc) + +add_custom_target(mmap-shared-test-install + COMMAND sudo cp ${CMAKE_CURRENT_BINARY_DIR}/mmap-shared-test ${BANAN_BIN}/ + DEPENDS mmap-shared-test + USES_TERMINAL +) diff --git a/userspace/mmap-shared-test/main.cpp b/userspace/mmap-shared-test/main.cpp new file mode 100644 index 000000000..87db51fcb --- /dev/null +++ b/userspace/mmap-shared-test/main.cpp @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include +#include +#include + +#define FILE_NAME "test-file" +#define FILE_SIZE (1024*1024) + +int prepare_file() +{ + int fd = open(FILE_NAME, O_RDWR | O_TRUNC | O_CREAT, 0666); + if (fd == -1) + { + perror("open"); + return 1; + } + + void* null_buffer = malloc(FILE_SIZE); + memset(null_buffer, 0x00, FILE_SIZE); + + if (write(fd, null_buffer, FILE_SIZE) == -1) + { + perror("write"); + return 1; + } + + free(null_buffer); + close(fd); + + printf("file created\n"); + + return 0; +} + +int job1() +{ + int fd = open(FILE_NAME, O_RDONLY); + if (fd == -1) + { + perror("open"); + return 1; + } + + void* addr = mmap(nullptr, FILE_SIZE, PROT_READ, MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) + { + perror("mmap"); + return 1; + } + + sleep(4); + + size_t sum = 0; + for (int i = 0; i < FILE_SIZE; i++) + sum += ((uint8_t*)addr)[i]; + + munmap(addr, FILE_SIZE); + close(fd); + + printf("sum: %zu\n", sum); + + return 0; +} + +int job2() +{ + sleep(2); + + int fd = open(FILE_NAME, O_RDWR); + if (fd == -1) + { + perror("open"); + return 1; + } + + void* addr = mmap(nullptr, FILE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) + { + perror("mmap"); + return 1; + } + + memset(addr, 'a', FILE_SIZE); + + munmap(addr, FILE_SIZE); + close(fd); + + printf("expecting: %zu\n", (size_t)'a' * FILE_SIZE); + + return 0; +} + +int main() +{ + if (int ret = prepare_file()) + return ret; + + pid_t pid = fork(); + if (pid == 0) + return job1(); + + if (pid == -1) + { + perror("fork"); + return 1; + } + + int ret = job2(); + waitpid(pid, nullptr, 0); + + return ret; +}