在FreeBSD中实现copyout()

时间:2015-06-05 08:17:05

标签: unix freebsd bsd netbsd

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

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

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

定义/声明是:

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

是宣言还是定义? __nonnull(1)__nonnull(2)的含义是什么?

1 个答案:

答案 0 :(得分:3)

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

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

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