有人可以在linux中解释这两者的差异吗?请尽可能深入到操作系统的每个步骤。
答案 0 :(得分:9)
内核处理的低级内核调用是系统调用。
手册页说:
2系统调用(内核提供的功能)
3个库调用(程序库中的函数)
图片图片可以说清楚:
和
答案 1 :(得分:8)
观看评论,让我试一试。系统服务是使用提升的权限(通常是内核模式)执行的过程。其他一切都是图书馆电话。
底层硬件为用户应用程序提供了进入内核模式的门。操作系统保护此门以获得基本的系统安全性。
在这里做一些简化 - 处理器使用的常用方法是让进程显式触发异常(英特尔有一个备用的SYSCALL方法)。
系统将具有一组中断/异常向量(指向处理程序过程的指针),用于响应异常或中断(例如,页面错误,除以零)。系统将为硬件异常和中断定义一组向量(通常是低编号的向量)。但是,它们通常会留出供操作系统使用的插槽。
类似的指令:
INT #12
将显式触发异常并在向量中调用第12个过程。系统可能允许您模拟除此之外的异常
让我们假设操作系统使用向量123进行系统服务。
INT #123
会调用系统服务。系统可能为每个系统服务保留一个单独的向量,或者它可以使用一个和分派。
所以你会做这样的事情:
MOVL #23, R0
INT #123
寄存器0中的值23告诉中断处理程序调用系统服务#23。
所以你可以看到这一切都需要汇编语言。每个操作系统所做的是创建可以像高级语言一样调用函数的包装器。
然后是发生的事情的顺序:
用户使用普通参数调用命名包装器。包装器为系统服务设置寄存器和堆栈。
包装器触发调度到系统服务的异常。
然后系统服务必须检查所有参数。这是系统服务开销很高的原因之一。内核模式中的异常导致蓝屏死机。如果系统服务需要写入用户提供的缓冲区,则需要确保它写入的每个字节都是可写内存。
系统服务会做任何需要做的事情。
系统服务执行硬件指令以从异常或中断返回。返回用户模式并返回包装函数。
包装器可以解压缩寄存器中返回的参数。
包装器返回给调用者。
答案 2 :(得分:3)
系统调用和库调用类似,它们由环境提供给应用程序。两者之间的区别在于系统调用是在内核中实现的,而库调用是在用户空间中实现的。要进行系统调用,应用程序必须执行特殊的硬件和系统相关指令(通常是中断或特殊GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
/*........Other attribute here..........*/
[
'attribute' => 'status_dosen',
'value' => function ($data){
return $data->status_dosen==1 ? "Approved": ($data->status_dosen==NULL ? "Pending": "Rejected");
}
],
]);
调用)指令,该指令触发上下文切换并将控制权转发给内核。另一方面,库调用与常规函数调用没有区别(唯一的区别是代码不在主可执行文件中,而是在共享库中)。
答案 3 :(得分:0)
库函数是一个普通的函数,放在称为库的函数集合中。
系统调用是向OS提供服务的请求。