第35部分-Linux x86 64位汇编 系统调用

第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传递传输。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值