2015-04-25 38 views
1

我想添加自定義系統調用freebsd(學校工作)。我谷歌數百次。它沒有正確的解決方案。我的作業是:「將自定義系統調用添加到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 undepred在pcpu.h文件中。

我錯過了什麼?我怎麼做我的學校工作?

注意:我在vbox中使用freebsd8

+0

也許你應該從2003-10-09開始使用FreeBSD的版本,因爲它是寫這篇文章的日期。 –

回答

2

看看錯誤消息說什麼;該文件不存在。

  • 第一個包含文件是拼寫錯誤;它是param.h,而不是parma.h
  • 沒有kern.h。也許你的意思是sys/kernel.h
  • 同上syscallargs.h。你的意思是syscall.h

你可以找到頭文件與e.g:

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. 

這個例子應該足以讓你開始編寫自己的系統調用模塊...

+0

雅,前兩個是我的錯字。第三是在tutodial提到的。畢竟我改變爲你的指導,但現在:所有3文件(param.h,kernel.h,syscall.h)沒有這樣的文件或目錄。同樣的錯誤 –

+0

OpenBSD內核中存在'syscallargs.h'文件,它與FreeBSD內核不同!關於「沒有這樣的文件」的錯誤,請編輯你的問題,以顯示你如何編譯你的代碼。 –

+0

@NaserHamidi看看我更新的答案中提到的例子。 –

1

那麼看看share/examples/kld/syscall作爲一個模塊的完整實現。

將新文件添加到內核中作爲讀者的練習。

這是一個提示:在kern/* subdir中找到最新添加的文件,並檢查是否做出了編譯的提交。

事實上,你可以使用系統調用完全相同:查找最新添加的SYSCALL並檢查它是如何實現的。

所有這些都可以在svn/git倉庫歷史中找到。