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