после моего вопроса здесь, я расширил свое исследование фактического чтения/записи из файла в память и наоборот при вызове файловой 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?
VOP_READ
, который является командой файловой системы для чтения из содержимого файла. Благодарность ! - person   schedule 12.06.2017