在 freebsd 中编写我的第一个系统调用(用于学习内核开发)

Posted

技术标签:

【中文标题】在 freebsd 中编写我的第一个系统调用(用于学习内核开发)【英文标题】:Writing my first systemcall(for learning kernel development) in freebsd 【发布时间】:2015-01-09 12:03:50 【问题描述】:

所以我才刚刚开始定制 FreeBSD 内核,可惜可用于 FreeBSD 开发的资源稀缺。

我正在编写一个系统调用,其中应该读取一个文件(可选),根据输入读取物理内存块并将结果写入另一个文件(通常是“filename.results”)

我的问题是:

标准 C 库:似乎它们无法用于内核模块编程,所以我应该如何替换诸如 write 和 read(以及 strlen 和 string.h 中的其他一些函数)之类的函数?

Malloc 函数:它似乎接受 3 个输入而不是 1 个,即使在阅读手册页后我也不知道如何填充第二个变量(尝试 FOO 但返回符号链接错误)。

我还对您认为对这个例程有用的任何其他主题感兴趣。

【问题讨论】:

我自己对内核开发知之甚少,但我读过一点。关于 C 库和 malloc 中的函数。内核本身应该有它自己需要的所有功能的变体。尝试在内核代码中搜索您需要的功能。就像一击一样尝试检查此链接。 freebsd.org/doc/en/articles/geom-class/kernelprog.html 如果不阅读一些内核源代码,您很快就会来。祝你好运.. 我还发现了这个文档,它在名为 sys/libkern.h leidinger.net/FreeBSD/src_doc/libkern.pdf的文件中描述了一些不同的功能@ 【参考方案1】:

如果是 malloc,请执行“man 9 malloc”。这里的“9”表示描述内核函数的部分,userland malloc 在第 3 部分中描述。

【讨论】:

好吧,我想我明白了,在阅读了一本名为 freebsd 设备驱动程序的书之后,我现在已经非常清楚了。【参考方案2】:

好吧,我已经说过我得到了答案。 所以为了以后的阅读,我把它留在这里。

MALLOC:您需要定义自己的内存描述(或使用现有的)以便能够找到它,这是一个 POSIX 标准,用于完整性检查。

至于其他方面,由于标准 c 库在内核模式下不可用,它们的内核变体很可能在 libkern 中可用(打开 /sys/libkern),一旦你实现它们将全部可用它(比如 uprintf、strlen 和其他东西),如果它不存在,你必须通过在头文件中实现它们来调用依赖模块(比如对于 FILE 交互,你需要包含位于 /sys/(dir) 中的 I/O 模块) 因为您处于内核模式,所以不会造成问题。(还要注意,这些功能实现得很好,因此您不太可能面临内核崩溃。)

很明显,您必须将缓冲区从用户内存复制到内核内存才能对其进行修改,并在完成后将其复制回来。

最后一件事,为了通过 sysproto 自动构建实现您的系统调用,您还需要包含它(并将您的系统调用添加到列表中)。并且不要忘记将您的文件包含在源文件配置文件中(再次位于 /sys/(dir) 中)。

【讨论】:

以上是关于在 freebsd 中编写我的第一个系统调用(用于学习内核开发)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 FreeBSD 9.1 系统中使用 libdb-4.2?

编写一个处理任意中断和输出到设备的 FreeBSD 内核模块

freebsd系统bond配置方法

用于 java 托管的 FreeBSD [关闭]

在 FreeBSD 12 上安装 Gitea

Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器