2013-12-21 63 views
5

首先发布到SO,所以我会尽量让问题正确。如何从内核模块写入TTY?

我正在制作一个简单的Linux内核模块,目标是将数据回送到内核模块加载的TTY shell。我遇到的问题是内核“Ooops” - 与以下消息(抓住“观看'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,但它已过时(我使用的内核是Fedora 19上的3.11.10-200),所以我不得不通过3.11.10-200源文件翻找到足够的结构。的tty = current->signal->tty;

就是这样

你需要访问它之前锁定TTY和get_current_tty

回答

6

使用tty = get_current_tty();而不是做它内部

注:get_current_ttyEXPORT_SYMBOL_GPL下,因此你的模块或代码

+0

谢谢,它像一个魅力。我花了几个小时寻找解决这个问题的方法。如果我们在现实生活中相遇,我欠你一杯啤酒(或者你选择的一杯饮料)。 – praetoriaen