Linux+ARM64 系统调用

本文详细介绍了Linux系统调用在ARM64架构中的实现过程,从glibc的系统调用实例开始,讲解了如何通过svc指令进入内核态,异常入口的切换,以及内核中系统调用的定义和处理流程。重点关注了同步异常到系统调用的转换,以及sys_call_table在系统调用处理中的关键作用。
摘要由CSDN通过智能技术生成

前言


用户进程有用户态和内核态两种执行状态,用户进程可以通过系统调用陷入内核态,陷入内核态就意味着可以访问内核的资源。

那么如何陷入内核态呢?一般通过同步异常操作来实现。ARM64专门定义了svc指令,用于进入同步异常,也就是说,一旦执行了svc指令,cpu立即跳转到同步异常入口地址处,从这个地址进入内核态。

从glibc说起


要了解系统调用的完整机制,我们可以从glibc入手,因为glibc有很多的系统调用实例。
我们随便找一个库函数,比如tcsetattr,该函数用于设置终端的属性,它会调用__ioctl函数,__ioctl函数在ARM64中的定义如下:

ENTRY(__ioctl)
	mov	x8, #__NR_ioctl
	sxtw	x0, w0
	svc	#0x0
	cmn	x0, #4095
	b.cs	.Lsyscall_error
	ret
PSEUDO_END (__ioctl)
  • 将系统调用号存放在x8寄存器中
  • 执行svc指令,陷入异常,并且从el0切换到el1。

异常入口


我们首先来看下ARM64的异常向量表:

ENTRY(vectors)
	ventry	el1_sync_invalid		// Synchronous EL1t
	ventry	el1_irq_invalid			// IRQ EL1t
	ventry	el1_fiq_invalid			// FIQ EL1t
	ventry	el1_error_invalid		// Error EL1t

	ventry	el1_syn
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值