2

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

( 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)

4

1 回答 1

3

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

内核源代码包含这些功能的多个实现,具体取决于硬件平台。例如,在 FreeBSD 10 中,amd64 版本是用汇编语言编写的(例如,参见/usr/src/sys/amd64/amd64/support.S中的 SVN)。在同一个版本中,我发现只有一个用 C 编写的实现(在 powerpc 子树下),并且在当前源代码中,已被重写。所以,要知道“哪里”是源,你必须做一些研究,找到你的硬件平台和 FreeBSD 版本对应的源。

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

于 2015-06-05T08:31:43.020 回答