sys_write(即调用号为1的write系统调用)是 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标签处,程序将系统调用号1(sys_write)存入%rax寄存器,将文件描述符1(stdout)存入%rdi,将message的地址加载到%rsi,并设置要写入的字节数为msg_len。亦即:1
write(1, &message, msg_len);
执行
syscall指令后,系统调用会将消息数据写入到标准输出,用户可以在终端看到输出的文字。实际写入的字节数会存储在%rax中。最后,程序调用
sys_exit(系统调用号为60)正常退出,返回值为0表示成功执行。