sys_write(即调用号为1write系统调用)是 Linux 中的一个基本系统调用,用于向某一文件描述符中写入数据。它从指定的某一内存区域读取数据,并将其写入到目标,返回值为实际写入的字节数。

  • sys_write

    • 函数原型

      1
      ssize_t write(int fd, const void *buf, size_t count);
    • 参数

      • fd: 文件描述符,即写入的位置所在
      • buf: 缓冲区指针,要写入的数据来源
      • count: 要写入多少字节
    • 返回值

      • 成功时返回实际写入的字节数
      • 失败时返回-errno(如EBADF, EPIPE, ENOSPC
  • 用例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    	.section .data
    message:
    .ascii "Hello, World!\n"
    msg_len = . - message

    .section .text
    .globl _start

    _start:
    # 调用 sys_write 输出消息
    mov $1, %rax # 系统调用号 (1 = sys_write)
    mov $1, %rdi # 文件描述符 (1 = stdout)
    lea message(%rip), %rsi # 使得 const void * buf = &message
    mov $msg_len, %rdx # count = msg_len (消息长度)
    syscall # 执行系统调用

    # 退出程序
    mov $60, %rax # 系统调用号 (60 = sys_exit)
    xor %rdi, %rdi # return 0
    syscall

    分析

    上述代码演示了如何使用 sys_write向标准输出(stdout,文件描述符1)写入数据。

    程序首先定义了一个字符串message,并计算其长度msg_len。在_start标签处,程序将系统调用号1sys_write)存入%rax寄存器,将文件描述符1stdout)存入%rdi,将message的地址加载到%rsi,并设置要写入的字节数为msg_len。亦即:

    1
    write(1, &message, msg_len);

    执行syscall指令后,系统调用会将消息数据写入到标准输出,用户可以在终端看到输出的文字。实际写入的字节数会存储在%rax中。

    最后,程序调用sys_exit(系统调用号为60)正常退出,返回值为0表示成功执行。