该文件没有与之关联的程序来执行该操作_Liunx tty子系统分析之三 tty字符设备文件操作接口说明...

本章主要介绍tty字符设备文件对应的操作接口,从而说明tty设备的数据打开、关闭、读、写等接口的实现等内容。

tyy file_operations定义

tty字符设备文件操作接口的定义如下,主要包括tty_fops、console_fops、hung_up_tty_fops,其中console_fops为控制台设备的文件操作接口,hung_up_tty_fops为tty设备挂起后的文件操作接口,而tty_fops则为非控制台设备的文件操作接口。

df1facb7a36413f349d8cef3ca48ed47.png

在之前几章的介绍中,我们已经说明过,在tty字符设备文件的打开操作后,完成tty_struct创‘建、tty_struct与tty_port、tty_struct与tty_ldisc等关联,下面我们简要分析下这几个函数。

tty_open接口

针对tty_open接口而言,主要实现如下几个功能:

  1. 若打开的tty设备为控制终端,则通过调用tty_open_current_tty湖区当前进程对应控制终端所对应的tty_struct指针;
  2. 若1中没有找到对应tty_struct,则根据字符设备号从tty_drivers链表中查找已注册的tty_driver,若该tty_driver与对应tty端口的tty_struct已完成绑定,则获取对应的tty_struct指针;
  3. 若以上两步均没有获取到tty端口对应的tty_struct,则说明该tty端口对应的tty_struct还没有创建,则调用tty_init_dev完成tty_struct的创建,并完成tty_struct与tty_driver的绑定、tty_struct与tty_port、tty_struct与ldisc、tty_struct与tty device的绑定操作, 并调用tty_ldisc_setup,进行线路规程的打开(如termios的设置,ldisc的使能、ldisc缓存的初始化等)等等

针对tty_open接口,主要涉及如下几个函数的调用:tty_open_current_tty、tty_driver_lookup_tty、tty_init_dev、initialize_tty_struct、tty_driver_install_tty等接口,而针对tty_init_dev接口而言,则主要实现tty_struct的创建以及各数据结构之间的关联等信息。

tty_init_dev

1. 创建一个tty_struct类型的变量,用于完成一个tty_struct、tty_driver的绑定等操作

2.调用initialize_tty_struct,初始化tty_struct类型变量,包括根据tty端口的id、tty端口对应的device

tty端口对应tty_driver、线路规程等设置该tty_struct对应的成员

3.调用tty_driver_install_tty,完成tty_driver与tty_struct的绑定,并初始化tty_struct的termios参数

4.调用tty_ldisc_setup,打开线路规程的open接口(如设置termios、关闭流控、使能ldisc)等功能

5.完成tty_struct与tty_port的关联

tty_read接口

当执行完成tty_open后,则完成了tty_driver、tty_port、tty device、tty_ldisc、tty_struct等数据结构的关联,则可以与tty端口进行读写操作了。下面说明下tty_read的操作流程。

如下图所示,针对应用程序读tty端口的操作,主要包括如下几个步骤:

  1. 应用程序read调用sys_read接口,由内核的vfs_read接口继续进行读操作;
  2. vfs_read则根据tty字符设备文件inode,调用tty_read进行读操作;
  3. 而tty_read则通过tty_struct获取其关联的tty_ldisc,调用tty_ldisc的read接口;
  4. 在tty_ldisc的read接口中,从tty->ldisc_data中获取已存储的数据,若存储的数据个数小于应用程序所需要读取的个数,则将该读进程加入到tty_struct->read_wait等待队列中,等待数据可读或者超时时间到期时,再次唤醒该读进程。
  5. 在tty_driver的驱动中,在其接收中断中,当接收到数据后,则将数据写入到tty_port的缓存中(调用tty_insert_flip_char执行写入操作),最后调用tty_flip_buffer_push接口,从而执行tty_port的buf对应的工作队列,从而调用其回调函数flush_to_ldisc,而在flush_to_ldisc中会调用tty_ldisc->ops->receive_buff接口,将数据写入到tty->ldisc_data的接收缓存中,并唤醒tty_struct->read_wait,唤醒该等待队列上所有阻塞的读进程。
71136b82f26b4f6bec7baad5f775417b.png

tty_write接口

针对tty_write的操作流程,与tty_read类似,下面说明下tty_read的操作流程。

如下图所示,针对应用程序写tty端口的操作,主要包括如下几个步骤:

  1. 应用程序write调用sys_write接口,由内核的vfs_write接口继续进行读操作;
  2. vfs_write则根据tty字符设备文件inode,调用tty_write进行读操作;
  3. 而tty_write'则通过tty_struct获取其关联的tty_ldisc,调用tty_ldisc的write接口;
  4. 在tty_ldisc的write接口中,调用tty_driver->ops->write接口进行写操作,若当前需要写入的数据没有写完,则将该写进程加入到tty_struct->write_wait等待队列中,等待数据可写或者超时,再次唤醒该写进程。
  5. 在tty_driver的驱动中,在其发送中断中,若该tty端口可继续进行数据的写操作,则调用tty_wakeup,并唤醒tty_struct->write_wait,唤醒该等待队列上所有阻塞的写进程。
