Loading .gitignore 0 → 100644 +1 −0 Original line number Diff line number Diff line build/ CMakeLists.txt +12 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,18 @@ target_sources(opendevnull src/opendevnull.cpp ) # Include path from Syscall_intercept into opendevnull target_include_directories(opendevnull PRIVATE ${Syscall_intercept_INCLUDE_DIR} ) # Link libraries target_link_libraries( opendevnull Syscall_intercept::Syscall_intercept ) target_link_libraries( eval_intercept Syscall_intercept::Syscall_intercept Loading Readme.md 0 → 100644 +0 −0 Empty file added. src/opendevnull.cpp +107 −42 Original line number Diff line number Diff line #include <fcntl.h> #include <iostream> #include <cmath> #include <sys/syscall.h> #include <unistd.h> #include <libsyscall_intercept_hook_point.h> // Default number of repetitions double reps = 1000.0 * 100000.0; int repext = 1000; int repint = 100000; bool always_syscall = false; // whether to call the original syscall after the hook bool verbose = false; // whether to print debug messages int main(int argc, char *argv[]) { // Check if the correct number of arguments is provided if (argc != 3) { std::cerr << "Usage: " << argv[0] << " --syscall <open|getpid>" << std::endl; // Parse command-line arguments std::string syscall; for (int i = 1; i < argc; ++i) { std::string arg = argv[i]; if (arg == "--syscall") { if (i + 1 < argc) { syscall = argv[++i]; } else { std::cerr << "Error: --syscall requires an argument" << std::endl; return 1; } } else if (arg == "--reps") { if (i + 1 < argc) { reps = atof(argv[++i]); if (reps <= 0) { std::cerr << "Error: --reps requires a positive integer" << std::endl; return 1; } } else { std::cerr << "Error: --reps requires an argument" << std::endl; return 1; } } else if (arg == "--always_syscall") { always_syscall = true; } else if (arg == "--verbose") { verbose = true; } else { std::cerr << "Error: Unknown option '" << arg << "'" << std::endl; return 1; } } const int inner_loop_size = 1000000; // Size of the inner loop (1 million) int repext = static_cast<int>(reps / inner_loop_size); // Outer loop iterations int repint = inner_loop_size; // Inner loop iterations double remainder = std::fmod(reps, inner_loop_size); // Remaining iterations // Validate that --syscall is provided if (syscall.empty()) { std::cerr << "Error: --syscall is required" << std::endl; return 1; } // measure time to run in microseconds std::string option = argv[1]; std::string syscall = argv[2]; double reps = 1000.0*100000.0; // Handle the --syscall option if (option == "--syscall") { if (syscall == "open") { struct timespec start, end; clock_gettime(CLOCK_MONOTONIC, &start); for (int j = 0; j < 1000; j++) { for (int i = 0; i < 100000; i++) { for (int i = 0; i < repext; ++i) { for (int j = 0; j < repint; ++j) { int fd = openat(AT_FDCWD, "/dev/null", O_RDWR, 0); if (verbose) { std::cout << "open() returned " << fd << std::endl; } close(fd); } } for (int j = 0; j < remainder; ++j) { int fd = openat(AT_FDCWD, "/dev/null", O_RDWR, 0); if (verbose) { std::cout << "open() returned " << fd << std::endl; } close(fd); } clock_gettime(CLOCK_MONOTONIC, &end); double time_taken = (end.tv_sec - start.tv_sec) * 1e6 + (end.tv_nsec - start.tv_nsec) / 1e3; std::cout << "Mean time taken: " << time_taken / reps << " microseconds" << std::endl; } else if (syscall == "getpid") { } else if (syscall == "getpid") { struct timespec start, end; clock_gettime(CLOCK_MONOTONIC, &start); for (int j = 0; j < 1000; j++) { for (int i = 0; i < 100000; i++) { for (int i = 0; i < repext; ++i) { for (int j = 0; j < repint; ++j) { int ret = getpid(); if (verbose) { std::cout << "getpid() returned " << ret << std::endl; } if (always_syscall) { syscall_no_intercept(SYS_getpid); } } } for (int j = 0; j < remainder; ++j) { int ret = getpid(); if (verbose) { std::cout << "getpid() returned " << ret << std::endl; } if (always_syscall) { syscall_no_intercept(SYS_getpid); } } clock_gettime(CLOCK_MONOTONIC, &end); double time_taken = (end.tv_sec - start.tv_sec) * 1e6 + (end.tv_nsec - start.tv_nsec) / 1e3; std::cout << "Mean time taken: " << time_taken / reps << " microseconds" << std::endl; } } return 0; } Loading
CMakeLists.txt +12 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,18 @@ target_sources(opendevnull src/opendevnull.cpp ) # Include path from Syscall_intercept into opendevnull target_include_directories(opendevnull PRIVATE ${Syscall_intercept_INCLUDE_DIR} ) # Link libraries target_link_libraries( opendevnull Syscall_intercept::Syscall_intercept ) target_link_libraries( eval_intercept Syscall_intercept::Syscall_intercept Loading
src/opendevnull.cpp +107 −42 Original line number Diff line number Diff line #include <fcntl.h> #include <iostream> #include <cmath> #include <sys/syscall.h> #include <unistd.h> #include <libsyscall_intercept_hook_point.h> // Default number of repetitions double reps = 1000.0 * 100000.0; int repext = 1000; int repint = 100000; bool always_syscall = false; // whether to call the original syscall after the hook bool verbose = false; // whether to print debug messages int main(int argc, char *argv[]) { // Check if the correct number of arguments is provided if (argc != 3) { std::cerr << "Usage: " << argv[0] << " --syscall <open|getpid>" << std::endl; // Parse command-line arguments std::string syscall; for (int i = 1; i < argc; ++i) { std::string arg = argv[i]; if (arg == "--syscall") { if (i + 1 < argc) { syscall = argv[++i]; } else { std::cerr << "Error: --syscall requires an argument" << std::endl; return 1; } } else if (arg == "--reps") { if (i + 1 < argc) { reps = atof(argv[++i]); if (reps <= 0) { std::cerr << "Error: --reps requires a positive integer" << std::endl; return 1; } } else { std::cerr << "Error: --reps requires an argument" << std::endl; return 1; } } else if (arg == "--always_syscall") { always_syscall = true; } else if (arg == "--verbose") { verbose = true; } else { std::cerr << "Error: Unknown option '" << arg << "'" << std::endl; return 1; } } const int inner_loop_size = 1000000; // Size of the inner loop (1 million) int repext = static_cast<int>(reps / inner_loop_size); // Outer loop iterations int repint = inner_loop_size; // Inner loop iterations double remainder = std::fmod(reps, inner_loop_size); // Remaining iterations // Validate that --syscall is provided if (syscall.empty()) { std::cerr << "Error: --syscall is required" << std::endl; return 1; } // measure time to run in microseconds std::string option = argv[1]; std::string syscall = argv[2]; double reps = 1000.0*100000.0; // Handle the --syscall option if (option == "--syscall") { if (syscall == "open") { struct timespec start, end; clock_gettime(CLOCK_MONOTONIC, &start); for (int j = 0; j < 1000; j++) { for (int i = 0; i < 100000; i++) { for (int i = 0; i < repext; ++i) { for (int j = 0; j < repint; ++j) { int fd = openat(AT_FDCWD, "/dev/null", O_RDWR, 0); if (verbose) { std::cout << "open() returned " << fd << std::endl; } close(fd); } } for (int j = 0; j < remainder; ++j) { int fd = openat(AT_FDCWD, "/dev/null", O_RDWR, 0); if (verbose) { std::cout << "open() returned " << fd << std::endl; } close(fd); } clock_gettime(CLOCK_MONOTONIC, &end); double time_taken = (end.tv_sec - start.tv_sec) * 1e6 + (end.tv_nsec - start.tv_nsec) / 1e3; std::cout << "Mean time taken: " << time_taken / reps << " microseconds" << std::endl; } else if (syscall == "getpid") { } else if (syscall == "getpid") { struct timespec start, end; clock_gettime(CLOCK_MONOTONIC, &start); for (int j = 0; j < 1000; j++) { for (int i = 0; i < 100000; i++) { for (int i = 0; i < repext; ++i) { for (int j = 0; j < repint; ++j) { int ret = getpid(); if (verbose) { std::cout << "getpid() returned " << ret << std::endl; } if (always_syscall) { syscall_no_intercept(SYS_getpid); } } } for (int j = 0; j < remainder; ++j) { int ret = getpid(); if (verbose) { std::cout << "getpid() returned " << ret << std::endl; } if (always_syscall) { syscall_no_intercept(SYS_getpid); } } clock_gettime(CLOCK_MONOTONIC, &end); double time_taken = (end.tv_sec - start.tv_sec) * 1e6 + (end.tv_nsec - start.tv_nsec) / 1e3; std::cout << "Mean time taken: " << time_taken / reps << " microseconds" << std::endl; } } return 0; }