了解 C 中的页面复制
Understanding page copying in C
我听说 memcpy
是一种非常有效的数据复制算法。为了尝试从我的代码中吸取一些教训,我决定研究它在 GNU 中的实现。但是,对于大内存块,它会进行一些检查,然后 calls a PAGE_COPY_FWD macro-- 我无法在任何地方找到定义。
mem_cpy 源代码的最后 link 说:
System-specific pagecopy.h files should define these macros and then
#include this file:
...
PAGE_COPY_FWD (dstp, srcp, nbytes_left, nbytes)
两个问题:
1) 如何找到这个宏的实现? (任何地方——在我的机器上,或在别人的机器上——即使这意味着我必须阅读汇编代码。)
2) 我必须包含什么才能直接调用此宏,即无需先通过 memcpy?
我找到了 PAGE_COPY_FWD
的这个定义
#define PAGE_COPY_FWD(dstp, srcp, nbytes_left, nbytes) \
((nbytes_left) = ((nbytes) - \
(__vm_copy (__mach_task_self (), \
(vm_address_t) srcp, trunc_page (nbytes), \
(vm_address_t) dstp) == KERN_SUCCESS \
? trunc_page (nbytes) \
: 0)))
在这里找到的 https://www.sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/mach/pagecopy.h
我听说 memcpy
是一种非常有效的数据复制算法。为了尝试从我的代码中吸取一些教训,我决定研究它在 GNU 中的实现。但是,对于大内存块,它会进行一些检查,然后 calls a PAGE_COPY_FWD macro-- 我无法在任何地方找到定义。
mem_cpy 源代码的最后 link 说:
System-specific pagecopy.h files should define these macros and then
#include this file:
...
PAGE_COPY_FWD (dstp, srcp, nbytes_left, nbytes)
两个问题:
1) 如何找到这个宏的实现? (任何地方——在我的机器上,或在别人的机器上——即使这意味着我必须阅读汇编代码。)
2) 我必须包含什么才能直接调用此宏,即无需先通过 memcpy?
我找到了 PAGE_COPY_FWD
#define PAGE_COPY_FWD(dstp, srcp, nbytes_left, nbytes) \
((nbytes_left) = ((nbytes) - \
(__vm_copy (__mach_task_self (), \
(vm_address_t) srcp, trunc_page (nbytes), \
(vm_address_t) dstp) == KERN_SUCCESS \
? trunc_page (nbytes) \
: 0)))
在这里找到的 https://www.sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/mach/pagecopy.h