当前位置: 首页 > 知识库问答 >
问题:

中断向量中是否有系统调用服务例程?

鲁英卫
2023-03-14

我对系统调用感到困惑。

问题是:是否有一个系统调用服务例程,它总是被调用,以便找到特定的系统调用,如写、读等。?

系统调用是否也存储在函数指针向量中?像这张照片上显示的那样?

如果是这样,为什么有可能添加您自己的系统调用,而没有可能添加您自己的中断处理程序?为什么中断向量是固定大小的,而系统调用向量不是?

引自Silberschatz操作系统概念:

系统调用通常以陷阱的形式到达中断向量中的特定位置。虽然某些系统(如MIPS)具有特定的syscall指令来调用系统调用,但此陷阱可以通过通用陷阱指令执行。

执行系统调用时,硬件通常将其视为软件中断。控制通过中断向量传递到操作系统中的服务例程,模式位设置为内核模式。系统调用服务例程是操作系统的一部分。内核检查中断指令以确定发生了什么系统调用;参数指示用户程序请求的服务类型。请求所需的附加信息可以在寄存器、堆栈或内存中传递(通过指向寄存器中传递的内存位置的指针)。内核验证参数是否正确合法,执行请求,并在系统调用后将控制权返回给指令。

共有1个答案

傅经业
2023-03-14

(以独立于硬件的方式进行概括)

系统调用的工作方式是执行类似于

INT #100

(我在这里的INT指令是您报价中描述的陷阱)。

这会显式触发异常/中断#100。然后CPU在中断向量中查找条目#100,然后在内核模式下调用该例程。

与许多系统一样,我假设中断向量和系统调用向量是相同的。在这样的系统中,系统定义了固定数量的中断和异常。操作系统可以在系统定义的向量之上添加额外的向量。

这就是触发机制。在进入状态之前,系统服务将期望寄存器和堆栈处于定义状态(例如,传递缓冲区和缓冲区大小)。所有这些都需要汇编语言。

因此,大多数系统都有包装器函数,您可以像函数一样调用这些函数,这些函数获取参数,将它们放入寄存器,设置堆栈(可能),触发中断,从寄存器读取返回值,更新参数并返回给调用者。甚至汇编语言程序员也倾向于使用这些包装器。

如上所述,不需要调用系统服务例程来触发内核模式的系统服务。然而,大多数情况下,你这样做是出于方便。

当然,为什么有可能添加您自己的系统调用,而没有可能添加您自己的中断处理程序呢?

硬件异常和中断由 . . . . 硬件预定义。它们是固定的。

为什么中断向量是固定大小的,而系统调用向量不是?

您所指的系统似乎有单独的中断向量和系统服务向量。大多数(但不是所有)系统都将它们结合在一起。CPU识别的中断和异常的数量是固定的,并在硬件中定义。一个操作系统可以定义任意数量的系统服务。

如果系统对每个类都有单独的向量,硬件向量是固定的,系统调用向量可以是任何大小,以考虑不同操作系统可以提供的无数系统服务集。

如果系统有一个向量,那么硬件处理程序首先出现,随后通常会出现任意数量的软件系统服务。将有一个寄存器定义向量的长度。

 类似资料:
  • 问题内容: 我正在用python编写程序。我希望阅读stdin并处理sigchld。我想处理输入中的任何一个,但不要旋转(以推测方式采样输入)。 在我进行的每个调用中,我都无法捕获被信号打断的系统调用。 我会以错误的方式处理吗?我可以不用try / except使它正常工作吗? 我主要担心的不是到目前为止的try / except。但是在程序中其他代码行中,我将需要数百人。在我看来,这似乎不是模块

  • 问题内容: 我的用户空间应用程序有时会在收到EINTR信号后以某种方式阻塞。 我用strace记录的内容: 我可以捕获EINTR信号吗,如何重复有关的调用,例如写入,读取或选择?即使使用与系统调用一起使用的第三方库,我如何确定EINTR发生在哪里? 为什么收到EINTR后我的应用程序被完全阻止(请参阅strace转储:我发送了SIGUSR1,通常应该处理)?为什么futex()将ERESTARTS

  • 我一直收到这个间歇性的错误,即使只是投票应用程序。我的应用程序相当简单,至少目前,它只是通过JSON向jQuery表提供一个小csv文件。下面列出了回溯和我的系统配置。提前感谢! 回溯(最后一次调用):文件“manage.py”,第14行,在execute_manager(设置)文件“/home/baldig/shared_libraries/centos64/pkgs/python/2.6.5/

  • 本文向大家介绍php  PATH_SEPARATOR判断当前服务器系统类型实例,包括了php  PATH_SEPARATOR判断当前服务器系统类型实例的使用技巧和注意事项,需要的朋友参考一下 php中有一个非常有用的预定义常量PATH_SEPARATOR,我们可以通过该常量来判断当前服务器是linux还是Windows。本文将向大家讲解php使用PATH_SEPARATOR获取当前服务器的类型。

  • 我一直在寻找一种合适的方法来衡量Linux操作系统中各种系统调用的成本。过去有许多与此主题相关的问题,没有一个提供如何准确测量的详细描述。大多数答案都武断地宣称,系统调用的成本为1-2us,如果它在CPU上缓存,则为100个周期。 系统调用开销 系统开销 我能想到的测量系统调用成本的天真方法是在getpid()等系统调用中使用rdtscp指令。然而,这不足以准确测量open()、read()或wr

  • 中断(英语:Interrupt)是指 处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断。 通常,在接收到来自外围硬件(相对于中央处理器和内存)的异步信号,或来自软件的同步信号之后,处理器将会进行相应的 硬件/软件 处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过一个运行信息切换(context switc