欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

linux /dev/console设备解析

linux /dev/console设备解析

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包含相同的设备名字完全是巧合,不同也没事。

来自  https://blog.csdn.net/wangrunmin/article/details/7577807

关于/dev/console的个人理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mxgsgtc/article/details/61628295

嵌入式开发里, 首先需要配置一个串口,用于打印printk信息到控制台,以2440为例 
image.png 
这里的/dev/console(设备号 5, 1),就是控制台,用于printk信息输出到的设备, 但是呢, 
/dev/console是个虚拟设备, 他需要映射到真正的tty设备, 比如2440,会映射到 ttySAC0 
arm335x,会映射到ttyO0,所以内核为了统一方便,就统称命名为/dev/console,之后根据不同的平台在具体的进行映射 
还以2440为例子: 
2440平台架构定义了默认的串口配置:

static struct console s3c24xx_serial_console =
{
    .name       = S3C24XX_SERIAL_NAME, //"ttySAC"
    .device     = uart_console_device,
    .flags      = CON_PRINTBUFFER,
    .index      = -1,
    .write      = s3c24xx_serial_console_write,
    .setup      = s3c24xx_serial_console_setup
};

在内核初始化,会初始化控制台(console)设备 
1.首先分析传入的uboot参数, 即”console=ttySAC0” 
之后 分解出 name= ttySAC, index为0 
3.对比 uboot传入的”ttySAC”与s3c24xx_serial_console .name是否相等 
相等的话,即注册console设备

static struct uart_driver s3c24xx_uart_drv = {
    .owner      = THIS_MODULE,
    .dev_name   = "s3c2410_serial", //显示在/dev下的名字
    .nr     = 3,
    .cons       = S3C24XX_SERIAL_CONSOLE,
    .driver_name    = S3C24XX_SERIAL_NAME,
    .major      = S3C24XX_SERIAL_MAJOR, //204
    .minor      = S3C24XX_SERIAL_MINOR,//64
};

根据上面的驱动结构体可以看出,要注册的驱动设备号为 204, 64, 即index为0的设备 
s3c2410_serial0 
即 ttySAC0 对应2440架构的—-> /dev/s3c2410_serial0(204, 64) 设备 
其中 ttySAC对应的是2440结构 
0对应第1个设备 
ttySAC0 —>/dev/s3c2410_serial0 
ttySAC1 —>/dev/s3c2410_serial1 
ttySAC2 —>/dev/s3c2410_serial2 
总结: 
1.uboot的传入参数 console=”ttySAC0”, 即ttySAC0不是真正的设备, 通过ttySAC来对应平台(因为不同平台对应的名字 不一样), 0代表第1个设备 
2./dev/console指向 (204, 64)的设备, 具体根据平台搜索代码默认的定义 
image.png



来自   https://blog.csdn.net/mxgsgtc/article/details/61628295 

普通分类: