Ich versuche, einen einfachen helloworld
System Call zu kernel 3.13.0-37-generic
auf 64-Bit-System hinzuzufügen.Hinzufügen neuer Systemaufruf zu Linux Kernel 3.13 auf 64-Bit-System
Ich werde versuchen zu zeigen, was ich für Schritt so weit Schritt tat
1- I Kernel Quelle heruntergeladen haben:
sudo apt-get source linux-image-3.13.0-37-generic
Danach, Kernel-Quelldateien
2- bis /usr/src/
extrahiert definieren eines neuen Systemaufruf sys_hello()
:
Ich habe in /usr/src/linux-3.13/
Und ich schaffte eine hello.c
Datei in hello
Verzeichnis mit folgendem Inhalt ein Verzeichnis mit hello
Namen in dem Kernel-Quellverzeichnis erstellt:
#include <linux/kernel.h>
asmlinkage long sys_hello(void)
{
printk(“Hello world\n”);
return 0;
}
Dann habe ich ein Makefile
in das hallo-Verzeichnis mit folgendem Inhalt:
obj-y := hello.o
3- das hallo-Verzeichnis des Makefile hinzufügen Kernel
ich folgende Zeile in /usr/src/linux-3.13/Makefile
geändert:
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
zu:
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ hello/
4- Fügen Sie den neuen Systemaufruf sys_hello()
in die Systemaufruftabelle (syscall_64.TBL-Datei)
Weil ich 64-Bit-System verwenden, muss ich in die syscall_64.tbl
Datei ändern:
/usr/src/linux-3.13/arch/x86/syscalls/syscall_64.tbl
Hinzugefügt wurde die folgende Zeile am Ende der Datei hinzu:
-Last Zeilennummer war 313
314 common hello sys_hello
5- den neuen Systemaufruf hinzufügen sys_hello()
asmlinkage long sys_hello(void);
6- Kompilieren: Wenn Sie im Systemaufruf Header-Datei
vim /usr/src/linux-3.13/include/linux/syscalls.h
Ich habe die folgende Zeile am Ende der Datei kurz vor der endif-Anweisung zuunterst hinzugefügt Kernel auf meinem System
den Kernel konfigurieren ich den folgenden Befehl versucht:
sudo make menuconfig
Nach dem obigen Befehl kam ein Popup-Fenster und ich stellte sicher, dass ext4
ausgewählt wurde und dann save
.
Dann:
# cd /usr/src/linux-3.13/
# make
Es tooks 2 bis 3 Stunden.
Danach:
# make modules_install install
Danach wird neu gestartet ich mein System.
7- Testen Sie den Systemaufruf (Problem ist hier)
Nach dem Neustart habe ich eine Datei mit dem Namen hello.c
in Home-Ordner mit folgendem Inhalt:
#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>
int main()
{
long int amma = syscall(314); // 314 is the number of sys_hello line in `syscall_64.tbl`
printf(“System call sys_hello returned %ld\n”, amma);
return 0;
}
Dann:
# gcc hello.c
# ./a.out
Der Ausgang ist:
System call sys_hello returned -1
Problem genau ist -1
. Es muss 0
nicht -1
zurückgegeben werden.
Scheint wie sys_hello
Kernel-Systemaufruf nicht hinzugefügt.
Was mache ich falsch?
Suchen Sie im Kernel-Protokoll oder markieren Sie uname, um sicherzustellen, dass Sie Ihren neuen Build ausführen. Überprüfen Sie die system.map, um zu sehen, ob Ihr Zusatz im Kernel enthalten ist. –
Ich kann es nicht durch 'uname' herausfinden, denn vorher/nachher ist der Kernel gleich (beide sind' kernel 3.13.0-37-generic'). –
Es gibt kein 'dmesg', das sich auf den Systemaufruf' sys_hello' bezieht! –