使用简单的char驱动程序作为控制台启动linux内核?

时间:2015-11-21 12:06:23

标签: linux-kernel console driver boot

我试图在一个学术项目的Sparc v8处理器的仿真模型上启动linux内核(v3.16.1)。

仿真模型由cpu,内存,计时器和简单的基于轮询的输出设备组成。我们修改了内核,因此不需要引导加载程序。我们直接将内核映像放在内存中,设置一些必要的变量并跳转到内核代码中。我们有一个基于初级轮询的输出设备,我们已经能够将printk输出到这个设备。

内核一直启动到#34; / init"的开头。在此之后,没有输出可见。就在此之前,会显示一条警告:"警告:无法打开初始控制台。"我的文件系统映像似乎没问题,并且包含一个/ dev / console节点(我用Qemu检查过它)。

我的理解是,虽然printk工作正常(使用早期控制台),但用户进程需要设置具有适当设备驱动程序的设备节点。 Printk工作正常,有没有办法通过printk查看用户进程到控制台的所有写入?现有的驱动程序名为" ttyprintk"它将所有写入发送到printk。我启用它并尝试通过传递" console = ttyprintk"内核参数,但这会给出相同的警告。内核无法打开" / dev / console"写作。

我的问题是:

  1. 我可以编写一个简单的字符设备驱动程序并将其用作我的控制台吗?在这个驱动程序中,我计划将所有写入发送到printk。这可能吗 ?

  2. 如何让内核将其用作我的控制台?内核参数" console = / dev / MyDriver"工作?

  3. 是否有更简单的方法让/ init和其他用户进程将我的基本输出设备用作控制台?

  4. 4.还有其他原因导致"警告:无法打开初始控制台。"信息 ?

    感谢任何提示。我是内核编程的新手。

    -neha

1 个答案:

答案 0 :(得分:1)

/dev/console驱动程序的工作方式是连接到其他tty设备(或设备!),然后用于控制台。控制台设备的sysfs属性active(try /sys/class/tty/console/active)将告诉您此时控制台所连接的设备。

内核也倾向于记录控制台更改:

[    0.186989] dw-apb-uart ffc02000.serial0: ttyS0 at MMIO 0xffc02000 (irq = 194, base_baud = 6250000) is a 16550A
[    0.755529] console [ttyS0] enabled

在上面的日志中,一旦创建了串口设备,内核就决定将它用作控制台。这是指设备与内核中的驱动程序绑定,而不是/ dev中的设备节点。后者在这里无关紧要。还要了解控制台设备与tty的连接发生在内核中。 /dev/console不是其他设备节点的符号链接。

内核选择了ttyS0,因为我通过内核命令行console=ttyS0,115200n8告诉它。如果没有控制台参数,内核将使用第一个向register_console()注册的控制台。

所以这里的问题是如何将/ dev / ttyprintk连接到/ dev / console。答案似乎是你不能。

解决方法可能是创建一个自定义initramfs,它将/ dev / console设备节点从major 5 minor 1更改为使用minor 3,从而将其更改为/ dev / ttyprintk。或者symlink实现同样的事情。这应该让init使用ttyprintk作为stdin / stdout / stderr。

在您的示例中,为输出设备编写tty / console驱动程序将是正确的方法。使它成为控制台,然后内核将printk发送到那里。