如何从内核模块写入TTY?

mzdv:

首先发给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源文件以找到适当的结构。

Sundeep471:

tty = get_current_tty();代替tty = current->signal->tty;

而已

您需要先锁定tty,然后再get_current_tty对其进行内部访问

注意:get_current_tty在下方EXPORT_SYMBOL_GPL,因此您的模块或代码

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章