написать kld во FreeBSD - PullRequest
       1

написать kld во FreeBSD

1 голос
/ 06 марта 2012

Я пишу новый KLD во FreeBSD. У меня есть файл C, как это: Вопрос о написании моего собственного системного вызова во FreeBSD - но функциональность моего кода немного отличается. Я инициализирую переменную в пространстве ядра, и мое имя функции my_KLD.

Я могу загрузить его без проблем с помощью "kldload", но у меня есть проблема: я собираюсь использовать этот kld через другой C-файл.

Структура файла выглядит следующим образом:

int
main(int argc, char **argv)
{

 f ( atoi(argv[1]) ;

}

f ( int x) { 
       printf("hi\n");
       int syscall_num ; 
       struct module_stat stat ; 
       stat.version = sizeof(stat) ;
       modstat (modfind("my_KLD") , &stat) ; 
       syscall_num = stat.data.intval ; 
       return syscall (syscall_num , x ) ;
}

Но когда я вызываю этот файл с аргументом х результат:

hi 
Bad System call (core dumped) 

Что еще мне делать?

1 Ответ

1 голос
/ 10 сентября 2013

В дополнение к комментарию от Srh BlueOcean, вы также должны проверить значение, возвращаемое modfind ().Вы предполагаете, что он может найти ваш KLD, и это большое предположение.KLD не может быть загружен по какой-либо причине.

Я считаю, что меньшие шаги лучше, поэтому вызовите modfind и распечатайте целочисленный идентификатор, чтобы увидеть, положительный он или отрицательный (-1 - ошибка).

Примерно так:

int modid;

if ((modid = modfind("my_KLD")) < 0) {
    perror("modfind failed");
    exit(1);
}
if (modstat(modid, &stat) < 0) {
    perror("modstat failed");
    exit(1);
}

Функция perror () выдаст вам сообщение об ошибке, и вы можете проверить страницу руководства, чтобы определить причину ошибки.Например, ENOENT: «Модуль не найден (возможно, не загружен)».

...