当前位置: 技术问答>linux和unix
linux下,如何在内存指定位置定一个结构体对象。
来源: 互联网 发布时间:2016-02-10
本文导语: 如题。谢谢 | Linux是多任务的操作系统,内存的使用是受到操作系统内核保护的,用户程序使用的地址是虚地址,所以 不能指定一个地址,直接使用这块内存,容易产生非法内存操作,出现段...
如题。谢谢
|
Linux是多任务的操作系统,内存的使用是受到操作系统内核保护的,用户程序使用的地址是虚地址,所以
不能指定一个地址,直接使用这块内存,容易产生非法内存操作,出现段错误。
如果你写的程序是内核模块的话,可以直接使用内存,首先要保证这个地址没有其他的模块使用。
可以这样写:
unsigned char * padd = 0xxxxxxx;
然后声明一个自己的结构体指针:
struct xxx *px;
px = (struct xxx *)padd;
就可以直接使用0XXXXXXX这个地址了。
不能指定一个地址,直接使用这块内存,容易产生非法内存操作,出现段错误。
如果你写的程序是内核模块的话,可以直接使用内存,首先要保证这个地址没有其他的模块使用。
可以这样写:
unsigned char * padd = 0xxxxxxx;
然后声明一个自己的结构体指针:
struct xxx *px;
px = (struct xxx *)padd;
就可以直接使用0XXXXXXX这个地址了。
|
定义函数
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,%xn",mapped,pos);
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,%xn",mapped,pos);
|
通常情况下,mmap映射的区域在进程虚拟地址空间的堆区。