第35部分-Linux x86 64位汇编 系统调用
如果对Linux内核有一定的了解,那么理解起来会非常简单。系统调用是用户态程序陷入到内核态的API接口。
每个系统调用都有一个名称和调用号,调用号一旦确认就基本不会改变。现在Linux系统调用有三百多个。
64位系统中可以在文件中找到:
arch/x86/entry/syscalls/syscall_64.tbl
文件定义的是
在Linux环境中可以通过man命令来获取。例如
man 2 exit
其中2表示man页的第二部分。
系统调用格式
我们已经知道EAX寄存器用于保存系统调用值。定义使用内核支持的系统调用中的哪个系统调用。
系统调用示例
.section .data
output:
.ascii "This is a test message.\n"
len:
.int 24
.section .text
.globl _start
_start:
movq $1, %rax
movq $1, %rdi
movq $output, %rsi
movq len, %rdx
syscall
movq $60, %rax
movq $0, %rdi
syscall
as -g -o syscalltest.o syscalltest.s
ld -o syscalltest syscalltest.o
int 80h 和syscall
SYSCALL指令是INT 0X80的64位版本,syscall是在x86-64上进入内核模式的默认方式。
但是仍然可以在64位代码中使用INT 0X80,但是强烈不建议使用了。
int 0x80是调用系统调用的传统方法,应避免使用。
而且syscall具有比int 0x80更少的开销。
int 0x80是选择eax作为系统调用编号,ebx,ecx,edx,esi,edi和ebp传递参数。
Syscall是使用rdi,rsi,rdx,rcx,r8,r9传递传输。