本文共 4164 字,大约阅读时间需要 13 分钟。
Linux内核里提供的/dev/mem驱动,为我们读写内存物理地址,提供了一个渠道。下面讲述2种利用mem设备文件进行物理地址读写的方法,一种是设备驱动的方法,另一种是系统调用的方法。
首先我们看下mem这个设备文件,/dev/mem是linux下的一个字符设备,源文件是~/drivers/char/mem.c,这个设备文件是专门用来读写物理地址用的。里面的内容是所有物理内存的地址以及内容信息。通常只有root用户对其有读写权限。 1.设备驱动的方法 下面是mem.c文件里定义的file_operations结构,提供了llseek,read,write,mmap以及open等方法。static struct file_operations mem_fops = { .llseek = memory_lseek, .read = read_mem, .write = write_mem, .mmap = mmap_mem, .open = open_mem, };
#include <stdio.h> #include <fcntl.h> int main(void) { int fd; char *rdbuf; char *wrbuf = "butterfly"; int i; fd = open("/dev/mem",O_RDWR); if(fd < 0) { printf("open /dev/mem failed."); } read(fd,rdbuf,10); for(i = 0;i < 10;i++) { printf("old mem[%d]:%c\n",i,*(rdbuf + i)); } lseek(fd,5,0); write(fd,wrbuf,10); lseek(fd,0,0);//move f_ops to the front read(fd,rdbuf,10); for(i = 0;i < 10;i++) { printf("new mem[%d]:%c\n",i,*(rdbuf + i)); } return 0; }
[root@VOIP-IPCAM app]# ./memtest old mem[0]:b old mem[1]:u old mem[2]:t old mem[3]:t old mem[4]:e old mem[5]:r old mem[6]:f old mem[7]:l old mem[8]:y old mem[9]:! new mem[0]:b new mem[1]:u new mem[2]:t new mem[3]:t new mem[4]:e new mem[5]:b new mem[6]:u new mem[7]:t new mem[8]:t new mem[9]:e
00000000 62 75 74 74 65 62 75 74 74 65 72 66 6C 79 21 20 butterfly! 00000010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00000020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 00000030 6F EF 00 F0 6F EF 00 F0 57 EF 00 F0 6F EF 00 F0 o...o...W...o... 00000040 02 11 00 C0 4D F8 00 F0 41 F8 00 F0 34 85 00 F0 ....M...A...4... 00000050 39 E7 00 F0 59 F8 00 F0 2E E8 00 F0 D2 EF 00 F0 9...Y........... 00000060 A4 E7 00 F0 F2 E6 00 F0 6E FE 00 F0 53 FF 00 F0 ........n...S... 00000070 53 FF 00 F0 A4 F0 00 F0 C7 EF 00 F0 1C 42 00 C0 S............B..
#include <stdio.h> #include <fcntl.h> #include <sys/mman.h>//mmap head file int main (void) { int i; int fd; char *start; char *buf = "butterfly!"; //open /dev/mem with read and write mode fd = open ("/dev/mem", O_RDWR); if (fd < 0) { printf("cannot open /dev/mem."); return -1; } //map physical memory 0-10 bytes start = (char *)mmap(0, 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(start < 0) { printf("mmap failed."); return -1; } //Read old value for (i = 0; i < 10; i++) { printf("old mem[%d]:%c\n", i, *(start + i)); } //write memory memcpy(start, buf, 10); //Read new value for (i = 0;i < 10;i++) { printf("new mem[%d]:%c\n", i,*(start + i)); } munmap(start, 10); //destroy map memory close(fd); //close file return 0; }
[root@VOIP-IPCAM app]# ./rwphy old mem[0]:b old mem[1]:u old mem[2]:t old mem[3]:t old mem[4]:e old mem[5]:b old mem[6]:u old mem[7]:t old mem[8]:t old mem[9]:e new mem[0]:b new mem[1]:u new mem[2]:t new mem[3]:t new mem[4]:e new mem[5]:r new mem[6]:f new mem[7]:l new mem[8]:y new mem[9]:!
转载地址:http://pebmb.baihongyu.com/