2016-06-01 6 views
0

Da ich neue Kernelmodul Parameter say new_param = 1/0 einführen wollte, dann muss dieser Parameter im Kernel-Code überprüft werden als if (new_param == 1) einige Arbeit ... .. else andere tun ...Einstellen des Kernels abstimmbarer Parameter

Auf diese Weise wollte ich überprüfen, indem neue Kernel-Modul Parameter.Kann jemand bitte helfen Sie mir? Was sind die Schritte, denen ich folgen muss, um dies zu tun?

+0

Ihre Frage ist mir nicht klar. Möchten Sie nur eine andere Variable zu einer Kernel-Datei hinzufügen, auf die Sie in dieser bestimmten Datei zugreifen können, oder möchten Sie aus mehreren Dateien darauf zugreifen können? Wenn es ersteres ist, können Sie die Variable einfach hinzufügen, wie Sie es normalerweise tun würden - in einem Header oder im richtigen Umfang innerhalb der Quelle selbst. Nachdem Sie den Kernel-Code geändert haben, kompilieren Sie den Kernel einfach mit 'make', ggf. mit allen Modulen (' make modules_install') und schließlich mit 'make install'. Boot in deinen modifizierten Kernel und hab Spaß. – buratino

+0

Ich muss einen Kernel für eine Anwendung tunbar, zB nachdem die Anwendung installiert wurde, einen Kernel tunnable Parameter say ex_param = 1 manuell setzen. Nach der Einstellung wollte ich diesen Parameter in einer Kernelquelle überprüfen, wenn dieser Parameter if sagt (ex_param == 1) etwas tun, sonst etwas tun ... Wie kann dies erreicht werden? –

+0

Oh, ich glaube ich habe es falsch verstanden. Sie möchten einen Parameter hinzufügen, der von der Kernel-Befehlszeile verwendet werden soll, richtig? – buratino

Antwort

1

Eine Möglichkeit, einen eigenen Kernel-Parameter zu verwenden, ist es auf der Linie kernel Befehl hinzufügen und analysieren sie aus/proc/cmdline, das heißt:

Fügen Sie den Parameter an den Kernel-Befehlszeile BOOT_IMAGE=<image> root=<root> ro quiet splash vt.handoff=7 your_parameter=<value>

Wenn Sie starten, werden Sie diesen Parameter zugreifen können, indem der Inhalt von/Parsen proc/cmdline:

$ cat /proc/cmdline 
BOOT_IMAGE=<image> root=<root> ro quiet splash vt.handoff=7 your_parameter=<value> 

ich glaube, würde eine Lösung mehr zugeschnitten auf Ihre Bedürfnissemit 210, die in /Documentation/kernel-parameters.txt erwähnt (aber nicht gut erklärt) wird.

Es gibt einige Beispiele in der Kernelquelle. Ein solcher würde in /drivers/block/brd.c sein:

#ifndef MODULE 
/* Legacy boot options - nonmodular */ 
static int __init ramdisk_size(char *str) 
{ 
     rd_size = simple_strtol(str, NULL, 0); 
     return 1; 
} 
__setup("ramdisk_size=", ramdisk_size); 
#endif 

Nach diesem Beispiel Sie Ihre __init und __setup() in der entsprechenden Quelldatei hinzufügen könnten. Für ganze Zahlen von einer Option Zeichenfolge in Ihrer __init Funktion Parsen finden get_option() in /lib/cmdline.c

aktualisieren

Für Module, sollten Sie module_param() verwenden, die drei Argumente verwendet: Variablenname, Variablentyp , sysfs Berechtigungen. Mehr zur Klasse finden Sie unter /linux/moduleparam.h.

In dem Modul, an das Parameter übergeben werden sollen, müssen die Parameter zuerst als globale Parameter deklariert werden. Ein Beispiel für die Verwendung der folgenden in der Modulquelle würde:

int foo = 200; 
module_param(foo, int, 0); 

Recompile das Modul und Sie werden sehen, dass Sie es über modprobe <module-name> foo=40 laden können.

+0

Vielen Dank für die Antwort.Nachdem ich das getan habe, wenn ich meinen Parameter über modprobe modul parameter = setze, lädt das direkt den Wert in dem Quellcode, den wir in __init definiert haben? –

+1

Ich habe meine Antwort aktualisiert, um Informationen zu Modulparametern hinzuzufügen. Sie sollten Ihre Frage aktualisieren, wenn Modulparameter das sind, wonach Sie ursprünglich fragen wollten. – buratino

+0

Ok, kann dies in der Laufzeit geändert werden und wie kann ich einen neuen Kernel-Parameter in proc/sys/kernel/hinzufügen? –

Verwandte Themen