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这个地址了。