系统调用如何使用linux和除C之外的编程语言

时间:2013-03-09 03:10:53

标签: c linux linux-kernel system-calls

我理解系统调用如何在C语言中与Linux一起工作。我想知道每种编程语言是否都有自己独立的系统库来与内核通信。

  

如果是,则每种编程语言都应该有自己的系统库   使用内核?

     

如果否,则系统如何调用另一种编程语言   在linux?

6 个答案:

答案 0 :(得分:2)

在AMD64 Linux系统调用是通过加载适当的寄存器并执行syscall函数来完成的。在其他架构上,这当然是不同的。

C以外的语言必须对进行系统调用的C函数进行外部调用(这通常更容易,因此也很常见),或者使用适当的处理器指令进行系统调用。

答案 1 :(得分:2)

系统调用是一种从用户空间执行内核驻留函数的机制。

全局视图是系统调用被包含在用户空间函数调用中,该调用接受来自用户的某些参数。这些参数被打包到一个结构中,同时还有一个代码,用于指示要执行的内核驻留函数。然后代码执行一条CPU指令,使其权限级别上升到内核级别,同时执行内核中的代码路径。这称为进入内核。内核中的此代码可以访问为系统调用组装的数据结构。它定位目标代码,为结构中的代码设置参数,并进行调用。它收集返回代码并通过反向遍历路径来安排它返回到用户空间。

在此过程中还会发生其他事情,例如地址空间切换等,但这几乎是概念上发生的事情。

Here are some specific details.

答案 2 :(得分:1)

由于C几乎是21世纪的OS通用语言(在大多数主流操作系统主要用C语言编写的意义上),许多编程语言实现提供了调用C代码的方法。例如,Java有JNI,Python和Ruby参考实现(CPython和CRuby)都提供了创建C扩展模块等的能力。

大多数主流操作系统(包括Linux)通常会公开一个或多个低级C API,用于直接与设备,产生进程等进行交互。更高级别的语言可以包装这些系统调用并使其以语言提供等级到程序员。

答案 3 :(得分:1)

在英特尔架构中,对内核模式功能的任何调用都涉及带有一些参数的中断(系统调用号和linux中的其他参数)。如果任何编程语言想要利用它,它必须提供一个可以编译到正确的程序集中的构造(例如,int 80)。

C和C ++提供了这个。也可以使用编译为本机代码的其他语言来提供此功能。通常,通过某种RPC / COM调用来调用C / C ++功能会更容易。

答案 4 :(得分:0)

大多数语言都有一些方法可以调用通常称为Foreign Function Interface的C函数调用。我列出了一些我遇到过的事情:

Java - JNI
Python, Ruby, Perl, TCL - have extensions for directly calling native C code. Python also provides `ctypes`
Microsoft's CLR - P/Invoke a mechanism to invoke native platform code

答案 5 :(得分:0)

首先,系统调用使用assembly来调用内核--CPU理解的语言。 C编译为汇编。 x86上的系统调用是使用int 0x80或sysenter完成的 - 两者都是由CPU执行的汇编指令。内核本身也是编译代码。您有两种类型的语言编译和解释。 编译后的语言被编译成程序集 - 它们可以在语言本身中有一层自己的代码,一种粘合剂,用syscall实现调用c库,或者它们可以拥有编译成汇编的系统调用的自己的实现。 解释语言是用随机语言编写的编译代码解释器,但编译成在CPU上运行的东西 - 它们有相同的两个选项,但在解释器中 - 不在字节代码中,而不在脚本代码中。