FreeBSD 中 copyout() 的实现

Implementation of copyout() in FreeBSD

FreeBSD 中 AMD64 的函数 copyout() 的定义在哪里?

(http://www.unix.com/man-page/FreeBSD/9/copyout/)

我唯一能找到的地方是 sys/sys/systm.h

definition/declaration是:

int     copyout(const void * __restrict kaddr, void * __restrict udaddr,
        size_t len) __nonnull(1) __nonnull(2);

是声明还是定义? __nonnull(1)__nonnull(2) 是什么意思?

这是一个函数原型,也称为声明。实现(定义 如果你选择)在内核源代码中。您可以在本地 FreeBSD 机器上(在 /usr/src/sys 下)找到那些 online,或者(如果您选择安装源代码)。实际上有几个副本,这取决于编译内核的硬件。 (顺便说一句,函数名称是 "old" — 我在 20 世纪 80 年代中期遇到过它们,它们在那个时间点是众所周知的)。

内核源代码包含这些函数的几种实现,具体取决于硬件平台。例如,在 FreeBSD 10 中,amd64 版本是用汇编语言编写的(例如,参见 /usr/src/sys/amd64/amd64/support.S 中的 SVN)。在同一版本中,我发现只有一个用 C 编写的实现(在 powerpc 子树下),并且在当前源代码中,that 已被重写。因此,要知道 "where" 是源代码,您必须做一些研究并找到适合您的硬件平台和 FreeBSD 版本的相应源代码。

__nonnull 是一个编译器指令,告诉它确保给定的参数不是明显的空指针。例如,请参阅这些邮件列表评论: