Невозможно добавить пользовательский системный вызов в x86 Ubuntu Linux - PullRequest
0 голосов
/ 23 февраля 2019

Я новичок в этом и только изучаю ядро ​​и пытаюсь добавить пользовательский вызов в ядро ​​4.20.4.Это шаги, которые я сделал.

  1. Сначала я создаю файл (kernel/printmsg.c), который содержит код.
#include <linux/kernel.h>
#include <linux/syscalls.h>

SYSCALL_DEFINE1(printmsg, int, i)
{
    printk(KERN_DEBUG, "TESTING %d", i);
    return 1;
}
Далее я добавляю этот файл в kernel/Makefile
obj-y = fork.o exec_domain.o panic.o \
        // A few more lines
obj-y += printmsg.o // I added this line
Наконец, я добавляю системный вызов к таблице системных вызовов на arch/x86/entry/syscalls/syscall_64.tbl (я строю это на 64-битной Ubuntu), добавляя эту строку:

548 64 printmsg sys_printmsg

Теперь я приступаю к запуску make.Тем не менее, у него есть эта ошибка:

arch/x86/entry/syscall_64.o:(.rodata+0x1120): undefined reference to `sys_printmsg'
Makefile:1034: recipe for target 'vmlinux' failed
make: *** [vmlinux] Error 1

Я долго чесал голову за это, но я не могу понять, что пошло не так.

Надеюсь, что кто-нибудьчто удалось найти проблему может помочь бедной душе.Заранее спасибо!

1 Ответ

0 голосов
/ 24 февраля 2019

Хорошо, после нескольких часов проб и ошибок я наконец нашел проблему.Начиная с ядра Linux v4.17, системные вызовы x86_64 могут начинаться с «__x64_sys».

Так что вместо использования 548 64 printmsg sys_printmsg я изменил его на 548 64 printmsg __x64_sys_printmsg.Тогда все работает.

Надеялся, что это помогло всем, у кого может быть эта проблема.

...