三、系统调用及实验

本文详细介绍了Linux内核中的保护机制、系统调用原理,包括特权级的概念和检查,以及如何通过int指令进入内核。讨论了系统调用的实现,如write()宏的展开过程,以及如何在kernel/system_call.s中找到对应的内核函数。此外,文章还描述了一个实验,要求在Linux 0.11上添加两个自定义系统调用,并提供了实现步骤和可能遇到的问题。

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

保护机制:将内核程序与用户隔离

特权级

处理器有硬件设计的保护机制,共4个特权级(0级到3级)。数值越大,权限越低。 可以用圆环表示为:
在这里插入图片描述
为了检测特权级,有三种值:

  • 当前特权级 CPL(Current Privilege Level)。这是CPU当前执行程序或任务的特权级存放在 CS 和 SS 寄存器的最低2位。
  • 描述符特权级 DPL(或称为目标段特权级)(Descriptor Privilege Level) DPL 是一个段或门的特权级,存放在段或门描述符的DPL字段中(GDT表中)
  • 请求特权级 RPL(Request Privilege Level)RPL是一种赋予段选择符的特权级,存放在选择符的最低2位
特权级检查

DPL >= CPL
DPL >= RPL
只有同时成立时,才不会触发 一般保护异常
在这里插入图片描述
在这里插入图片描述

系统调用

由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(API)。是应用程序同系统之间的接口。
系统调用,如同电源插头一样,方便了使用,隐藏内部细节。

进入内核的方法

这是用户程序调用内核代码的唯一方式:
用 int 指令中断,将 CPL 改成 0

系统调用的核心
  • 用户程序中包含 int 指令的代码
  • 操作系统写中断处理,获取调用程序的编号
  • 操作系统根据编号执行相应代码
实现

在这里插入图片描述
write() 开始:

/*
 *  linux/lib/write.c
 *
 *  (C) 1991  Linus Torvalds
 */

#define __LIBRARY__
#include <unistd.h>

_syscall3(int,write,int,fd,const char *,buf,off_t,count)

这是一个宏,在unistd.h中有定义:

//...
#define _syscall3(type,name,atype,a,btype,b,ctype,c) \
type name(atype a,btype b,ctype c) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
	: "=a" (__res) \
	: "0" (__NR_##name),"b" ((long)(a)),"c" ((long)(b)),"d" ((long)(c))); \
if (__res>=0) \
	return (type) __res; \
errno=-__res; \
return -1; \
}
//...

观察发现,其中的name参数,在宏中替换为__NR_##name,所以当name = write时,被替换为__NR_write

unistd.h文件中同样可找到出处:

//...
#define __NR_setup	0	/* used only by init, to get system going */
#define __NR_exit	1
#define __NR_fork	2
#define __NR_read	3
#define __NR_write	4
#define __NR_open	5
#define __NR_close	6
//...

可以发现__NR_write是系统调用号,并保存在eax中。
同时eax也存放返回值,ebx,ecx,edx存放3个参数。

int 0x80中断:

init / main.c 中,存在一个函数调用sched_init();
kernel / sched.c中有定义,并在最后调用set_system_gate(0x80,&system_call)

void sched_init(void
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值