freebsd编译是如此复杂?

时间:2015-04-25 15:10:52

标签: freebsd bsd

我想将自定义系统调用添加到freebsd(学校工作)。我谷歌数百次。它没有正确的解决方案。 我的作业是:"将自定义系统调用添加到freebsd内核并重新编译内核并使用它"。 最后我发现我应该遵循这两页中的说明:

1:http://www.onlamp.com/pub/a/bsd/2003/10/09/adding_system_calls.html

然后

2:https://www.freebsd.org/doc/en/books/handbook/kernelconfig-building.html

它会在编译时显示错误:

<sys/parma.h> no such file or directory
<sys/kern.h> no such file or directory
<sys/syscallargs.h> no such file or directory

我删除了这三个标题包括我的文件然后重新编译它。现在显示其他错误,如:MAXCPU在pcpu.h文件中未被清除。

我错过了什么?我怎样才能完成学业?

注意:我在vbox中使用freebsd8

2 个答案:

答案 0 :(得分:2)

查看错误消息的内容;文件不存在。

  • 第一个包含文件是拼写错误;它是param.h,而不是parma.h
  • 没有kern.h。也许你的意思是sys/kernel.h
  • 同意syscallargs.h。你或许是syscall.h

您可以使用例如

找到头文件
find /usr/src/sys/ -type f -name '*.h'|grep 'sys/.*kern.*\.h'
/usr/src/sys/ofed/include/linux/kernel.h
/usr/src/sys/dev/netmap/netmap_kern.h
...

更新:更重要的是确定哪些实际需要

FreeBSD有很好的文档。如果要使用内核函数或数据结构,可能会在手册页的第9节中介绍。

您可以使用ls /usr/share/man/man9/ | less列出该部分中的所有手册页。或者您可以使用apropos命令。 由于您要实现系统调用,请从例如

开始
apropos syscall

它将返回:

SYSCALL_MODULE(9)        - syscall kernel module declaration macro
syscall(2), __syscall(2) - indirect system call

在我看来,第一个可能与你的任务有关。 (第二个是如何从用户空间调用系统调用。)所以用man SYSCALL_MODULE读取它。或者阅读online

请注意:

     A minimal example for a syscall module can be found in
     /usr/share/examples/kld/syscall/module/syscall.c.

这个例子应该足以让你开始编写自己的系统调用模块......

答案 1 :(得分:1)

好好看一下share / examples / kld / syscall作为模块的完整实现。

向内核添加新文件留给读者练习。

这是一个提示:在kern / * subdir中查找最新添加的文件,并检查已执行的任何委托进行编译。

事实上,您可以使用系统调用完全相同:找到最新增加的系统并检查它是如何实现的。

所有这些都可以在svn / git存储库历史记录中找到。