2013-12-21 7 views
5

Erste Post zu SO, also werde ich versuchen, die Frage richtig zu machen.Wie kann ich von einem Kernelmodul in TTY schreiben?

Ich mache ein einfaches Linux-Kernel-Modul mit dem Ziel, Daten zurück in die TTY-Shell, von wo das Kernel-Modul geladen wurde. Das Problem, das ich habe, ist der Kernel "Hoppla!" - mit der folgenden Nachricht (gefangen mit "watch 'dmesg | tail -50'"). Der Name des Kernel-Modul ist Seraphim:

[ 184.222748] SELinux: initialized (dev proc, type proc), uses genfs_contexts 
[ 1877.456607] seraphim: module verification failed: signature and/or required key missing - tainting kernel 
[ 1877.457321] ------------------ 
[ 1877.457324] Seraphim started. 
[ 1877.457348] BUG: unable to handle kernel NULL pointer dereference at 0000000000000218 
[ 1877.457411] IP: [<ffffffffa0012030>] seraphim_entry+0x30/0x1000 [seraphim] 
[ 1877.457462] PGD 115a2e067 PUD 10aca8067 PMD 0 
[ 1877.457498] Oops: 0000 [#1] SMP 
[ 1877.457524] Modules linked in: seraphim(OF+) rfcomm bnep nf_conntrack_netbios_ns nf_conn track_broadcast ipt_MASQUERADE ip6t_REJECT xt_conntrack ebtable_nat ebtable_broute bridge stp llce btable_filter ebtables ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv6 ip6table_ma etc. 

Der Code zum Schreiben von Daten an den TTY-Terminal verwendet folgt:

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/sched.h> 
#include <linux/tty.h> 

static void printString(char *string) { 

    struct tty_struct *tty; 

    tty = current->signal->tty; 

    if(tty != NULL) { 

     (tty->driver->ops->write) (tty, string, strlen(string)); 
    } 

    else 
     printk("tty equals to zero"); 
} 

Was mache ich falsch?

Ich folgte dem Tutorial bei http://www.tldp.org/LDP/lkmpg/2.6/lkmpg.pdf, aber es war veraltet (der Kernel, den ich verwende, ist 3.11.10-200 auf Fedora 19), also musste ich durch 3.11.10-200 Quelldateien stöbern, um das zu finden angemessene Strukturen.

Antwort

6

Verwendung tty = get_current_tty(); statt tty = current->signal->tty;

, dass es

müssen Sie die tty sperren, bevor sie und get_current_tty Zugriff hat es intern

HINWEIS: get_current_tty ist unter EXPORT_SYMBOL_GPL, damit Ihr Modul oder Code

+0

Danke, es hat wie ein Charme funktioniert. Ich habe mehrere Stunden damit verbracht, nach der Lösung für dieses Problem zu suchen. Wenn wir uns jemals im wirklichen Leben treffen, schulde ich dir ein Bier (oder ein Getränk deiner Wahl). – praetoriaen

Verwandte Themen