我想将自定义系统调用添加到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
答案 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存储库历史记录中找到。