草庐IT

ios - 为什么 mmap() 使用 MAP_FAILED 而不是 NULL?

有人知道为什么mmap()返回MAP_FAILED而不是NULL吗?在大多数系统上,MAP_FAILED似乎是(void*)-1。为什么mmap()不直接使用NULL呢?我知道地址0x0在技术上是一个有效的内存页面,而(void*)-1永远不会是一个有效的页面。然而我的猜测是mmap()实际上永远不会返回页面0x0。例如,在Windows上,VirtualAlloc()在出错时返回NULL。假设mmap()永远不会返回0x0是否安全?据推测,对mmap()的成功调用应该将可用内存返回给调用者。地址0x0永远不可用,因此它永远不会在成功时返回。在这种情况下,使用0x0作为失败标记似乎是明

ios - 为什么 mmap() 使用 MAP_FAILED 而不是 NULL?

有人知道为什么mmap()返回MAP_FAILED而不是NULL吗?在大多数系统上,MAP_FAILED似乎是(void*)-1。为什么mmap()不直接使用NULL呢?我知道地址0x0在技术上是一个有效的内存页面,而(void*)-1永远不会是一个有效的页面。然而我的猜测是mmap()实际上永远不会返回页面0x0。例如,在Windows上,VirtualAlloc()在出错时返回NULL。假设mmap()永远不会返回0x0是否安全?据推测,对mmap()的成功调用应该将可用内存返回给调用者。地址0x0永远不可用,因此它永远不会在成功时返回。在这种情况下,使用0x0作为失败标记似乎是明

c - 当长度大于 4GB 时 mmap 失败

(正确的代码在“更新5”中)在此示例C代码中,我尝试映射从0x100000000到0x200000000的内存范围:#include#include#include#includeintmain(void){uint64_t*rr_addr=0;uint64_ti=17179869184;printf("\nsizeof(size_t):%llu\n",sizeof(size_t));printf("(uint64_t)0x100000000:%llx\n",(uint64_t)0x100000000);printf("1L在不同的系统(Linux、gcc)上,我得到不同的结果:结果1

c - 当长度大于 4GB 时 mmap 失败

(正确的代码在“更新5”中)在此示例C代码中,我尝试映射从0x100000000到0x200000000的内存范围:#include#include#include#includeintmain(void){uint64_t*rr_addr=0;uint64_ti=17179869184;printf("\nsizeof(size_t):%llu\n",sizeof(size_t));printf("(uint64_t)0x100000000:%llx\n",(uint64_t)0x100000000);printf("1L在不同的系统(Linux、gcc)上,我得到不同的结果:结果1

c - mmap函数中的MAP_SHARED和MAP_PRIVATE有什么区别?

为了好玩而使用mmap,我有以下代码:(..snip..)fd=open("/home/me/straight_a.txt",O_RDONLY);if(fd==-1){perror("open");exit(1);}m=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_FILE|MAP_PRIVATE,fd,0);if(m==MAP_FAILED){perror("mmap");exit(1);}printf("mis%p\n",m);printf("*m=%c\n",*m);printf("*(m+1)=%c\n",*(m+1));(..snip..)这

c - mmap函数中的MAP_SHARED和MAP_PRIVATE有什么区别?

为了好玩而使用mmap,我有以下代码:(..snip..)fd=open("/home/me/straight_a.txt",O_RDONLY);if(fd==-1){perror("open");exit(1);}m=mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_FILE|MAP_PRIVATE,fd,0);if(m==MAP_FAILED){perror("mmap");exit(1);}printf("mis%p\n",m);printf("*m=%c\n",*m);printf("*(m+1)=%c\n",*(m+1));(..snip..)这

c - 如何检测特定页面是否映射到内存中?

我想检测一个特定的页面是否已经映射到内存中。这里的目标是能够在使用固定内存地址调用mmap之前执行此检查。以下代码说明了默认情况下在这种情况下发生的情况:mmap静默地重新映射原始内存页面。#include#include#includeintmain(intargc,char*argv[]){intpage_size;void*ptr;page_size=getpagesize();ptr=mmap(0,10*page_size,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,0,0);if(ptr==MAP_FAILED){printf

c - 如何检测特定页面是否映射到内存中?

我想检测一个特定的页面是否已经映射到内存中。这里的目标是能够在使用固定内存地址调用mmap之前执行此检查。以下代码说明了默认情况下在这种情况下发生的情况:mmap静默地重新映射原始内存页面。#include#include#includeintmain(intargc,char*argv[]){intpage_size;void*ptr;page_size=getpagesize();ptr=mmap(0,10*page_size,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,0,0);if(ptr==MAP_FAILED){printf

c - mmap 与/开发/零

假设我使用/dev/zero为mmap分配了一个大内存(40MB),如下所示。fd=open("/dev/zero",O_RDWR);a=mmap(0,4096e4,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FILE,fd,0);我的理解是,当页面被带入物理内存时,内核会将内存初始化为零(我想现代Linux内核使用Demandpaging)。因此,例如,当第一页被触及并因此被带入物理内存时,内核会将其所有4096字节初始化为零,然后当第二页被触及时,它会执行相同的操作,依此类推。我的理解正确吗? 最佳答案

c - mmap 与/开发/零

假设我使用/dev/zero为mmap分配了一个大内存(40MB),如下所示。fd=open("/dev/zero",O_RDWR);a=mmap(0,4096e4,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FILE,fd,0);我的理解是,当页面被带入物理内存时,内核会将内存初始化为零(我想现代Linux内核使用Demandpaging)。因此,例如,当第一页被触及并因此被带入物理内存时,内核会将其所有4096字节初始化为零,然后当第二页被触及时,它会执行相同的操作,依此类推。我的理解正确吗? 最佳答案