ea98a38580da21114fb25da1647858b2.png

tty_poll接口

该接口主要用于select、epoll机制,主要也是借助tty_struct->read_wait、tty_struct->write_wait等待队列,完成tty_poll接口的实现,此处不再展开。

tty_close接口

  1. 若当前tty_struct上仅有一个文件描述符,则该tty_struct变量也可以释放掉,因此需要等待该文件描述符上所有已等待的读写队列成员,并设置tty_struct是可释放的;
  2. 调用tty_del_file,解除该文件描述符与tty_struct的关联;

该接口主要调用release_tty、tty_ldisc_release、tty_ldisc_kill、tty_del_file等接口,用于解除tty_struct、tty_driver、tty_ldisc、tty_port、tty device之间的关联。此处我们对release_tty进行简要说明

release_tty接口

其实现的功能如下:

  1. 调用tty_driver->ops->shutdown,执行tty端口的关闭操作(如关闭收发中断、停止接收与发送等功能);
  2. 调用tty_driver_remove_tty,去除tty_struct与tty_driver的关联
  3. 调用tty_kref_put,tty_struct的引用计数减一,当tty_struct的引用计数为0时,则调用queue_release_one_tty,释放该tty_struct的空间(包括调用tty_struct->cleanup释放tty端口的资源,并释放该tty_struct所占用的空间)

本章主要介绍tty字符设备接口的文件操作接口,其open接口主要完成tty_struct创建、tty_driver、tty_port、tty_ldisc、tty device的关联操作;而读写接口则主要借助等待队列、工作队列完成对tty端口的读写操作。下一章则根据tty__register_driver、tty_port_register_device创建一个虚拟的tty串口驱动,以便我们不借助开发板也可以进行tty子系统驱动的学习工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初学echart的简单使用

简单的echart使用方法 1.引入外部echart的js文件 <script type"text/javascript" src"js/echarts.min.js"></script> 2.建立放置容器&#xff0c;div使用放置容器布局 放置容器配置 <style>body {text-align: center;}#domain1 {widt…

列名 userid 不明确。 表结构_那些你不知道的表结构设计思路

ERP表结构的设计--第9篇用日志记录“开源软件”的诞生赤龙ERP开源地址&#xff1a;点亮星标&#xff0c;感谢支持&#xff0c;与开发者交流 kzca2000码云&#xff1a;https://gitee.com/redragon/redragon-erpGitHub&#xff1a;https://github.com/redragon1985/redragon-erp赤…

PCL—关键点检测(rangeImage)低层次点云处理

博客转载自&#xff1a;http://www.cnblogs.com/ironstark/p/5046479.html 关键点又称为感兴趣的点&#xff0c;是低层次视觉通往高层次视觉的捷径&#xff0c;抑或是高层次感知对低层次处理手段的妥协。 ——三维视觉关键点检测 1.关键点&#xff0c;线&#xff0c;面 关键点 …

lombok的使用三部曲及使用中遇到的问题(持续更新)

lombok的使用 1.安装lombok插件 工欲善其事&#xff0c;必先利其器&#xff08;这一点是不能忘记的&#xff0c;好多小伙伴可能只导入了依赖&#xff0c;却忘了去下载安装插件&#xff09; 2.导入lombok依赖&#xff0c;看准了千万别倒错 导入依赖&#xff0c;记得更新PoM文件…

详细设计说明书示例_专利说明书常用句型汇总

第六课 说明书常用句型1. 以上一般描述和以下的详细说明都只是本发明的示例&#xff0c;并旨在提供概况或框架&#xff0c;用来理解如本发明所主张的本发明的本质和特征。It is to be understood that both the foregoing general description and the following detailed desc…

Please remove usages of `jcenter()` Maven repository from your build scripts and migrate your build

解决步骤如下: 1.打开project下的build.grade 2.将jcenter()注释掉或者直接删除本行代码。 3.sync now

mysql 添加唯一索引_浅谈Mysql索引

文章原创于公众号&#xff1a;程序猿周先森。本平台不定时更新&#xff0c;喜欢我的文章&#xff0c;欢迎关注我的微信公众号。我们都知道&#xff0c;数据库索引可以帮助我们更加快速的找出符合的数据&#xff0c;但是如果不使用索引&#xff0c;Mysql则会从第一条开始查询&am…

Flask第一篇——URL详解

原创 2018-02-14 孟船长 自动化测试实战URL是Uniform Resource Locator的缩写&#xff0c;即统一资源定位符。 一个URL通常由一下几个部分组成&#xff1a; scheme://host:port/path/?query-stringxxx#anchor scheme&#xff1a;代表访问协议&#xff0c;一般为http&#xff0…

