2016-04-25 5 views
1

Ich bin ein Anfänger C- und Linux-Entwickler, also tut es mir leid, wenn das klingt verwirrend.Verwenden von Kernel-Modul-Funktionen in einem benutzerdefinierten Systemaufruf - Undefinierter Referenzfehler

ich es geschafft, ein sehr einfaches System Aufruf durch die Aktualisierung der syscall_64.tbl erfolgreich zu erstellen, asmlinkage Methodendefinition Hinzufügen des Ordners Haupt Make-Datei syscalls.h, Hinzufügen und eine Make-Datei zu schaffen, die nur eine Zeile hat:

obj-y := syscall.o 

Keine Probleme bis dahin, ich kompilierte Linux-Quellcode und es funktionierte. Ich möchte einen fortgeschritteneren Systemaufruf erstellen. So habe ich eine Funktion vmx.c (die im Bogen ist/x86/kvm):

void myFunction(void){ 
//Some code 
} 
EXPORT_SYMBOL(myFunction); 

und definiert es in vmx.h (Es ist in arch/x86/include/asm):

void myFunction(void); 

Jetzt beginnt das Problem. Ich habe vmx.h in meine Datei syscall.c aufgenommen und diese Funktion aufgerufen. Ich bekomme einen "undefinierten Verweis auf myFunction", wenn ich versuche, Linux-Quellcode zu kompilieren. Was mache ich falsch? Das ist mein syscall.c ist:

#include <linux/kernel.h> 
#include <linux/syscalls.h> 
#include <asm/vmx.h> 

asmlinkage long sys_customsyscall(const char *test) 
{ 
    printk(KERN_ALERT "Test: %s,\n", test); 
    myFunction(); 
    return 0; 
} 
+0

vielleicht #include "asm/vmx.h" –

+0

Kannst du deine 'syscall.c'-Kompilierung in der make-Ausgabe sehen? Kannst du deine Frage bearbeiten, um zu zeigen, in welches "Makefile" des Superfolders du dein Verzeichnis aufgenommen hast und wie? Sie haben ein gutes, illustratives Beispiel dafür erstellt, wie Sie dem Linux-Kernel etwas hinzufügen können, und deshalb habe ich Sie aufgestuft, aber um Ihr Problem zu lösen, ist es besser, alle Daten im Blick zu haben. Es ist nicht notwendig, das Makefile des gesamten Superfolders, nur den Verzeichnisnamen und die Include-Zeile mit zwei oder drei Kontextlinien einzubeziehen. –

Antwort

1

Sie müssen dieses Symbol exportieren, so kann es durch andere Komponenten referenziert werden, fügen

EXPORT_SYMBOL(myFunction); 
+0

Vielen Dank für die Antwort. Ich habe diese Zeile hinzugefügt und meinen Post entsprechend aktualisiert, habe aber immer noch den gleichen Fehler. – tugce

+0

@tugce ist kvm in der Build-Konfiguration aktiviert? – fluter

+0

Wie überprüfe ich das? Ich glaube nicht, dass dies der Fall ist, weil ich zuvor die Datei vmx.c bearbeitet habe, um mehr Informationen über virtuelle Maschinen zu erhalten. Es funktioniert gut (einige Sachen zum Systemprotokoll drucken), während ich mit VM interagiere. Ich nehme an, das ist nicht der Fall. – tugce

2

Nach dem, was Sie getan hatte, müssen nächste, was in Betracht gezogen werden wenn Sie Ihre Funktion in vmx.c verwenden, dann in Linux/arch/x86/kvm/Makefile können Sie dieses So

kvm-intel-y    += vmx.o pmu_intel.o 

sehen, während stellen Sie sicher, Kompilieren Sie verwenden Intel-Konfiguration und keine t amd, sonst wird es nicht zusammen mit der Quelle kompilieren! Wenn es ist und Sie können es innerhalb svm.c definieren.

Damit stellen Sie sicher, dass Virtualisierung auch in make menuconfig aktiviert, Virtualization

auch Ihre Funktion Prototyp, Definition/Deklaration sollte nicht unter #ifdef oder ähnlich zu fallen, bis Sie über diesen Block sicher sind, .

Und auch einchecken vmx.h, fügten Sie extern Stichwort hinzu, während Sie definieren.

+0

Ich habe zuvor die Datei vmx.c bearbeitet, um mehr Informationen über virtuelle Maschinen zu erhalten. Sie funktioniert gut, da sie die Variablen ausgibt, die ich hinzugefügt habe, während ich mit der VM interagiere. Ich nehme an, das ist nicht der Fall. Ich habe auch extern keyword hinzugefügt, aber ich bekomme immer noch den gleichen Fehler. – tugce