Скомпилировать 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 undeclered в файле pcpu.h.

что я пропустил? как я могу сделать свою школьную работу?

ПРИМЕЧАНИЕ: я использую freebsd8 в vbox

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, Или прочитайте это онлайн.

Обратите внимание, что:

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

Этого примера должно быть достаточно, чтобы вы начали писать свой собственный модуль системных вызовов...

Хорошо посмотрите на share/examples/kld/syscall для полной реализации в виде модуля.

Добавление нового файла в ядро ​​оставлено читателю в качестве упражнения.

Вот подсказка: найдите новейший добавленный файл в подкаталоге kern/* и проверьте, какие коммиты были выполнены, чтобы сделать его компиляцией.

На самом деле вы могли бы сделать то же самое с syscall: НАЙТИ НОВЫЙ ДОБАВЛЕННЫЙ SYSCALL И ПРОВЕРИТЬ, КАК ЭТО ДОСТИГ.

Все это доступно в истории хранилищ svn/git.

Другие вопросы по тегам