码迷,mamicode.com
首页 > 系统相关 > 详细

Linux TTY函数跟踪

时间:2018-08-29 01:11:56      阅读:971      评论:0      收藏:0      [点我收藏+]

标签:节点   获取   oom   安装   cccccc   读写   ops   lin   tput   

1. 介绍

本文介绍了TTY打开、TTY读和TTY写操作的函数跟踪过程

2. 示例

下面是一个简单的Linux TTY打开和读写过程

3. 打开

当打开设备节点/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 */

4. 写入

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

5. 读取

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

参考:
<>

Linux TTY函数跟踪

标签:节点   获取   oom   安装   cccccc   读写   ops   lin   tput   

原文地址:https://www.cnblogs.com/hzl6255/p/9551673.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!