1.操作系统为什么要提供系统调用?

2.操作系统调用机制是啥?

3.系统调用与一般用户程序有什么区别,与库函数又有什么区别?

电脑系统功能调用,系统功能调用的代码

所谓系统调用,就是用户在程序中调用操作系统所提供的一些子功能。它是通过系统调用命令,中段现行程序而转去执行相应的子程序,以完成特定的系统功能。完成后,控制又返回到发出系统调用命令之后的一条指令,被中断的程序将继续执行下去。\x0d\\x0d\系统调用与一般过程调用不同,其主要区别是:\x0d\\x0d\1.运行的状态不同。在程序中的过程一般或者都是用户程序,或者都是系统程序,即都是运行在同一个系统状态的(用户态或系统态)。\x0d\\x0d\2.进入的方式不同。一般的过程调用可以直接由调用过程转向被调用的过程。而执行系统调用时,由于调用过程与被调用过程是处于不同的状态,因而不允许由调用过程直接转向被调用过程,通常是通过访问管中断(即软中断)进入,先进入操作系统,经分析后,才能转向相应的命令处理程序。\x0d\\x0d\3.返回方式的不同。\x0d\\x0d\4.代码层次不同。一般过程调用中的被调用程序是用户级程序,而系统调用是操作系统中的代码程序,是系统级程序。

操作系统为什么要提供系统调用?

中断是操作系统内核获取CPU的 唯一 方法,正常情况下,CPU会执行用户程序,当内核需要执行行,可以通过中断让内核获取CPU的执行权;

中断的引入是为了程序的并发,当时间片用完,需要进行进程切换的操作,这个操作必须由内核完成,所以发出一个中断让内核获得CPU的执行权,此时CPU处于内核态;

内核态->用户态: 执行一条 特权指令 ——修改 PSW 的标志位为“用户态”,这个动作意味着操作系统 将主动让出CPU使用权

用户态->内核态: 由“中断”引发,硬件自动完成变态过程,触发中断信号意味着操作系统将强行夺 回CPU的使用权

CPU可以访问所有资源,包括所有内存,网卡等硬件资源;

CPU只能受限制的访问部分内存,并且不能直接访问硬件资源;

指特殊权限的指令,这些指令的权限很大,只能由内核调用,如果使用不当,极易造成系统奔溃,常见特权指令的功能有: 清内存、置时钟、分配系统资源、修改虚存的段表和页表,修改用户的访问权限等

一个用于表示系统运行状态的字段,一般用一个寄存器表示,程序状态字PSW(Program Status Word)包括的状态位有:

1. trap: 由 陷入指令 引发,一般是用户程序主动故意触发,比如系统调用

2. fault: 可修复故障,内核修复完成后会将CPU归还给用户程序,常见的可修复故障:缺页

3. abort: 不可修复故障,直接停止该用户程序,常见的有:被除数为0,非法使用特权指令;

1. 时钟中断: 设置一个计时器,到时间会发出一个中断让CPU去执行中断服务程序

2. IO中断: 由硬件产生的中断

CPU中断的实现大概分为两个部分:

注意:中断处理程序是内核程序,所以此时CPU处于内核态;

在了解什么是系统调用之前,我们需要知道什么是操作系统,操作系统是计算机硬件和上层用户之间的接口,这里的上层用户可以是计算机的使用者,也可以是用户程序;

系统调用是操作系统提供给用户进程使用的接口,为了保证操作系统的安全,用户态进程无法访问某些资源,如果需要访问,必须通过系统调用借助内核来实现;

系统中的各种资源都是由操作系统同一管理的,所以设计到资源的使用都必须借助系统调用来完成,比如:内存分配,文件读取,IO操作;这样可以保证系统的安全性,防止用户程序非法操作;

系统调用的原理就是用户态发出一个陷入指令(trap指令,防管指令),触发一个中断,让内核在中断响应程序中去替用户程序做事情;

操作系统调用机制是啥?

系统调用是在运行程序和操作系统之间的接口,通常以汇编语言指令形式提供的。用户在程序中调用操作系统中的功能子模块。或操作系统核心中设置了一组用于实现各种系统功能的子程序,提供用户程序调用。

系统调用与一般用户程序有什么区别,与库函数又有什么区别?

我们暂时使用x86的视窗系统 2000为例:

视窗系统 2000的陷阱调度(Trap Dispatching)机制包括了:中断(Interrupt),延迟过程调用(Deferred Procedure Call),异步过程调用(Asynchronous Procedure Call),异常调度(Exception Dispatching)和系统服务调用。在Intel x86的视窗系统 2000系统中,处理器执行int 0x2e指令来激活视窗系统系统服务调用;在Intel x86的视窗系统 XP系统中处理器却是通过执行sysenter指令使系统陷入系统服务调用程式中;而在AMD的视窗系统 XP中使用了指令syscall来实现同样的功能。

我们先给出一个系统服务调用的模型:

mov eax, ServiceId

lea edx, ParameterTable

int 2eh

ret ParamTableBytes

其中,ServiceId清晰的说明了传递给系统服务调用的系统服务号,内核使用这个标识符来查找系统服务调度表(System Service Dispath Table)中的对应系统服务信息。在系统服务调度表中的每一项包含了一个指向系统服务程式的指针,我们Hook时就是修改这个指针使其指向我们自定义的系统服务的地址。ParameterTable是传递的参数,系统服务调用程式KiSystemService必须严格校验传递的每一个参数,并将其参数从线程的用户堆栈中复制到系统的核心堆栈以备使用。由于执行int指令会导致陷阱发生,所以在视窗系统 2000内的中断描述表(IDT = Interrupt Descriptor Table)中的0x2e项指向了系统服务调用程式。最后返回的ParamTableBytes是关于参数个数的信息。

目前我们已看得出来了,系统服务调用只是个接口,他提供了将用户模式下的请求转发到视窗系统 2000内核的功能,并引发处理器模式的转换。在用户看来,系统服务调用接口就是视窗系统内核组件功能实现对外的一个界面。系统服务调用接口定义了视窗系统内核提供的大量服务。

各个操作系统的实现并不一样,同样操作系统在不同CPU上实现也有区别,但总的来说,操作系统都至少区分两个运行状态——核心态和用户态,系统调用运行在内核态,用户程序运行在用户态。用户态的所有代码都无法直接访问内核态的地址空间,只能通过系统调用(实际上就是系统留给用户的有限的接口)来访问系统功能。这样就保证了系统运行的安全可靠。

库函数直接这样叫是笼统的,如果与命题结合起来,同样也分两类,一类是系统库函数,一般是由操作系统的编写者所提供的,只能由系统调用来使用的函数集,在用户态是无法访问的。它一般没有用户态库函数那么丰富,仅仅为了实现操作系统必不可少的功能而专门设计。而用户态库函数一般是由支持语言的厂商设计提供的(如果用户愿意,也可以自己补充),可以相当丰富,但是它们本质上也还是用户程序,当它们想要运行系统功能的时候,也还是通过系统调用来实现。所以用户态库函数不过是厂家提供的功能完善的一组用户程序集合而已。