suite à ma question here, j'ai étendu mes recherches sur la lecture/écriture réelle du fichier à la mémoire et vice versa lors de l'appel au fichier mmap. contrairement READ et WRITE syscalls, le cas MMAP est différent, car il peut être indiqué dans le backtrace ci-dessous:Mach pager chargeant le fichier à la mémoire dans le fichier mmap
(lldb) bt
* thread #3, name = '0xffffff801a6c24c0', queue = '0x0', stop reason = step in
* frame #0: 0xffffff80133b0788 kernel`ubc_map [inlined] VNOP_MMAP(fflags=<unavailable>, ctx=0xffffff8021a74af0) at kpi_vfs.c:3649 [opt]
frame #1: 0xffffff80133b0775 kernel`ubc_map(vp=<unavailable>, flags=<unavailable>) at ubc_subr.c:1793 [opt]
frame #2: 0xffffff8012f571dd kernel`vnode_pager_map(mem_obj=<unavailable>, prot=<unavailable>) at bsd_vm.c:737 [opt]
frame #3: 0xffffff8012f7a1cd kernel`vm_map_enter_mem_object_control [inlined] memory_object_map(memory_object=<unavailable>, prot=<unavailable>) at memory_object.c:2332 [opt]
frame #4: 0xffffff8012f7a1c3 kernel`vm_map_enter_mem_object_control(target_map=<unavailable>, address=<unavailable>, initial_size=<unavailable>, mask=<unavailable>, flags=<unavailable>, control=<unavailable>, offset=1, copy=<unavailable>, cur_protection=<unavailable>, max_protection=<unavailable>, inheritance=<unavailable>) at vm_map.c:4493 [opt]
frame #5: 0xffffff80133751a8 kernel`mmap(p=<unavailable>, uap=<unavailable>, retval=<unavailable>) at kern_mman.c:600 [opt]
frame #6: 0xffffff8013425695 kernel`unix_syscall64(state=<unavailable>) at systemcalls.c:376 [opt]
frame #7: 0xffffff8012e9dd46 kernel`hndl_unix_scall64 + 22
il semble que le téléavertisseur mach fait tout le travail ici (de la lecture du fichier en mémoire). Je sais que load_machfile
généralement faire la partie de fichier de lecture en utilisant vn_rdwr
lors du chargement de la nouvelle image dans execve
, mais je ne pouvais pas trouver de synonymes dans vnode_pager_map
arbre de la fonction. Donc, ma question est de savoir quelle méthode lit réellement le contenu du fichier dans l'appel de mmap sys?
La plupart mémoire Les systèmes de carte attendent simplement les erreurs de page pour lire les parties correspondantes du fichier dans la page. –
vous avez absolument raison, je viens de mettre un point d'arrêt sur la méthode page-faute, et il semble qu'il a finalement appelé 'VOP_READ' qui est la commande du système de fichiers de lecture à partir du contenu du fichier. Merci ! – osxUser
C'est pourquoi on l'appelle pagination * à la demande *. :) –