栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何知道写时复制页面是否为实际副本?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何知道写时复制页面是否为实际副本?

好的,按照MarkR的建议,我试了一下它来浏览pagemap和kpageflags界面。在一项快速测试下面,以检查页面是否在被调用时在内存中“SWAPBACKED”。当然,仍然存在一个问题,即kpageflags仅可由根访问的问题。

int main(int argc, char* argv[]){  unsigned long long pagesize=getpagesize();  assert(pagesize>0);  int pagecount=4;  int filesize=pagesize*pagecount;  int fd=open("test.dat", O_RDWR);  if (fd<=0)    {      fd=open("test.dat", O_CREAT|O_RDWR,S_IRUSR|S_IWUSR);      printf("Created test.dat testfilen");    }  assert(fd);  int err=ftruncate(fd,filesize);  assert(!err);  char* M=(char*)mmap(NULL, filesize, PROT_READ|PROT_WRITE, MAP_PRIVATE,fd,0);  assert(M!=(char*)-1);  assert(M);  printf("Successfully create private mappingn");

测试设置包含4页。第0页和第2页脏了

  strcpy(M,"I feel so dirtyn");  strcpy(M+pagesize*2,"Christ on crutchesn");

已读取第3页。

  char t=M[pagesize*3];

第1页将无法访问

页面映射文件将进程的虚拟内存映射到实际页面,然后可以从全局kpageflags文件中检索该页面。
读取文件/usr/src/linux/documentation/vm/pagemap.txt

  int mapfd=open("/proc/self/pagemap",O_RDONLY);  assert(mapfd>0);  unsigned long long target=((unsigned long)(void*)M)/pagesize;  err=lseek64(mapfd, target*8, SEEK_SET);  assert(err==target*8);  assert(sizeof(long long)==8);

在这里,我们读取了每个虚拟页面的页面框架编号

  unsigned long long page2pfn[pagecount];  err=read(mapfd,page2pfn,sizeof(long long)*pagecount);  if (err<0)    perror("Reading pagemap");  if(err!=pagecount*8)    printf("Could only read %d bytesn",err);

现在我们将为每个虚拟帧读取实际的页面标志

  int pageflags=open("/proc/kpageflags",O_RDONLY);  assert(pageflags>0);  for(int i = 0 ; i < pagecount; i++)    {      unsigned long long v2a=page2pfn[i];      printf("Page: %d, flag %llxn",i,page2pfn[i]);      if(v2a&0x8000000000000000LL) // Is the virtual page present ?        {        unsigned long long pfn=v2a&0x3fffffffffffffLL;        err=lseek64(pageflags,pfn*8,SEEK_SET);        assert(err==pfn*8);        unsigned long long pf;        err=read(pageflags,&pf,8);        assert(err==8);        printf("pageflags are %llx with SWAPBACKED: %dn",pf,(pf>>14)&1);        }    }}

总而言之,我对这种方法并不特别满意,因为它需要访问我们通常无法访问的文件,而且它非常复杂(简单的内核调用来检索pageflags怎么样?)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/387299.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号