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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值