用户程序可以通过系统调用获得 *** 作系统内核提供的哪些服务

用户程序可以通过系统调用获得 *** 作系统内核提供的哪些服务,第1张

库函数是语言本身的一部分,而系统函数是内核提供给应用程序的接口,属于系统的一部分。

函数库调用是语言或应用程序的一部分,而系统调用是 *** 作系统的一部分。

用户应用程序访问并使用内核所提供的各种服务的途径即是系统调用。在内核和用户应用程序相交界的地方,内核提供了一组系统调用接口,通过这组接口,应用程序可以访问系统硬件和各种 *** 作系统资源。

1系统调用是为了方便应用使用 *** 作系统的接口,而库函数是为了方便人们编写应用程序而引出的,比如你自己编写一个函数其实也可以说就是一个库函数。

2系统调用可以理解为内核提供给我们在用户态用的接口函数,可以认为是某种内核的库函数。

3read就是系统调用,而fread就是C标准库函数

解答系统调用是 *** 作系统提供给软件开发人员的惟一接口,开发人员可利用它使用系统功能。os核心中都有一组实现系统功能的过程(子程序),系统调用是对上述过程的调用。因此,系统调用直观上像一个黑箱子,对用户屏蔽 *** 作系统的具体动作而只提供有关的功能。

为了实现系统调用,系统设计人员还必须为实现各种系统调用功能的子程序编造入口地址表,每个入口地址都与相应的系统子程序名对应起来。然后,由陷阱处理程序把陷阱指令中所包含的功能号与该入口地址表中的有关项对应起来,从而有系统调用功能号驱动有关系统子程序执行。

由于在系统调用处理结束后,用户程序还需利用系统调用的返回结果继续执行,因此,在进入系统调用处理之前,陷阱处理机构还需保存处理机现场。再者,在系统调用处理结束之后,陷阱处理机构还要恢复处理机现场。在 *** 作系统中,处理机的现场一般被保护在特定的内存区或寄存器中。系统调用的处理过程如图1-6所示。

系统调用的实现与一般过程调用的实现相比,两者间有很大差异。对于系统调用,控制是由原来的用户态转换为系统态,这是借助于中断和陷入机制来完成的,在该机制中包括中断和陷入硬件机构及中断与陷入处理程序两部分。

中断和陷入硬件机构

图1所示为中断的处理过程。中断可进一步分为外中断和内中断。外中断是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;而内中断则是指由于CPU内部事件所引起的中断,如程序出错(非法指令、地址越界)等。内中断(trap)也被译为“陷入”或“陷阱”。

所谓系统调用,就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现。系统调用是用户程序和内核交互的接口。

整个系统调用的过程可以总结如下:

1. 执行用户程序(如:fork)

2. 根据glibc中的函数实现,取得系统调用号并执行int $0x80产生中断。

3. 进行地址空间的转换和堆栈的切换,执行SAVE_ALL。(进行内核模式)

4. 进行中断处理,根据系统调用表调用内核函数。

5. 执行内核函数。

6. 执行RESTORE_ALL并返回用户模式

下库函数和系统调用的区别:

人们在长期编程中发现使用系统调用有个重大的缺点,那就程序的移植性,比如说:linux系统提供的系统调用的函数和windows就不一样,2者不单单是实现的方式不同,提供给用户的函数名,参数都不同,这个可以理解。因此一个实现好的程序,利用了linux的系统调用譬如说wait4函数,那么他在windows上编译是通不过的。于是人们想了个办法,就是封装了windows和linux系统调用,给大家一个统一的函数(我习惯叫它接口),那么这样程序的移植性问题就解决了。

所以可以这么认为库函数是对系统调用的封装(不是所有的库函数都是),为的是解决一些公共的问题和提供统一的系统调用的接口,他和系统调用的优缺点就是:系统调用速度是明显要快于库函数(并不一定全部是,但绝大部分是),但系统调用缺乏移植性。库函数速度要慢,但解决了移植问题。这些在开发过程中要根据自己的实际情况来决定使用那一个

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

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

以上就是关于用户程序可以通过系统调用获得 *** 作系统内核提供的哪些服务全部的内容,包括:用户程序可以通过系统调用获得 *** 作系统内核提供的哪些服务、 *** 作系统中,什么是系统调用简述其实现过程。、简述系统调用的实现过程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9794331.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存