我正在寻找系统调用机制的良好入门或技术描述,操作系统使用该机制从用户空间转换到内核以调用诸如“打开”、“读取”、“写入”等函数......
除了维基百科条目之外还有其他内容吗?欢迎使用网站、pdf、书籍、源代码 :)
我正在寻找系统调用机制的良好入门或技术描述,操作系统使用该机制从用户空间转换到内核以调用诸如“打开”、“读取”、“写入”等函数......
除了维基百科条目之外还有其他内容吗?欢迎使用网站、pdf、书籍、源代码 :)
确切的方法取决于处理器架构以及它定义的转换到内核模式的操作。一种方法,也是 x86 上的传统方法,是使用软件中断。事实证明,这对于一般情况来说并不是很快,所以后来,英特尔补充道SYSCALL
,AMD 补充道SYSENTER
。Windows XP 及更高版本在启动时为平台选择适当的系统调用技术。
您可以选择为特定功能使用特定的软件中断号,但通常处理器没有足够的中断来覆盖所有系统功能,因此有必要使其中一个寄存器包含所需的功能号。如果你无论如何都这样做,那么只使用一个系统调用函数并不是什么难事。
Windows CE 6.0 之前的版本使用并行进程虚拟地址模型,该模型实际上允许进程直接相互调用。设置页面保护,以便在完成此操作时发生访问冲突错误:内核获得控制权,修复进程地址空间(将被调用进程移动到插槽 0),修复基于插槽 0 的参数指向到调用进程,并返回到用户模式。因为返回地址在另一个进程中,所以当函数调用返回时,会发生相反的过程。不幸的是,这个模型只允许每个进程使用非常小的虚拟地址空间 (32MB) 和少量的进程 (32),因此 Windows CE 6.0 恢复为更传统的系统调用模型。
对于源代码,有很多开源内核可供研究。
至于书籍,Robert Love 的关于 Linux 内核的书内容丰富。
你可能想看看 minix 内核。它是开源的,设计简单,在很多 Uni-level OS 课程中使用。在 /usr/src/kernel/proc.c 中进行挖掘,尤其是 sys_call 函数和周边功能。请记住,minix 是一个微内核,因此有些事情可能与您习惯的略有不同。
如果您想购买一本对 *nix 编程非常有用的书。我会推荐 Stevens 和 Rago 的“UNIX 环境中的高级编程”。它有深入的解释和代码示例。
有关 Linux 中系统调用的详细说明,请查看Linux 设备驱动程序中的示例设备驱动程序。
它依赖于体系结构,并且需要了解计算机体系结构。Tanenbaum 的“结构化计算机组织”很好地总结了系统调用的基础知识。有关更多信息,请阅读任何有关操作系统设计的教科书。