Linux系统调用

本文详细介绍了Linux系统调用的工作原理,从用户态如何通过系统调用陷入内核态,到int 0x80中断处理,再到system_call函数和系统调用表的使用。通过分析_X86架构下的syscall接口,揭示了参数传递机制和系统调用号的使用。最后,阐述了如何在Linux内核中增加新的系统调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        系统调用,其实简单的说就是用户态和内核态交互的一种方式。不过是单向,只能用户态向内核态交互而已。

        大家熟知的系统调用有open  read write等。那么系统调用是怎么实现用户态陷入到内核态的呢?相信大家和我一样很好奇,那么就开始我们的探索之旅吧。

        现在Linux2.6.18内核版本后,都改为了使用SYSCALL_DEFINEx来定义系统调用。但是本质上还是sys_xxx的模式。所以我们还是以2.6.18以前版本的内核为基础,从最基本的系统调用知识来展开叙述。SYSCALL_DEFINEx的相关内容会在以后的文章中为大家叙述。

        我们在X86架构下来进行举例。系统调用在用户态,最终都会调用到同样的一组接口。即_syscall0~_syscall6。那么这一组接口是干什么的呢,我们来看一下它的定义(在unistd.h中):

#define _syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \	         : "=a" (__res) \
         : "0" (__NR_##name)); \

__syscall_return(type,__res); \
}
#define _syscall1(type,name,type1,arg1) \
type name(type1 arg1) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
	: "=a" (__res) \
	: "0" (__NR_##name),"b" ((long)(arg1))); \
__syscall_return(type,__res); \
}
#define _syscall2(type,name,type1,arg1,type2,arg2) \
type name(type1 arg1,type2 arg2) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
	: "=a" (__res) \
	: "0" (__NR_##name),"b" ((
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值