ZBLOG

write函数是如何将打印写入到标准输出 再到console 再到串口的

在Linux系统中,write 函数将数据写入标准输出(如 printf 最终调用 write),并最终显示到终端或串口的过程涉及 文件描述符、设备驱动内核子系统 的协作。以下是完整的流程分析:


1. 用户层:write 系统调用

当程序调用 write(STDOUT_FILENO, buf, len)(或通过 printf 间接调用)时:

  • STDOUT_FILENO(文件描述符1)默认绑定到当前进程的 标准输出
  • write 触发软中断(如 int 0x80syscall),进入内核态。

2. 内核层:虚拟文件系统(VFS)

内核通过虚拟文件系统抽象所有设备的操作:

  • VFS路由:根据文件描述符找到对应的 struct file,其内部指向一个 文件操作表file_operations)。
  • 标准输出的绑定
    • 如果输出到终端(如 /dev/console),实际调用的是终端驱动的 tty_write()
    • 如果重定向到文件,则调用对应文件系统的写方法。

3. TTY子系统:终端的核心处理

Linux中所有终端设备(包括串口)通过TTY子系统管理:

(1) TTY设备类型

  • 控制台终端(Console)
    物理显示器+键盘,对应 /dev/console
  • 虚拟终端(Virtual Terminal, VT)
    如Ctrl+Alt+F1切换的终端,设备名为 /dev/ttyN
  • 串口终端(UART)
    /dev/ttyS0(COM1)。

(2) TTY驱动处理流程

graph LR
    write --> tty_write --> line_discipline --> tty_driver->uart_write
  • tty_write():TTY核心层的通用写函数。
  • 线路规程(Line Discipline):处理特殊字符(如退格、换行转换等)。
  • 底层驱动回调:最终调用具体硬件的写函数(如串口的 uart_write())。

4. Console与串口的关联

(1) Console的输出路径

  • Kernel参数可能指定 console=ttyS0,115200,此时:
    • /dev/console 会绑定到串口设备。
    • printk() 的内核日志也会输出到该串口。

(2) UART驱动的工作

  • CPU通过内存映射寄存器操作UART硬件。
  • UART驱动将数据写入FIFO缓冲区,硬件自动按波特率发送到串口线。

关键代码示例

(1) Shell命令查看当前终端

# 查看当前进程的终端设备
$ tty
/dev/tty1    # Virtual Terminal示例
/dev/pts/0   # SSH远程伪终端示例

# Kernel启动参数中的Console设置
$ cat /proc/cmdline
BOOT_IMAGE=/vmlinuz console=ttyS0,115200 root=/dev/sda2

(2) UART驱动的写操作简化逻辑

// drivers/tty/serial/uart_core.c
static int uart_write(struct uart_port *port, const unsigned char *buf, int count) {
    while (count--) {
        while (!(port->regs->LSR & UART_LSR_THRE)) 
            cpu_relax(); // 等待发送缓冲区空
        port->regs->THR = *buf++; // 写入UART发送寄存器
    }
}

5. FAQ常见疑问

Q: printf如何变成write?

  • glibc的printf内部会缓冲数据,最终调用 write(STDOUT_FILENO, ...)

Q: SSH远程登录时的输出路径?

  • SSH会创建伪终端(PTY):
     
     /dev/pts/N → PTY Master(sshd) → PTY Slave(shell) → TCP/IP网络 → 客户端屏幕
    

Q: Kernel日志如何输出到串口?

  • Bootloader传递 console=ttyS0参数后,printk会直接调用UART驱动。

如果需要更具体的场景分析(如嵌入式板卡调试),可以提供硬件环境细节进一步探讨!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=8145

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?