Это шаги, которые я выполнил.
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.Случайные значения для обоих параметров кажутся всегда одинаковыми!Я не знаю, куда я сейчас ухожу.