【问题标题】:Booting linux kernel using a simple char driver as console?使用简单的字符驱动程序作为控制台启动 linux 内核?
【发布时间】:2015-11-21 12:06:22
【问题描述】:

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

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

内核一直引导到“/init”的开头。在此之后,看不到任何输出。在此之前,会显示一条警告:“警告:无法打开初始控制台。”我的文件系统映像似乎很好,并且包含一个 /dev/console 节点(我使用 Qemu 进行了检查)。

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

我的问题是:

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

  2. 如何让内核将其用作我的控制台?内核参数“console = /dev/MyDriver”会起作用吗?

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

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

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

-内哈

【问题讨论】:

  • 你读过这个帖子吗?stackoverflow.com/questions/10437995/…
  • @Chris Tsui:是的。我尝试了答案中提到的步骤。我检查了两个静态设备表(使用 mknod 显式创建设备节点 /dev/console、/dev/ttyS0 等并将它们放入 initramfs)和 devtmpfs。我每次都收到相同的警告。我怀疑这与找不到设备驱动程序有关,但我不确定。

标签: linux-kernel console driver boot


【解决方案1】:

/dev/console 驱动程序的工作方式是附加到其他一些 tty 设备(或设备!),然后用于控制台。控制台设备的 sysfs 属性active(尝试/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 设备节点从主要 5 次要 1 更改为使用次要 3,从而将其更改为 /dev/ttyprintk。或符号链接来实现同样的事情。这应该让 init 使用 ttyprintk 作为它的 stdin/stdout/stderr。

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

【讨论】:

  • 感谢您的解释。您答案中的最后一行正是我设法让它发挥作用的方式。我为输出设备写了一个简单的 tty/serial 驱动程序。
猜你喜欢
  • 1970-01-01
  • 2018-07-29
  • 2013-05-25
  • 2018-11-03
  • 2014-02-05
  • 2015-12-31
  • 2015-10-12
  • 1970-01-01
  • 2018-05-25
相关资源
最近更新 更多