如何进行实际的系统调用?

时间:2014-03-12 11:33:05

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

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

  1. c库例程在用户地址空间中;那怎样才能得到中断服务程序的地址。是否在物理内存中预定义了(启动时)中断服务程序?

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

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

  4. 如果我的问题太基本但我不熟悉,请原谅。 :)

    由于 罗希特夏尔

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

  

1.c库例程在用户地址空间;那怎样才能得到中断服务程序的地址。是中断服务   在物理内存中预定义(启动时)的例程?。

ISR位置已预先定义为上面的nneonneo回答。

  

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

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