当前位置: 技术问答>linux和unix
谁有关于函数mmap()方面的用法实例或者文章?
来源: 互联网 发布时间:2015-07-07
本文导语: 最好是中文的 谢谢 | mmap是一个重要的系统调用,它允许为不同目的而设置专用的独享内存区域。该内存可能是一个文件或其它特别对象的代理,在这种情形中,内核将保持内存区域和潜在对...
最好是中文的
谢谢
谢谢
|
mmap是一个重要的系统调用,它允许为不同目的而设置专用的独享内存区域。该内存可能是一个文件或其它特别对象的代理,在这种情形中,内核将保持内存区域和潜在对象的一致,或者该内存可能是为一个应用程序所需要的简单的无格式内存。(应用程序通常不使用mmap来分配无格式内存区,因为此时malloc更符合其目的。)
mmap最普遍的使用方法之一是为内核本身通过内存映射(memory-map)形成一个可执行文件(参见8323行的一个例子)。这是关于二进制处理程序如何同分页机制协同工作以提供所需要分页的可执行体,这正如本章早些时候所暗示的。可执行体通过mmap被映射为进程内存空间中的适当区域,然后do_page_fault函数调入执行体所需的剩余页面。
被mmap分配的内存可能被标识为可执行,其中充满了指令代码,随后系统跳入其中开始执行;这正是Java Just-In-Time(JIT)编译器的工作方式。更简单的说,可执行文件能够被直接映射成一个正在运行的进程的内存空间;这项技术用于动态连接库的执行中。
执行mmap功能的内核函数是do_ mmap。
mmap最普遍的使用方法之一是为内核本身通过内存映射(memory-map)形成一个可执行文件(参见8323行的一个例子)。这是关于二进制处理程序如何同分页机制协同工作以提供所需要分页的可执行体,这正如本章早些时候所暗示的。可执行体通过mmap被映射为进程内存空间中的适当区域,然后do_page_fault函数调入执行体所需的剩余页面。
被mmap分配的内存可能被标识为可执行,其中充满了指令代码,随后系统跳入其中开始执行;这正是Java Just-In-Time(JIT)编译器的工作方式。更简单的说,可执行文件能够被直接映射成一个正在运行的进程的内存空间;这项技术用于动态连接库的执行中。
执行mmap功能的内核函数是do_ mmap。
|
我在使用mmap是遇到这样的问题,我把一个文本文件映射到内存中,再将它写入到另一个文件中,不过这文件里含有二进制数据,后来发觉被写入文件只写了几个字节,不知是否和二进制数据有关,调试结果如下,望高手指点,不
269 if((tmp = mmap(0, len, PROT_READ, MAP_SHARED, fd, SyslogOff)) == (void *) -1)
(gdb) n
275 fp = fopen(TEMPPATH,"w+");
(gdb) n
276 if(fp == NULL)
(gdb) n
282 fprintf(fp, "%s", tmp);
(gdb) n
283 fclose(fp);
(gdb) n
285 close(fd);
(gdb) display tmp
1: tmp = 0x40156000 "201Q01"
(gdb) display len
2: len = 2430000
(gdb) display SyslogOff
3: SyslogOff = 0
269 if((tmp = mmap(0, len, PROT_READ, MAP_SHARED, fd, SyslogOff)) == (void *) -1)
(gdb) n
275 fp = fopen(TEMPPATH,"w+");
(gdb) n
276 if(fp == NULL)
(gdb) n
282 fprintf(fp, "%s", tmp);
(gdb) n
283 fclose(fp);
(gdb) n
285 close(fd);
(gdb) display tmp
1: tmp = 0x40156000 "201Q01"
(gdb) display len
2: len = 2430000
(gdb) display SyslogOff
3: SyslogOff = 0