???????????????????棨??????棩??????????????????е???????棨??????棩????????н????????????????????????4GB????????棬????????????????????????е???????棬??Щ????????????????????????????????????????????Ч??Χ????????????????????????????????Ч????????????????y??????????δ????????

??????????????????????????????????????????????struct mm_struct?????????????????????????????????????fork????????copy_mm????????????????????????????current->mm???????????????????е?mm_struct??????????????allocate_mm???mm_cachep_slab?????з???????????????CLONE_VM??????????????????allocate_mm????????????????????copy_mm?????н?mm??????丸????????????????

?????????????????????

????????????н???????????????????????????????????????????????????????????????????????????棬???????????????????????????????????????????????????????????????????????????Щ???????????????????????????????????????????????棬?????????????????????????????????????????????????????????????к??????????????????Щ????????????????????????

?????????????struct vm_area_struct????????????linux????У??????????????????????VMAs?????????????????????????????????????????????????λ????[vm_start??vm_end]?????struct vm_area_struct?У??????и?flags??????????VMA????????????????????????VMA?????????????????????????????????????????????????????VMA?????????????????????????open??close??fault??page_mkwrite??access??????

????????????????????????????????

?????????????????????????С???????????????????????????????????????е??κ????????????·??????????????????????????????????????????壬????????????????????????????????O??log??n?????????????????????????????????????????????????ж?λ????????????????????????????????????????????????????????????ú???????????????????????

????????????????????

?????????????????????????do_mmap????????????????????mmap?????????????do_mmap??????????????????????????????????do_munmap????????????????????munmap??????????do_munmap??????????

?????????????????????豸???mmap???????????????豸?????????????????????????????豸????????mmap???幦??????????????????????????????У???????????????????????д???????????????д???I/O??д?????y??????????????????????????????????????????????????????????С?

?????????????mmap????????????????′???????????????????????????VMA????????????VMA?????????????????豸??????????????????file_operations??????mmap?????????????????????????VMA????????VMA?????С?

??????ò????mmap????


#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
int main()
{
  int fd;
  char *map;
  char buf[20];
  fd=open("mmap_test"?? O_RDWR);
//?????????????????????????NULL??????????
  map=mmap(NULL??20??PROT_READ|PROT_WRITE??MAP_SHARED??fd??0);
  strcpy(buf??map);  /*read date from map*/
  printf("%s"??buf);
  strcpy(map??"This is a map test!");
  munmap(map??20);      //???????????
  close(fd);
  return 0;
}


???????

????????ó???????????????????????????????????????????????????????????????????????????????????????Σ??????????????????????????????Linux?????????????????????????????????PGD?????????????pgd_t???????飬???б??????PMD?е???????????????mm_struct?????а???pgd_t???????????????????м??????PMD???????????pmd_t???????飬???е???????PTE?е???????????????????????????pte_t???????飬????????????檔??????????????????????????????????????????????????????????????е?page_table_lock????

????????????е?????????????????????????????????????????????TLB???????·???棩??TLB???????????????????????????????檔???????????????????????????????????TLB?????????????????????????????????????????????У???????????????????????????????????????????????2.6?汾??????????????????????????????????δ????????????????д?????????????????????????????fork????????????????????????