【发布时间】: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”进行写入。
我的问题是:
我可以编写一个简单的字符设备驱动程序并将其用作我的控制台吗?在这个驱动程序中,我计划将所有写入发送到 printk。这可能吗 ?
如何让内核将其用作我的控制台?内核参数“console = /dev/MyDriver”会起作用吗?
有没有更简单的方法让 /init 和其他用户进程将我的基本输出设备用作控制台?
4.是否有其他原因导致“警告:无法打开初始控制台”。信息 ?
感谢您的任何提示。我是内核编程新手。
-内哈
【问题讨论】:
-
@Chris Tsui:是的。我尝试了答案中提到的步骤。我检查了两个静态设备表(使用 mknod 显式创建设备节点 /dev/console、/dev/ttyS0 等并将它们放入 initramfs)和 devtmpfs。我每次都收到相同的警告。我怀疑这与找不到设备驱动程序有关,但我不确定。
标签: linux-kernel console driver boot