linuxrw

来源:互联网 发布:网络销售犯罪的特征有 编辑:程序博客网 时间:2024/06/05 00:11
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <errno.h>#include <signal.h>#include <fcntl.h>#include <ctype.h>#include <termios.h>#include <sys/types.h>#include <sys/mman.h>#include <sys/ioctl.h>#include <string.h>#define AUTHOR "smile"#define MAP_SIZE 4096UL#define MAP_MASK (MAP_SIZE - 1)int main(int argc, char **argv){    int fd;    void *map_base, *virt_addr;    unsigned int value;    unsigned int reg;    switch (argc) {    case 3:        if (strcmp(argv[1], "-r")) {            printf("usage:\nlinuxrw -r        0x10000000\nlinuxrw -w             0x10000000 0x20000000\n");            exit(-1);        }        break;    case 4:        if (strcmp(argv[1], "-w")) {            printf("usage:\nlinuxrw -r 0x10000000\nlinuxrw -w 0x10000000 0x20000000\n");            exit(-1);        }        break;    default :        printf("usage:\nlinuxrw -r 0x10000000\nlinuxrw -w 0x10000000 0x20000000\n");        exit (-1);    }    reg = strtol(argv[2], NULL, 16);    if ((fd = open("/dev/mem", O_RDWR | O_SYNC)) <0) {        perror("open");        return -1;    }    map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, reg & ~MAP_MASK);    virt_addr = map_base + (reg & MAP_MASK);    if (argc == 3) {        value = *(unsigned int *) virt_addr;        printf("reg :0x%x \nvalue:0x%x \n", reg, value);    } else if (argc ==4 ) {        value = strtol(argv[3], NULL, 16);        *(unsigned int *) virt_addr = value;        printf("reg :0x%x \nvalue: 0x%x \n", reg, *(unsigned int*)virt_addr);    }    munmap(map_base,MAP_SIZE);    close(fd);    return 0;}
0 0