след моя въпрос тук, разширих проучването си относно действителното четене/запис от файл в памет и обратно при извикване на файла mmap. за разлика от системните извиквания READ и WRITE, случаят 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
изглежда, че Mach пейджърът върши цялата работа тук (за четене на файла в паметта). Знам, че load_machfile
обикновено прави частта за четене на файла, използвайки vn_rdwr
, когато зарежда ново изображение в execve
, но не можах да намеря синоним в дървото на функциите vnode_pager_map
.
така че въпросът ми е кой метод всъщност чете съдържанието на файла в mmap sys извикване?
VOP_READ
, което е командата на файловата система за четене от съдържанието на файла. Благодаря ! - person   schedule 12.06.2017