串口

来源:互联网 发布:linux phpmyadmin 403 编辑:程序博客网 时间:2024/04/29 14:28
Subject:[精华] /dev/console是怎么和真正的串口设备相关联上的?
Author: sdssly   Posted: 2005-05-22 17:59    Length:513 byte(s)[Original][Print] [Top]正在一个arm开发板上学习内核。现在启动部分有这个信息:"unable to open an initial console"

原因应该是我还没有加入tty的驱动引起的。我看了一下内核中有关串口的流程,发现启动部分printk的信息可以使用一个单独的注册函数来实现。但是到后来,启动应用程序的时候,需要使用/dev/console设备。我没有明白这个console设备是怎么和驱动联系起来的。

我发现ttyS的驱动主设备号是4,次设备号64。 console的是5,1。open /dev/console的时候,是哪个tty的设备呢?请大家给讲解一下。

 [Original][Print] [Top]Subject:[精华] Re: /dev/console是怎么和真正的串口设备相关联上的?
Author: nek_in   Posted: 2005-05-23 18:46    Length:540 byte(s)[Original][Print] [Top]象你这样的情况,应该使用了2.6的内核,2.4的conole就是个连接,你要用那个设备就连接到那个设备,这种设计实际上在2.6中也可以用。你要是喜欢,这样也可以。2.6对console进行了扩展,具体实现在printk中,任何驱动程序可以调用register_conole把自己注册为一个console,以后printk就能把信息写入所有的conole中了,最后一个注册的conole称为prefer console,init进程的stdin, stdout和stderr都是这个conole,用户可以通过内核启动参数conole=...修改prefer conole,修改以后,init进程的三个标准输入输出就变成这个指定的conole了,如果你要用串口,写conole=/dev/ttySx就可以了。 [Original][Print] [Top]Subject:[精华] Re: /dev/console是怎么和真正的串口设备相关联上的?
Author: sdssly   Posted: 2005-05-23 20:41    Length:502 byte(s)[Original][Print] [Top]谢谢回答!

我使用的是2.6的kernel,也有2.4的kernel。2.6中是因为我没有加入tty的设备程序引起这个错误。所以想看看linux是怎么处理这个console的。在2.4的代码中,没有看出头绪。

开始我也以为这个console就是一个ttyS0的连接,但是看了一下/dev/下的文件,发现不是这样的:
这个console的设备是5,1 ttys0的是4,64。感到非常奇怪,这两个设备是怎么联系起来的?

关于那个启动的参数,也没有发现linux是怎么特别处理的。

能不能再给深入分析一下?
 [Original][Print] [Top]Subject:[精华] Re: /dev/console是怎么和真正的串口设备相关联上的?
Author: nxin   Posted: 2005-05-23 22:09    Length:953 byte(s)[Original][Print] [Top]tty是一类char设备的通称,它们有相同的特性,比如对^C的处理,驱动使用tty_register_driver注册一个tty。

/dev/console是一个虚拟的tty,它映射到真正的tty上,如何映射等会再说。

console有多种含义,这里特指printk输出的设备,驱动使用register_console注册一个console。

console和tty有很大区别:console是个只输出的设备,功能很简单,只能在内核中访问;tty是char设备,可以被用户程序访问。

实际的驱动比如串口对一个物理设备会注册两次,一个是tty,一个是console,并通过在console的结构中记录tty的主次设备号建立了联系。

在内核中,tty和console都可以注册多个。当内核命令行上指定console=ttyS0之类的参数时,首先确定了printk实际使用那个console作为输出,其次由于console和tty之间的对应关系,打开/dev/console时,就会映射到相应的tty上。用一句话说:/dev/console将映射到默认console对应的tty上。

顺便说一句,console=ttyS0和/dev/ttyS0包含相同的设备名字完全是巧合,不同也没事。