Operating system 有人能给我解释一下编程语言中的系统调用吗?
几天前我开始学习操作系统的概念,现在已经遇到了一些问题。 主要是我对系统调用非常好奇。 我了解到每个操作系统都提供自己的API (如Windows for Windows API、Linux for libc等) 我开始感到困惑的是包装器函数。 例如,Linux有一个fork()包装函数。 这是否意味着此函数中的算法执行系统调用例程 基于操作系统的系统调用表? 我不明白用C写的是什么意思。 这是否意味着它使用的是C标准库?或者仅仅是C编译器? 另外,为什么C编译器会编译它的标准库呢 有不同种类的编译器,如GCC windows C编译器等。? 我好奇的是,C标准库函数也调用系统调用,对吗? 但是为了在不同的操作系统中获得相同的输出,它可能必须调用不同的系统调用,对吗? 这是否意味着,即使是相同的标准C函数,系统调用 每个操作系统的内部实现不同Operating system 有人能给我解释一下编程语言中的系统调用吗?,operating-system,Operating System,几天前我开始学习操作系统的概念,现在已经遇到了一些问题。 主要是我对系统调用非常好奇。 我了解到每个操作系统都提供自己的API (如Windows for Windows API、Linux for libc等) 我开始感到困惑的是包装器函数。 例如,Linux有一个fork()包装函数。 这是否意味着此函数中的算法执行系统调用例程 基于操作系统的系统调用表? 我不明白用C写的是什么意思。 这是否意味着它使用的是C标准库?或者仅仅是C编译器? 另外,为什么C编译器会编译它的标准库呢 有不同种类的
我真的想要一个关于系统调用的好概念(plz:)我只知道一点关于Linux内核的知识,所以我将在回答中以Linux内核为例。要理解系统调用,您必须理解内核空间和用户空间的概念。系统调用是用户空间应用程序与内核通信的接口。因此,系统调用的实现是内核的一部分 首先,Linux内核大部分是用C编写的,部分是用汇编语言编写的。但是Linux内核从未使用任何C标准库函数。因此,在Linux中,用C标准库函数实现系统调用是不可能的 其次,Linux提供数百个系统调用。其中有些是用C语言编写的,但有些是用汇编语言实现的。不仅用C编写的程序可以进行系统调用,大多数其他语言如Ruby、Golang也可以这样做。恕我直言,说系统调用是用C编写的是不正确的
第三,不同的操作系统提供不同的系统调用集。即使相同的操作系统也可以运行在不同的体系结构中,如x86、arm等。不同的体系结构意味着不同的指令集。因此,即使相同的操作系统也可以以不同的方式实现相同的系统调用。因此,我认为您对这一点的理解是正确的。系统调用是底层操作系统公开的功能。语言通常有一种定义良好的方式来发出系统调用。例如,英特尔x86处理器使用的是
syscall
指令,但您也可以使用其他方式,如发出中断指令
当进行系统调用时,会从用户空间转换到内核空间,内核空间以更高的特权级别运行。系统调用的参数被复制到内核空间并进行验证,以确保它们不会损害内核。但是,这些参数很可能也是用户空间中的验证。在某些情况下,用户空间函数将是内核函数的薄包装,而在其他情况下,它们将提供额外的特性
C和Unix有着紧密的传统,这就是为什么许多系统调用名与它们的C版本(例如fork、execXXX)相同的原因。然而,这只是一个惯例,并非所有地方都如此。在Windows上,系统调用的名称与Linux完全不同。但是,平台上的底层C运行时实现对您隐藏了这一点,并进行正确的系统调用以实现C函数提供的功能
通常,像Ruby这样的高级语言不会直接发出系统调用。相反,他们使用的是用低级语言(如C或C++)编写的库,将Ruby调用转换为对底层系统函数的调用。系统调用和包装函数是两个不同的概念