系统API和系统调用API的区别

4

我已经阅读过“系统调用API用于用户空间访问,而系统API用于系统空间访问”。我对Linux操作系统的概念还很陌生,对系统API一无所知。有人能解释一下这两者之间的区别吗?


2
你在哪里读到那句话的?能提供一个URL吗? - Basile Starynkevitch
我从我的培训师提供的PDF中读到了这个。我认为他是从查尔斯·克劳利的书中得到的。 - Rari
2个回答

4

系统调用是通过软件中断向内核发出的显式请求。它是与操作系统交互的最低级别的东西。系统调用是当您调用内核时发生的。系统调用实际上旨在成为非常低级别的接口,可以说是针对您的程序无法自行完成的非常特定的功能。

而系统 API 用于调用系统调用。


当然。我还有一个问题。哪些应用程序在用户空间和系统空间上执行,你能给我提供一些例子,并帮我找一个可以阅读更多关于内存管理的网站链接吗?(最好是一个好的) - Rari
没问题。我是新成员,不太清楚规定。 - Rari

1

首先阅读系统调用Linux内核的维基页面。

正如Rahul Triparhi回答的那样,系统调用是从用户模式应用程序中看到的基本操作。使用strace(1)查找某个程序执行的系统调用。

系统调用在man页面的第2节中有很好的文档(在Linux系统的终端上键入man man)。因此,请阅读intro(2),然后阅读syscalls(2)

严格来说,系统调用具有接口,特别是在ABI规范中有明确的规定,如x86-64 ABI,在尽可能低的机器级别上定义 - 以机器指令和寄存器等方式。第2部分中的函数是它们之上的微小C包装器。另请参见Linux Assembly HowTo

请阅读Advanced Linux Programming,其中很好地解释了其中许多内容。

顺便说一句,“系统API”是否有明确定义的含义,我不确定,即使我猜到了可能是什么。还可以参考this question的几个答案。

可能"系统API"是指由POSIX标准化的许多函数,实现在POSIX C库中,如GNU libc(但如果你真的想要的话,你可以在Linux上使用其他libc,如MUSL libc)。我想到的函数有dlopen(动态加载插件)或getaddrinfo(3)(获取一些网络信息)等等... Linux实现(例如dlopen(3))提供了它的超集。

更一般地说,man手册的第3节,参见intro(3),提供了许多库函数(其中大部分建立在系统调用之上,因此dlopen实际上调用了mmap(2)系统调用,而getaddrinfo可能使用系统调用连接到某个服务器 - 参见nsswitch.conf(5)等)。但是有些库函数可能不会执行任何系统调用,例如snprintf(3)sqrt(3)longjmp(3)...(它们只是进行内部计算,不需要任何其他内核服务)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接