【问题标题】:How an actual system call is made?如何进行实际的系统调用?
【发布时间】:2014-04-16 12:13:58
【问题描述】:

我有一个关于如何进行实际系统调用的问题。我知道系统调用(如读取等)的魔力是在 C 库中完成的,但不了解确切的机制。我的主要问题是

  1. c 库例程在用户地址空间中;那么如何获取中断服务程序的地址呢?中断服务程序是否在物理内存中预定义(启动时)?

  2. 即使以某种方式调用了 ISR 例程,地址空间如何变化?我的意思是在我们开始执行 ISR 之前,“页表基址寄存器”将如何更改为指向内核的页表。如果'C'例程这样做,那么它如何知道内核页表的地址?

  3. 参数如何从用户空间复制到内核空间?

如果我的问题太基本,请原谅,但我是新手。 :)

谢谢 罗希特

【问题讨论】:

    标签: linux unix kernel system-calls systems-programming


    【解决方案1】:

    在大多数系统上,用户代码可以执行一条指令来调用用户定义的中断(例如,x86 上的int 和 ARM 上的swi 将请求“软件中断”)。

    在用户模式下执行的 CPU 将在看到这些指令之一后切换到内核模式,并将跳转到该特定中断的预定义 ISR 位置。中断号通常是固定的,对应的 ISR 是内核的系统调用处理程序。

    内核可以检查调用中断时存在的用户模式寄存器和堆栈(以类似于在上下文切换期间将所有寄存器保存在堆栈上的方式),并从中获取系统调用参数.

    【讨论】:

    • 用户态到内核态的地址空间如何变化?
    【解决方案2】:

    好的,我想我找到了答案(至少我是这么认为的) questions about kernel space

    1.c库例程在用户地址空间;那么如何获取中断服务程序的地址呢?是否中断服务 物理内存中预定义的例程(启动时)?

    ISR 位置由上面的 nneonneo 预定义。

    2.即使以某种方式调用了 ISR 例程,地址空间如何变化?我的意思是在我们开始执行 ISR 之前,“页面”将如何 表基址寄存器'更改为指向内核的页表。如果 'C' 例程执行它然后它如何知道内核页面的地址 桌子?

    地址空间没有变化,因为内核空间与用户基本相同(只是保护级别不同)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-17
      • 2013-05-20
      • 1970-01-01
      • 2022-07-09
      • 2019-04-26
      • 1970-01-01
      • 2012-02-12
      • 2018-11-06
      相关资源
      最近更新 更多