參考資訊:
https://github.com/pasce/daemon-skeleton-linux-c
main.c
#include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/stat.h> #include <SDL.h> int cpu_42(int v) { return 4 * v; } int cpu_speedx(int v) { return 2 * v; } int main(int argc, char **argv) { int n = 100; unsigned int s = 0; unsigned int t1 = 0; unsigned int t2 = 0; const int msize = 1024; void *icache = NULL; int (*code)(int) = NULL; int fd = open("/dev/mem", O_RDWR); printf("fd %d\n", fd); icache = mmap(NULL, msize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE, fd, 0); printf("icache %p\n", icache); code = icache; memcpy(icache, cpu_42, 64); s = code(n); printf("cpu_42 %d\n", s); memset(icache, 0, msize); memcpy(icache, cpu_speedx, 64); t1 = SDL_GetTicks(); s = code(n); t2 = SDL_GetTicks(); printf("cpu_speedx %d (%dms)\n", s, t2 - t1); munmap(icache, msize); close(fd); return 0; }
執行
$ gcc main.c -o test -I/usr/include/SDL -lSDL $ sudo ./test fd 3 icache 0x7fbafdffd000 cpu_42 400 cpu_speedx 200 (0ms)