我对如何进行实际系统调用有疑问。我知道系统调用的魔力(如读取等)是在C库中完成的,但是不了解确切的机制。我的主要问题是
c库例程在用户地址空间中;那怎样才能得到中断服务程序的地址。是否在物理内存中预定义了(启动时)中断服务程序?
即使以某种方式调用ISR例程,地址空间如何变化?我的意思是在我们开始执行ISR之前,'page table base register'将如何变为指向内核的页表。如果“C”例程执行它,那么它如何知道内核页表的地址?
如何将参数从用户空间复制到内核空间?
如果我的问题太基本但我不熟悉,请原谅。 :)
由于 罗希特夏尔
答案 0 :(得分:0)
在大多数系统上,有一条指令可由用户代码执行以调用用户定义的中断(例如,x86上的int
和ARM上的swi
将请求“软件中断” )。
在用户模式下执行的CPU将在看到其中一条指令后切换到内核模式,并将跳转到该特定中断的预定义ISR位置。中断号通常是固定的,相应的ISR是内核的系统调用处理程序。
内核可以检查调用中断时存在的用户模式寄存器和堆栈(以类似于在上下文切换期间保存堆栈上的所有寄存器的方式),并从那里获取系统调用参数
答案 1 :(得分:0)
好吧,我想我找到了答案(至少我是这么认为的) questions about kernel space
1.c库例程在用户地址空间;那怎样才能得到中断服务程序的地址。是中断服务 在物理内存中预定义(启动时)的例程?。
ISR位置已预先定义为上面的nneonneo回答。
2.即使以某种方式调用ISR例程,地址空间如何变化?我的意思是在我们开始执行ISR之前,该页面将如何进行 表格基址寄存器'改为指向内核的页面表。如果 ' C'例程然后如何知道内核页面的地址 表
地址空间没有变化,因为内核空间与用户基本相同(只是保护级别的差异)