tty系统open流程分析

一: Open /dev/XXX

从tty_open 入手分析: open  /dev/ttysxx  打开由底层注册的设备节点
/kernel/driver/tty/Tty_io.c
static const struct file_operations tty_fops = {
    .llseek     = no_llseek,
    .read       = tty_read,
    .write      = tty_write,
    .poll       = tty_poll,
    .unlocked_ioctl = tty_ioctl,
    .compat_ioctl   = tty_compat_ioctl,
**  .open       = tty_open,
    .release    = tty_release,
    .fasync     = tty_fasync,
};

二:open从用户层到底层分析

static int tty_open(struct inode *inode, struct file *filp){
    struct tty_struct *tty;
    int noctty, retval;
    struct tty_driver *driver = NULL;
    int index;

1   //从全局 tty_driver链表中查找给定设备的 tty_driver
    driver = tty_lookup_driver(device, filp, &noctty, &index);{
        static struct tty_driver *get_tty_driver(dev_t device, int *index){
            list_for_each_entry(p, &tty_drivers, tty_drivers) 
        }
    }

2   //根据获取到的tty_driver初始化一个 tty_struct(可以理解为tty_struct是tty_driver的另一种形式)
    tty = tty_init_dev(driver, index, 0){
        struct tty_struct *tty;

         //分配并初始化一个tty_struct
        tty = alloc_tty_struct(driver, idx);{
        2.1//设置线程规程,
            tty_ldisc_init(tty); 
        2.2 //初始化等待队列头
            init_waitqueue_head(&tty->write_wait);
            init_waitqueue_head(&tty->read_wait);
        2.3 //tty_struct->ops 指向  tty_driver->ops 
            tty->driver = driver;
            tty->ops = driver->ops;
            tty->index = idx;
        }

        retval = tty_ldisc_setup(tty, tty->link);{
        2.4 //调用线路规程的 open
            retval = tty_ldisc_open(tty, ld);
        }
    }

3   
    //调用struct tty_struct tty-> tty_foperation(tty_driver).open
    retval = tty->ops->open(tty, filp);{
       retval = uart_startup(state, 0); 
       {
           uart_port_startup
           {
               struct uart_port *uport = state->uart_port;

               //最终调用 uart_port->ops->startup
               retval = uport->ops->startup(uport); 
           }
       }
    }
}

三:小结 :

1  open /dev/ttyxxx  
   1.1  tty_struct->tty_ldisc_ops 绑定到 tty_driver->tty_operations
2  open tty_struct->tty_ldisc_ops->open
3  open uart_driver->uart_ops->startup

猜你喜欢

转载自blog.csdn.net/linuxarmbiggod/article/details/78880353
tty
今日推荐