嵌入式串口打印信息重定向到当前终端界面

news/2024/10/21 14:16:46

参考

  • https://blog.csdn.net/wuquan_1230/article/details/105782687

在tty_init中会创建/dev/console:

int __init tty_init(void)
{register_sysctl_init("dev/tty", tty_table);cdev_init(&tty_cdev, &tty_fops);cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1);register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty");device_create(&tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");cdev_init(&console_cdev, &console_fops);cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1);register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console");consdev = device_create_with_groups(&tty_class, NULL,MKDEV(TTYAUX_MAJOR, 1), NULL,cons_dev_groups, "console");#ifdef CONFIG_VTvty_init(&console_fops);
#endifreturn 0;
}

其中console_fops的定义如下:

static const struct file_operations console_fops = {.llseek		= no_llseek,.read_iter	= tty_read,.write_iter	= redirected_tty_write,.splice_read	= copy_splice_read,.splice_write	= iter_file_splice_write,.poll		= tty_poll,.unlocked_ioctl	= tty_ioctl,.compat_ioctl	= tty_compat_ioctl,.open		= tty_open,.release	= tty_release,.fasync		= tty_fasync,
};

写/dev/console的时候:

ssize_t redirected_tty_write(struct kiocb *iocb, struct iov_iter *iter)
{struct file *p = NULL;// 这里会有一个通过redirect实现重定向的操作spin_lock(&redirect_lock);if (redirect)p = get_file(redirect);spin_unlock(&redirect_lock);/** We know the redirected tty is just another tty, we can* call file_tty_write() directly with that file pointer.*/if (p) {ssize_t res;res = file_tty_write(p, iocb, iter);fput(p);return res;}return tty_write(iocb, iter);
}

trace日志如下:

 6)               |  ksys_write() { /* <-__arm64_sys_write+0x24/0x34 */6)   1.719 us    |    __fdget_pos(); /* <-ksys_write+0x3c/0xf0 ret=0xffffff88c230d200 */6)               |    vfs_write() { /* <-ksys_write+0x80/0xf0 */6)               |      security_file_permission() { /* <-vfs_write+0xb8/0x2d8 */6)               |        selinux_file_permission() { /* <-security_file_permission+0x5c/0x84 */6) + 52.865 us   |          file_has_perm(); /* <-selinux_file_permission+0x178/0x19c ret=0x0 */6) + 55.990 us   |        } /* selinux_file_permission ret=0x0 */6) + 58.177 us   |      } /* security_file_permission ret=0x0 */6)   1.093 us    |      __get_task_ioprio(); /* <-vfs_write+0x188/0x2d8 ret=0x4004 */6)               |      redirected_tty_write() { /* <-vfs_write+0x1ec/0x2d8 */6)               |        file_tty_write() { /* <-redirected_tty_write+0x8c/0xc4 */6)               |          tty_ldisc_ref_wait() { /* <-file_tty_write+0x64/0x2e8 */6)   0.989 us    |            __ldsem_down_read_nested(); /* <-tty_ldisc_ref_wait+0x40/0x68 ret=0x1 */6)   3.438 us    |          } /* tty_ldisc_ref_wait ret=0xffffff8854c76d80 */6)               |          __check_object_size() { /* <-file_tty_write+0x11c/0x2e8 */6)   0.937 us    |            check_stack_object(); /* <-__check_object_size+0x54/0x2a4 ret=0x0 */6)   0.989 us    |            is_vmalloc_addr(); /* <-__check_object_size+0x84/0x2a4 ret=0x0 */6)               |            pfn_is_map_memory() { /* <-__check_object_size+0xc4/0x2a4 */6)   1.198 us    |              memblock_is_map_memory(); /* <-pfn_is_map_memory+0x24/0x40 ret=0x1 */6)   3.073 us    |            } /* pfn_is_map_memory ret=0x1 */6)   0.990 us    |            __check_heap_object(); /* <-__check_object_size+0x1a4/0x2a4 ret=0xffffff88c302b000 */6) + 10.781 us   |          } /* __check_object_size ret=0xffffff88c302b000 */6)               |          n_tty_write() { /* <-file_tty_write+0x160/0x2e8 */6)               |            down_read() { /* <-n_tty_write+0xac/0x4d8 */6)   1.302 us    |              preempt_count_add(); /* <-__down_read_trylock+0x4c/0x240 ret=0xffffffd19221585c */6)   1.094 us    |              preempt_count_sub(); /* <-__down_read_trylock+0x1e4/0x240 ret=0xffffffd19221585c */6)   5.417 us    |            } /* down_read ret=0x1 */6)   2.657 us    |            add_wait_queue(); /* <-n_tty_write+0x130/0x4d8 ret=0xffffffd193381818 */6)   1.146 us    |            tty_hung_up_p(); /* <-n_tty_write+0x164/0x4d8 ret=0x0 */6)               |            tty_write_room() { /* <-n_tty_write+0x210/0x4d8 */6)   2.760 us    |              uart_write_room(); /* <-tty_write_room+0x3c/0x54 ret=0xfff */6)   4.688 us    |            } /* tty_write_room ret=0xfff */6)               |            uart_write() { /* <-n_tty_write+0x314/0x4d8 */6)   5.157 us    |              qcom_geni_serial_start_tx(); /* <-uart_write+0x250/0x30c ret=0xffffffd19490f490 */6) + 10.781 us   |            } /* uart_write ret=0x1 */6)               |            tty_write_room() { /* <-n_tty_write+0x354/0x4d8 */6)   2.500 us    |              uart_write_room(); /* <-tty_write_room+0x3c/0x54 ret=0xffe */6)   4.271 us    |            } /* tty_write_room ret=0xffe */6)               |            do_output_char() { /* <-n_tty_write+0x364/0x4d8 */6)               |              uart_write() { /* <-do_output_char+0x1b0/0x1e8 */6)   4.166 us    |                qcom_geni_serial_start_tx(); /* <-uart_write+0x250/0x30c ret=0xffffffd19490f490 */6) + 48.229 us   |              } /* uart_write ret=0x2 */6) + 50.469 us   |            } /* do_output_char ret=0x2 */6)               |            uart_flush_chars() { /* <-n_tty_write+0x3b8/0x4d8 */6)               |              uart_start() { /* <-uart_flush_chars+0x18/0x28 */6)   1.406 us    |                qcom_geni_serial_start_tx(); /* <-uart_start+0x13c/0x184 ret=0xffffffd19490f490 */6) + 27.813 us   |              } /* uart_start ret=0xffffffd193381818 */6) + 29.687 us   |            } /* uart_flush_chars ret=0xffffffd193381818 */6)   2.708 us    |            remove_wait_queue(); /* <-n_tty_write+0x410/0x4d8 ret=0xffffffd193381818 */6)               |            up_read() { /* <-n_tty_write+0x46c/0x4d8 */6)   1.094 us    |              preempt_count_add(); /* <-__up_read+0x94/0x3d8 ret=0xffffffd19221585c */6)   1.094 us    |              preempt_count_sub(); /* <-__up_read+0x170/0x3d8 ret=0xffffffd19221585c */6)   5.104 us    |            } /* up_read ret=0xffffffd19221585c */6) ! 129.427 us  |          } /* n_tty_write ret=0x2 */6)               |          __wake_up() { /* <-file_tty_write+0x2bc/0x2e8 */6)   0.260 us    |            __wake_up_common(); /* <-__wake_up+0x84/0xd8 ret=0x1 */6)   2.865 us    |          } /* __wake_up ret=0x0 */6)   0.937 us    |          ldsem_up_read(); /* <-file_tty_write+0x2c8/0x2e8 ret=0x1 */6) ! 154.740 us  |        } /* file_tty_write ret=0x2 */6) ! 158.125 us  |      } /* redirected_tty_write ret=0x2 */6)   1.042 us    |      __fsnotify_parent(); /* <-vfs_write+0x228/0x2d8 ret=0x0 */6) ! 223.802 us  |    } /* vfs_write ret=0x2 */6) ! 230.729 us  |  } /* ksys_write ret=0x2 */

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

