Как я могу написать в TTY из модуля ядра?
Первый пост в SO, поэтому я постараюсь сделать вопрос правильно.
Я делаю простой модуль ядра Linux с целью передачи данных обратно в оболочку TTY, откуда был загружен модуль ядра. У меня проблема с ядром "ooops" со следующим сообщением (поймано "watch 'dmesg | tail -50'"). Модуль ядра называется Серафим:
[ 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.
Код, используемый для записи данных в терминал TTY:
#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");
}
Что я делаю неправильно?
Я следовал за учебником вhttp://www.tldp.org/LDP/lkmpg/2.6/lkmpg.pdf но он устарел (я использую ядро 3.11.10-200 на Fedora 19), поэтому мне пришлось поискать исходные файлы 3.11.10-200, чтобы найти подходящие структуры.