【问题标题】:How can I write to TTY from a kernel module?如何从内核模块写入 TTY?
【发布时间】:2013-12-21 13:54:07
【问题描述】:

第一次发帖给 SO,所以我会尽量把问题做对。

我正在制作一个简单的 Linux 内核模块,目的是将数据回显到加载内核模块的 TTY shell。我遇到的问题是带有以下消息的内核“Ooops”(被“ watch 'dmesg | tail -50' ”捕获)。内核模块的名字是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.

将数据写入 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 源文件才能找到适当的结构。

【问题讨论】:

    标签: linux linux-kernel


    【解决方案1】:

    使用tty = get_current_tty(); 代替tty = current-&gt;signal-&gt;tty;

    就是这样

    您需要在访问之前锁定 tty,get_current_tty 在内部进行此操作

    注意:get_current_ttyEXPORT_SYMBOL_GPL 下,因此是您的模块或代码

    【讨论】:

    • 谢谢,它就像一个魅力。我花了几个小时寻找这个问题的解决方案。如果我们在现实生活中相遇,我欠你一杯啤酒(或你选择的饮料)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多