关于/dev/console的个人理解

嵌入式开发里, 首先需要配置一个串口,用于打印printk信息到控制台,以2440为例
关于/dev/console的个人理解_第1张图片
这里的/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)的设备, 具体根据平台搜索代码默认的定义
关于/dev/console的个人理解_第2张图片

你可能感兴趣的:(【linux驱动】)