一: 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