Скомпилировать 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.