Проблема с новым системным вызовом, который я пытаюсь сделать (Ubuntu 18.04.1 LTS Kernel: 4.17.4) - PullRequest
0 голосов
/ 03 февраля 2019

Это шаги, которые я выполнил.

1) Я работал на ядре 4.15.0, поэтому я обновился до более нового ядра.

wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.17.4.tar.xz

2) Извлечен исходный код ядраиспользуя

  sudo tar -xvf linux-4.17.4.tar.xz -C/usr/src/

3) В cd /usr/src/linux-4.17.4/ создан новый каталог с именем

sub

Затем создан

sub.c

внутри

sub

каталог.

В

sub.c

Я написал код для вычитания y из x, если (y> x), иначе вернем 0;Здесь x - целое число, а y - двойное.

#include <linux/kernel.h>

asmlinkage int sys_sub(int x,double y)
{
    printk("working...");
    if(y>x){
        return ((int)y-x);}
    else
        return 0;
}

4) создал Makefile в том же подкаталоге и добавил obj-y := sub.o

5) In

/ usr / src / linux-4.17.4

открыл Makefile и изменил строку core-y на

core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ sub/

6) Затем в

cd arch / x86 / entry / syscalls /

Я открыл

gedit syscall_64.tbl

и как 548-й системный вызов Iвведено

548       64        hello          sys_sub

7) В

cd include / linux /

Я открыл

Системные вызовы gedit.h

и добавили

asmlinkage int sys_sub(int x,double y);

в качестве последней строки непосредственно перед endif

8) Я убедился, что ext4 выбран в

sudo make menuconfig

9) Я скомпилировал ядро, используя

sudo make modules_install install

10) выполнено

shutdown -r сейчас

11) Проверено

uname -r

, чтобы убедиться, что я бегу

4.17.4

действительно, какой я был.

12) Я создалC-программа для проверки системного вызова

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
      int res = syscall(548,10,44);
         printf("System call sys_sub returned %d ", res);
return 0;

}

Но он только возвращает

Системный вызов sys_sub вернул 0

и

dmesg

почему-то показывает Hello World.Пожалуйста, помогите мне.Что я делаю не так?

Редактировать:

Я внес необходимые изменения в свой код в соответствии с комментариями, которые я прочитал.Теперь мой код системного вызова выглядит следующим образом:

#include <linux/kernel.h>

asmlinkage long sys_sub(int a,int b)
{
        printk("System call is working...\n");
        printk("Inputs are %d and %d",a,b);
        if(b>a)
    {
        int c= b-a;
        printk("Answer is %d",c);
        return c;   
    }
    printk("Answer is 0");
    return 0;
}

Я добавил несколько операторов print, чтобы убедиться, что системные вызовы выполняются правильно.Я перекомпилировал ядро ​​и снова запустился, и теперь я получаю

dmesg

вывод как

Системный вызов работает ...Входные данные - 1114685272 и 1114685272. Ответ - 0

Кажется, что ядро ​​получает случайные значения барахла вместо параметров, которые я передаю, что делает его всегда терпящим неудачу в цикле if.Случайные значения для обоих параметров кажутся всегда одинаковыми!Я не знаю, куда я сейчас ухожу.

1 Ответ

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

В одной интернет-статье упоминается, что нужно скомпилировать все ядро, а затем modules_install.Также возврат системного вызова должен быть длинным вместо int.Файл unistd.h нуждается в некоторых изменениях для нового системного вызова.Эта статья предназначена для ядра версии 2.6, но ее можно найти по адресу http://www.tldp.org/HOWTO/html_single/Implement-Sys-Call-Linux-2.6-i386/

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