您的位置:首页 > 运维架构

tty系统open流程分析

2017-12-23 15:51 1021 查看


一: 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: