标签:节点 获取 oom 安装 cccccc 读写 ops lin tput
本文介绍了TTY打开、TTY读和TTY写操作的函数跟踪过程
下面是一个简单的Linux TTY打开和读写过程
当打开设备节点/dev/ttyS0时, 内核会调用vfs_open, 然后调用到tty_open, tty_open分析如下
tty_open tty_alloc_file /* 分配tty_file_private并赋值给file::private_data */ tty_open_current_tty /* 如果当前设备是/dev/tty则尝试重新打开, 通常返回NULL */ tty_open_by_driver /* 如果上面的函数返回NULL通过查找tty驱动打开tty设备 */ tty_lookup_driver /* 根据设备号查找对应的tty驱动 */ tty_driver_lookup_tty /* 根据tty_driver::tty_operations::lookup/tty_driver::tty_struct查找tty_struct是否存在 */ tty_reopen /* 如果tty_struct已分配, 则打开该tty */ tty_ldisc_reinit /* 初始化tty设备的线路规程 */ tty_ldisc_get /* 根据类别(默认为N_TTY)获取注册的对应线路规程, 并分配对应tty_ldisc实例 */ tty_set_termios_ldisc /* 设置该tty的线路规程 */ tty_ldisc_open /* 调用tty_ldisc::tty_ldisc_ops::open, 对于N_TTY为n_tty_open */ tty_init_dev /* 如果tty_struct没有分配则进行分配(!!!uart就是如此!!!) */ alloc_tty_struct /* 分配和初始化一个tty_struct, 包括driver, ops, index等 */ tty_ldisc_init /* 初始化tty_struct的线路规程 */ tty_ldisc_get /* 获取N_TTY对应线路规程, 并分配对应tty_ldisc实例 */ tty_struct::tty_operations = tty_driver::tty_operations /* 设置tty_struct的函数操作集 */ tty_driver_install_tty /* 通过tty_driver::tty_operations::install或者tty_standard_install为tty设备安装入口 */ tty_ldisc_setup /* 打开线路规程 */ tty_ldisc_open /* 调用tty_ldisc::tty_ldisc_ops::open, 对于N_TTY为n_tty_open */ tty_add_file /* 关联文件到tty_struce */ tty_struct::tty_operations::open /* 同tty_driver::tty_operations::open, 对于串口即uart_open */
write会调用tty_write, 其分析如下:
tty_write file_tty /* 通过file::tty_file_private::tty_struct获取对应的tty_struct */ do_tty_write /* 调用tty_struct::tty_ldisc::tty_ldisc_ops::write */ n_tty_write /* 对于类型N_TTY的线路规程, write为n_tty_write */ process_echoes /* 处理所有待处理的echoed字符 */ __process_echoes /* 写入待处理的echo字符 */ tty_write_room /* 调用tty_struct::tty_operations::write_room */ echo_buf tty_put_char /* * 调用tty_struct::tty_operations::put_char * 或调用tty_struct::tty_operations::write */ do_output_char /* 调用tty_struct::tty_operations::write */ tty_struct::tty_operations::flush_chars /* */ process_output_block process_output tty_struct::tty_operations::flush_chars tty_struct::tty_operations::write
read会调用tty_read, 其分析如下:
tty_read tty_struct::tty_ldisc::tty_ldisc_ops::read /* 对于类型N_TTY的线路规程, 为n_tty_read */ n_tty_read tty_buffer_flush_work flush_work
参考:
<>
标签:节点 获取 oom 安装 cccccc 读写 ops lin tput
原文地址:https://www.cnblogs.com/hzl6255/p/9551673.html