【问题标题】:Printing memory address, mapping打印内存地址,映射
【发布时间】:2015-10-22 10:20:40
【问题描述】:

我正在尝试从命令行获取参数。并打开一个文件进行读/写,然后 malloc 内存以向函数 mmap 建议起始地址。但它不会打印任何地址(建议的地址和内核给定的地址),即使它正在创建文件。

#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>
#include <stdlib.h>

int main(int argc, char **argv){

  if(argc>=3){

    int fd;
    const char *fname=argv[1];
    const char *str=argv[2];


    if((fd=open(fname,O_CREAT|O_RDWR,0))!=-1){

       int *startaddress = malloc(strlen(str)*sizeof(char));
       mmap(startaddress, strlen(str)*sizeof(char), PROT_READ|PROT_WRITE,        MAP_SHARED, fd, 0);

       write(fd,str,strlen(str));

       printf("File address: %d\n",fd);
       printf("Suggested file address: %p", startaddress);
       close(fd);
       free(startaddress);
     }

   }else
   printf("You didn't enter a proper number of arguments.\n");

}

【问题讨论】:

  • 如果它没有打印任何消息,请尝试添加\n(例如printf("Suggested file address: %p\n", startaddress);或在打印后添加fflush(stdout);。否则,请检查startaddress != NULL。(ps:你应该得到输出mmap() 的其他指针——给mmap() 一个地址只是hint)
  • @865719 现在我得到了一个输出。为什么 mmap 不使用我给它的内存?
  • 作为mentioned in the manual,它是提示"如果addr 不为NULL,那么内核会将其作为提示放置映射;在 Linux 上,将在附近的页面边界处创建映射。新映射的地址作为调用的结果返回。"
  • 换句话说:你提供的地址是一个已经malloc()ated空间的开始,mmap()不能只是“使用它”。但是,mmap()尝试将数据映射到尽可能接近您提供的地址的内存块。
  • 首先,您对mmap() 的回复是什么?其次,在堆中给mmap() 一个地址,例如从malloc() 返回的地址是破坏堆的好方法——如果在该地址映射成功,它将导致实际的堆页面从进程地址取消映射空间。

标签: c malloc memory-address memory-mapping


【解决方案1】:

默认情况下,mmap 将您提供的地址作为提示,并尽可能接近地映射内存。要强制 mmap 精确分配到 startaddress,必须提供标志 MAP_FIXED。

请注意,手册不鼓励使用此选项,因为如果此地址已分配内存,则可能导致内存损坏,或者只是失败。 此外,如果地址不是getpagesize 的倍数,映射也会失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    相关资源
    最近更新 更多