2014-11-03 4 views
9

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?

+0

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. –

+0

Ich kann es nicht durch 'uname' herausfinden, denn vorher/nachher ist der Kernel gleich (beide sind' kernel 3.13.0-37-generic'). –

+0

Es gibt kein 'dmesg', das sich auf den Systemaufruf' sys_hello' bezieht! –

Antwort

6

Das Problem war von Schritt 6 bis zum letzten Schritt (Compile Kernel).

Nach dem Schritt 5, haben wir folgende Schritte zu tun:

6- diesen Kernel auf meinem System Kompilieren

Um den Kernel zu konfigurieren ich den folgenden Befehl versucht:

# make menuconfig 

Nach dem obigen Befehl kam ein Popup-Fenster auf und ich stellte sicher, dass ext4 ausgewählt und dann gespeichert wurde.

Dann DEB Datei von neuen Kernel erstellen müssen wir:

# make -j 5 KDEB_PKGVERSION=1.arbitrary-name deb-pkg 

Es wird einige deb Dateien in /usr/src/ erstellen.

Danach müssen wir sie installieren:

# dpkg -i linux*.deb 

Es wird neuen Kernel auf Ihrem System installieren.

Starten Sie jetzt Ihr System neu. Nachdem das System neu gestartet können Sie herausfinden, ob neue Kernel installiert ist oder nicht:

$ uname -r 

Und wenn Sie Ihr neues System Call wollen wissen, hinzugefügt, um den Kernel oder nicht geben Sie einfach: mein Fall

$ cat /proc/kallsyms | grep <system call name> 

In :

$ cat /proc/kallsyms | grep hello 

nach Ausgabe zeigt an, dass Ihr Systemaufruf an die Kernel erfolgreich hinzugefügt:

0000000000000000 T sys_hello