日期:2014-05-16  浏览次数:20696 次

linux下,如何在内存指定位置定一个结构体对象。
如题。谢谢

------解决方案--------------------
定义函数
void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);
函数说明
mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。参数start指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,对应成功后该地址会返回。参数length代表将文件中多大的部分对应到内存。

不过有一点要注意,start要在在字节对齐的开始的位置.

long pos=0xb7fd7001;
pos=pos-(pos%getpagesize());
mapped=(char *)mmap((void*)pos,1024, PROT_READ | PROT_WRITE, MAP_SHARED, outfile,0);
printf("%x,%x\n",mapped,pos);

------解决方案--------------------
通常情况下,mmap映射的区域在进程虚拟地址空间的堆区。
------解决方案--------------------
Linux是多任务的操作系统,内存的使用是受到操作系统内核保护的,用户程序使用的地址是虚地址,所以
不能指定一个地址,直接使用这块内存,容易产生非法内存操作,出现段错误。
如果你写的程序是内核模块的话,可以直接使用内存,首先要保证这个地址没有其他的模块使用。
可以这样写:
unsigned char * padd = 0xxxxxxx;
然后声明一个自己的结构体指针:
struct xxx *px;
px = (struct xxx *)padd;
就可以直接使用0XXXXXXX这个地址了。