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