/dev/ttyS*属于字符设备,所以在用户空间调用open系统调用打开该类设备,进入到tty核心层后调用的第一个函数是tty_fops中的tty_oepn。tty_open的前面三个判断是根据设备主次设备号来判断设备的类型,分别为/dev/tty(5,0),/dev/tty0(4.0),/dev/console(5,1),分别表示当前控制终端,当前虚拟终端,当前控制台终端。而uart设备对应的设备名为/dev/tty*,另外从uart_driver的定义中也可以看到设备的主设备号为4,次设备号从64开始,所以前面三个判断条件都不满足,直接跳到get_tty_driver()。get_tty_driver()函数就是利用设备的设备号跟tty_drivers链表上面所有的驱动去做比对,看当前设备的设备号是否在驱动所支持的范围里,如果有找到这样的驱动,则返回tty_driver的描述符,并返回该设备在驱动设备链表中的索引位置。
static struct tty_driver *get_tty_driver(dev_t device, int *index)
{
struct tty_driver *p;
list_for_each_entry(p, &tty_drivers, tty_drivers) {
dev_t base = MKDEV(p->major, p->minor_start);
if (device < base || device >= base + p->num)
continue;
*index = device - base;
return tty_driver_kref_get(p);
}
return NULL;
}