count(*)、count(1)哪个更快?面试必问:通宵整理的十道经典MySQL必问面试题Jv

合集 - 面渣逆袭(10)1.阿里面试:Java开发中,应如何避免OOM02-212.美团面试:Kafka如何处理百万级消息队列?02-203.Java异常处理的20个最佳实践:告别系统崩溃02-224.揭秘一线大厂Redis面试高频考点(3万字长文、吐血整理)02-235.美团面试:说说OOM三大场景和解决方案? (绝…

如何使用Python调用API数据

为什么使用Python调用API数据? 简洁的语法:Python的简洁性使得编写API调用代码变得直观易懂。 强大的库支持:Python拥有如requests这样的库,极大地简化了HTTP请求的发送和响应的处理。 数据处理能力:Python的数据处理库,如Pandas,使得数据的分析和处理变得简单。 社区支…

解除网页文本禁止复制限制的六种方法

# 方法一:浏览器扩展 最简单也是最省事的方法,直接安装解除复制限制的扩展完事儿。 下面推荐两款扩展:Simple Allow Copy:Chrome & Edge(Chromium 系的应该都可以) Absolute Enable Right Click & Copy:Chrome & Edge & Firefox使用方法也很简单,在有复…

CAE教程:HyperMesh概述与有限元分析简介

1.1 HyperMesh 概述 本节将介绍有限单元法基本原理,HyperMesh 软件基本功能及界面介绍,获取在线帮助等内容。1.1.1 有限元分析方法简介 有限单元法(FEM)是一种可以精确预测复杂结构在外界载荷作用下响应的方法,该数值方法起源于上世纪 50 年代。在有限单元法出现之前,验证…

使用 Optimum-Intel 和 OpenVINO GenAI 优化和部署模型

在端侧部署 Transformer 模型需要仔细考虑性能和兼容性。Python 虽然功能强大,但对于部署来说有时并不算理想,特别是在由 C++ 主导的环境中。这篇博客将指导您如何使用 Optimum-Intel 和 OpenVINO™ GenAI 来优化和部署 Hugging Face Transformers 模型,确保在最小依赖性的情…

【STC15】面向对象的.h/.c程序架构

.h 文件 #ifndef __MAIN_H_ #define __MAIN_H_/* Includes ------------------------------------------------------------------*/ #include <STC15.h>/* extern variables-----------------------------------------------------------*//* extern function prototype…

服务器和电脑主机有什么区别

服务器和电脑主机在很多方面都有所区别。下面我们将从1、定义;2、用途;3、硬件配置;4、软件配置;5、稳定性和安全性;6、价格等六个方面对这两者进行详细对比。其中,服务器是指提供各类服务的设备;电脑主机通常是指个人电脑(PC),它主要用于个人或者单个用户的需求,例如…

Java 中的数据加密和安全传输_1

在Java中实现数据加密和安全传输涉及几个关键技术:使用加密算法、实施安全的密钥管理、采用安全传输协议。加密算法如AES和RSA用于保护数据的机密性,防止未授权访问。安全的密钥管理确保只有授权用户才能解密数据。而安全传输协议如SSL/TLS保护数据在网络中的传输。其中,安全…