Linux优盘挂载卸载以及文件查看

1.插入优盘&#xff0c;连接到虚拟机 这一步差点整死我&#xff0c;老弹出这个也没在意&#xff0c;后来查看盘的时候找不到自己的优盘&#xff0c;傻眼了。 如果你的优盘也是3.0接口&#xff0c;那么请看3.0的正确打开方式: 找到虚拟机设置(我这里下载的是8.0版本的Centos&a…

mysql六:数据备份、pymysql模块

阅读目录 一 MySQL数据备份 二 pymysql模块 一 MySQL数据备份 #1. 物理备份&#xff1a; 直接复制数据库文件&#xff0c;适用于大型数据库环境。但不能恢复到异构系统中如Windows。 #2. 逻辑备份&#xff1a; 备份的是建表、建库、插入等操作所执行SQL语句&#xff0c;适用于中…

Vim案列掌握vim的基本操作——案例一:vim创建编写txt文件

案例一:vim创建编写txt文件 1.vim创建test.txt文件 vim test.txt 2.输入i,I,a,A,o,O,r,R均可&#xff08;这里以i为例&#xff09; 3.保存文件并退出vim。 a.先返回到一般模式 Esc b.冒号切换到命令行模式 : c.保存文件 :w d.退出vim :q successful 退回界面后可以再次…

Vim功能键整理(图片来自mooc)

1.一般模式 2.编辑模式 3.命令行模式

rpn风险等级评价准则_2019一建经济学习重点:技术方案经济效果评价

2019年一级建造师备考正在进行中&#xff0c;你是在看教材还是在刷题呢&#xff1f;今天优路教育小编是来送干货的&#xff0c;教材太厚&#xff0c;知识点太乱&#xff0c;那就来看这里的考点总结吧。接下来小编带大家一起学习《工程经济》第一章工程经济。一建《工程经济》第…

Android编程之页面跳转整理(只涉及关键步骤,需要有一定的基础,小白学习勿入)

自我学习篇: 1.创建你需要的页面&#xff0c;这里演示以创建一个主页和一个 子页进行跳转作为参考。 2.编写layout&#xff0c;这里仅需要创建一个按钮即可&#xff0c;至于样式美观大家可以根据需要进行自我调整。 这里需要注意的是对id的修改&#xff0c;自己应该起一个相对…

电脑无法打开特定网页_监理检测网校电脑微信无法打开公路试验检测视频课程的处理方法...

电脑版微信安装后&#xff0c;通过微信中置顶的监理检测网校公众号&#xff0c;菜单进入网校课程有的人会出现课程打不开&#xff0c;直接打开的是浏览器&#xff0c;无法学习&#xff0c;处理方法如下&#xff1a;电脑上打开微信&#xff0c;左下角三横线图标点开 &#xff0c…

Linux环境下创建运行.java文件

1.下载安装jdk。 一条yum指令就可以搞定了,也可以自己从windows上共享文件进行操作&#xff0c;有些复杂&#xff0c;这里不做详细描述。 以后熟练了&#xff0c;可能进行二更。 yum install java-1.8.0-openjdk* -y 这里需要注意是需要你转换到自己的root权限的 su root 截图…

Linux下的Shell编程之Helloworld.sh看过来

1.编写HelloWorld.sh vim HelloWorld.sh 2.按下i进行编辑 里面的代码如下: #!bin/sh echo "hello world!" 然后Esc退出编辑模式 然后:wq保存并退出vim 小白看参考: 小白vim指令学习 3.运行HelloWorld.sh&#xff08;方式有两种&#xff09; a.sh HelloWorld.sh …

Linux下删除非空文件目录

删除目录大家第一反应应该和我一样都是rmdir 但今天有一个目录里因为配置有好多文件直接烦死&#xff0c;不能rmdir直接删除&#xff0c;要是使用这个指令还要先用cd指令转换到该目录下一个个删除&#xff0c;实在是有点麻烦&#xff0c;最后终于还是找到了正确的打开方式。 …

jdk1.8配置(自我速成)

1.JAVA_HOME 变量名字:JAVA_HOME 变量值:找到自己安装jdk的目录即可&#xff0c;有的教程路径到了bin&#xff0c;但其实到不到都可以。 2.CLASSPATH 变量名:CLASSPATH 变量值&#xff1a; .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 注意这里那个英文的点点不要少了…

Eclipse export导出war包报错(Module name is invalid.)

出于设计模式的作业过程中遇到的问题&#xff0c;老师要求代码文件最后大家要导出war包&#xff0c;前两次还好好的&#xff0c;今天突然报错 这里来说一下原因&#xff0c;也就是web项目可以导出war包&#xff0c;而java项目是不可以的&#xff0c;下面的操作其实本质上就是给…