insmod加载模块过程

来源:互联网 发布:bp神经网络算法推导 编辑:程序博客网 时间:2024/06/06 03:53

insmod程序的源码如下:

#include <stdio.h>#include <string.h>#include <fcntl.h>#include <unistd.h>#include <malloc.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>extern int init_module(void *, unsigned long, const char *);static void *read_file(const char *filename, ssize_t *_size){int ret, fd;struct stat sb;ssize_t size;void *buffer = NULL;/* open the file */fd = open(filename, O_RDONLY);if (fd < 0)return NULL;/* find out how big it is */if (fstat(fd, &sb) < 0)goto bail;size = sb.st_size;/* allocate memory for it to be read into */buffer = malloc(size);if (!buffer)goto bail;/* slurp it into our buffer */ret = read(fd, buffer, size);if (ret != size)goto bail;/* let the caller know how big it is */*_size = size;bail:close(fd);return buffer;}#define min(x,y) ((x) < (y) ? (x) : (y))int insmod_main(int argc, char **argv){void *file;ssize_t size = 0;char opt[1024];int ret;/* make sure we've got an agrument */if (argc < 2) {fprintf(stderr, "usage: insmod <module.o>\n")return -1;}/* read the file into memory */file = read_file(argv[1], &size);if(!file) {fprintf(stderr, "insmod: can't open '%s'\n", argv[1]);return -1;}/* get the argument of init_module */opts[0] = '\0';if (argc > 2) {int i, len;char *end = opts + sizeof(opts) - 1;char *ptr = opts;for (i = 2; (i < argc) && (ptr < end); i++) {len = min(strlen(argv[i]), end - ptr);memcpy(ptr, argv[i], len);ptr += len;*ptr++ = ' ';}*(ptr - 1) = '\0';}/* pass it to kernel */ret = init_module(file, size, opts);if (ret != 0) {fprintf(stderr,"insmod: init_module '%s' failed (%s)\n",argv[1], strerror(errno));}/* free the buffer */free(file);return ret;}


0 0
原创粉丝点击