#include <stdio.h> #include <stdlib.h> # include <sys/syscall.h> // syscall() , __NR_init_module #include <sys/stat.h> #include <errno.h> // ENOEXEC #include <fcntl.h> // O_RDONLY #include <sys/mman.h> // PROT_READ , MAP_PRIVATE , MAP_FAILED # define init_module(mod, len, opts) syscall(__NR_init_module, mod, len, opts) # define delete_module(mod, flags) syscall(__NR_delete_module, mod, flags) #define MPI_NAME "cc_def.ko" void moderror(int err) { switch (err) { case -1: /* btw: it's -EPERM */ printf("no such module"); return; case ENOEXEC: printf( "invalid module format"); return; case ENOENT: printf( "unknown symbol in module, or unknown parameter"); return; case ESRCH: printf("module has wrong symbol version"); return ; case ENOSYS: printf("kernel does not support requested operation"); return ; default : printf("unknown errcode"); return ; } } int main(void ) { int len; char *image; const char *options; struct stat st; int fd; int ret; //if (!options) options = ""; if ((fd = open(MPI_NAME, O_RDONLY, 0)) < 0) { printf("cannot open module `%s'", MPI_NAME); } fstat(fd, &st); len = st.st_size; printf(" size : %d",len); image = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0); if (image == MAP_FAILED) { printf("cannot mmap `%s'", MPI_NAME); } errno=0; ret= init_module(image, len, options); if (ret != 0) { printf("cannot insert "); moderror(errno); printf("\n "); } munmap(image,len); return 0; } |
|
来自: lifei_szdz > 《linux》