首页 > 高级民工 > android读写内存

android读写内存

2010年7月6日 发表评论 阅读评论

 前段时间由于特殊需要想修改android的property,即使用getprop与setprop命令所操作的属性。虽然提供了setprop命令,但这个命令无法修改以ro.开头的属性。android基于linux,那么读写内存就可以通过/dev/mem这个设备文件办到。下面是一个测试,用于读写ro.secure属性的值。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <unistd.h>
#include <string.h>
 
#include <sys/mman.h>
#include <sys/types.h>
 
#include "ro.h"
 
#define	MEM_DEVICE	"/dev/mem"
 
 
int main()
{
	long size=1024;
	long offset=0x13400;//physical address of "ro." ,android 2.1 on emulator
	long offset_cut;
	long page_size=getpagesize();
	prop_info *data;
 
	//offset should be a multiple of the page size 
   	offset_cut=offset%page_size;
	offset-=offset_cut;
 
	//initialize
	data=init(size+offset_cut,offset);
 
	data+=offset_cut/sizeof(prop_info);
 
	printf("prop: %s=%s\n",data->name,data->value);//read
 
	memcpy(data->value,"0",1);//write
 
	printf("prop: %s=%s\n",data->name,data->value);
 
	munmap(data, size+offset_cut);
	return 1;
}
 
prop_info *init(long size,long offset)
{
	int fd;
	prop_info *data;
 
	fd=open(MEM_DEVICE,O_RDWR);
 
	if(fd<0)
 
	{
 
		printf("open file error!\n");
 
		close(fd);
		exit(-1);
 
	}
 
 
 
	data=(prop_info *)mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
 
 
	if(data == MAP_FAILED){
		printf("map failed\n");
		close(fd);
		exit(-1);
	}
	close(fd);
	return data;
 
}

编译使用NDK,复制NDK中的例子修改后即可。ro.存放区域的内存物理地址为0×13400,测试在android 2.1 on emulator下。
虽然在模拟器中测试一切正常,但放到我的milestone中就出问题,报总线错误。
在milestone中操作/dev/mem时如命令:

cat /dev/mem /sdcard/mem

会出现错误,bad address!

不知道是因为milestone锁了一些东西,还是arm读取时所谓的对齐造成的影响。希望知道的留下答案,谢过!

源码下载:download 

分类: 高级民工 标签: , ,
  1. hackage
    2011年2月22日10:24 | #1

    这问题您解决了么

  2. 2011年2月23日11:32 | #2

    没有解决,查资料说是因为内存锁的原因,是由厂商做的。

点击刷新