`

系统调用与函数调用的区别

阅读更多

1 、系统调用和库函数的关系

系统调用通过软中断 int 0x80 从用户态进入内核态。

函数库中的某些函数调用了系统调用。

函数库中的函数可以没有调用系统调用,也可以调用多个系统调用。

编程人员可以通过函数库调用系统调用。

高级编程也可以直接采用 int 0x80 进入系统调用,而不必通过函数库作为中介。

如果是在核心编程,也可以通过 int 0x80 进入系统调用,此时不能使用函数库。因为函数库中的函数是内核访问不到的。

2 从用户调用库函数到系统调用执行的流程。

1) 假设用户调用 ssize_t write (int fields, cont void *buff, size_t nbytes); 库 函数。

2) 库函数会执行 int 0x80 中断。因为中断使得进程从用户态进入内核态,所以参数通过

寄存器传送。

3) 0x80 中断对应的中断例程被称为 system call handler 。其工作是:

i. 存储大多数寄存器到内核堆栈中。这是汇编代码写的。

ii. 执行真正的系统调用函数―― system call service routine 。这是 C 代码。

iii. 通过 ret_from_sys_call () 返回,回到用户态的库函数。这是汇编代码。

转自:http://hi.baidu.com/shcup/blog/item/b0a96c1205bbb2ddf7039e95.html

Linux 下对文件操作有两种方式:系统调用 ( system call )和库函数调用( Library functions )。可以参考《 Linux 程序设计》(英 文原版为《 Beginning Linux Programming 》,作者是 Neil Matthew Richard Stones )第三章 : Working with files

1 、系统调用

系统调用提供的函数如 open, close, read, write, ioctl 等,需包含头文件 unistd.h 。以 write 为例:其函数 原型为 size_t write(int fd, const void *buf, size_t nbytes) ,其操作对象为文件描述符或文 件句柄 fd(file descriptor) ,要想写一个文件,必须先以可写权限用 open 系统调用打开一个文件,获得所打开文 件的 fd ,例如 fd=open(\"/dev/video\", O_RDWR) fd 是一个整型值,每新打开一个文件,所获得 的 fd 为当前最大 fd 1 Linux 系统默认分配了 3 个文件描述符值: 0 standard input 1 standard output 2 standard error

系统调用通常用于底层文件访问( low-level file access ), 例如在驱动程序中对设备文件的直接访问。

系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。

系统调用发生在内核空间,因此如果在用户空间的一般应用程序中使用系统调用来进行文件操作,会有用户 空间到内核空间切换的开销。事实上,即使在用户空间使用库函数来对文件进行操作,因为文件总是存在于存储介质上,因此不管是读写操作,都是对硬件(存储 器)的操作,都必然会引起系统调用。也就是说,库函数对文件的操作实际上是通过系统调用来实现的。例如 C 库函数 fwrite() 就是通过 write() 系统调用 来实现的。

这样的话,使用库函数也有系统调用的开销,为什么不直接使用系统调用呢?这是因为,读写文件通常是大 量的数据(这种大量是相对于底层驱动的系统调用所实现的数据操作单位而言),这时,使用库函数就可以大大减少系统调用的次数。这一结果又缘于缓冲区技术。 在用户空间和内核空间,对文件操作都使用了缓冲区,例如用 fwrite 写文件,都是先将内容写到用户空间缓冲区,当用户空间缓冲区满或者写操作结束时,才将用户缓冲区的 内容写到内核缓冲区,同样的道理,当内核缓冲区满或写结束时才将内核缓冲区内容写到文件对应的硬件媒介。

2 、库函数调用

标准 C 库函数提供的文件操作函数如 fopen, fread, fwrite, fclose, fflush, fseek 等,需包含头文件 stdio.h 。以 fwrite 为例,其函数原型为 size_t fwrite(const void *buffer, size_t size, size_t item_num, FILE *pf) ,其操作对象为文件指针 FILE *pf ,要想写一个文件,必须先以可写权限用 fopen 函数打开一个 文件,获得所打开文件的 FILE 结构指针 pf ,例如 pf=fopen(\"~/proj/filename\", \"w\") 。实际上,由于库函数对文件的操作最终是通过系统调用实现 的,因此,每打开一个文件所获得的 FILE 结构指针都有一个内核空间的文件描述符 fd 与之对应。同样有相应的预定义的 FILE 指针: stdin standard input stdout standard output stderr standard error

库函数调用通常用于应用程序中对一般文件的访问。

库函数调用是系统无关的,因此可移植性好。

由于库函数调用是基于 C 库的,因此也就不可能用于内核空间的驱动程序中对设备的操作

转自 http://blog.csdn.net/mmz_xiaokong/archive/2010/03/17/5390372.aspx

理解库函数的区别和系统调用,首先要里理解 Unix kernel mode user mode 。考虑下面的函数段:

int main()

{

int fd = create("filename",0666);

exit(0);

}

在执行 main 函数时,是在 user mode 下执行,当遇到 create 函数时,继续在 user mode 下执行。然后系统将两个参数 "filenam" "0666" 压入栈中或者某个寄存器,接着执行库函数 create 。在库函数 create 执行开始,系统仍然处在 user mode 下,接着系统将 create 系统调用的 unique number 压入寄存器(比如说 r0 ),然后执行指令 trap operating system trap )使系统进入 kernel mode ,并且处理系统调用。这时,系统意识到要进行系统调用的 invoke ,于是从寄存器 r0 中取出 create 系统调用的 unique number ,从系统调用表中查找得知要 invoke 的系统调用是 create ,然后执行。执行完毕后返回库函数 create 的调用,库函数负责检查系统调用的执行情况(检查某些寄存器的值),然后库函数 create 根据检查的结果返回相应的值。

在这里, trap 指令类似于一个系统中断,而系统调用 create 是一个特殊的中断处理函数( inerrupt handler )。

APUE UNIX 环境高级编程)上的陈述:

所有操作系统都提供多种服务的入 口点,由此程序向系统核请求服务。各种版本的 Unix

提供经良好定义的有限数目的入口 点,经过这些入口点进入系统核,这些入口点被称之为

系统调用 (system call) ,系统调用是我们不能更改的一种 Unix 特征。 Unix 版本 7 提供了约

50 个系统调用, 4 3+BSD 提供了约 110 个,而 SVR4 则提供了约 120 个。

系统调用界面总是在 Unix 程序员手册的第二部分中说明。其定义也包括在 C 语言中。这与很 多较早期的操作系统是不同的,这些系统按传统都在机器的汇编语言中定义系统核入口点。

Unix 所使用的技术是为每条系统调用在标准 C 库中设置一个具有同样名字的函数。用户进程用标准 C 调用序列来调用这些函数,然后,函数用系统所要求的技术调用相应的系统核服务。

例如函数可将一个或几个 C 参数送入通用寄存器,然后执行某个产生软中断进入系统核的机器指令。从应用角度考虑,我们可将系统 调用视作为 C 函数。

Unix 程序员手册的第三部分定义了程序员可以使用的通用函数。虽然这些函数可能会调用 一个或几个系统核的系统调用, 但是它们并不是系统核的入口点。例如, printf 函数会调 write 系统调用以进行输出操作,但函数 strcpy( 复制一字符串 ) atoi( 变换 ASCII 为整数 ) 并不使用任何系统调用。

从实施者的角度,系统调用和库函 数之间有重大区别,但从用户角度其区别并不非常重要。 从本书的目的出发,系统调用和库函数在本书中都以正常的 C 函数的形式出现。两者都对应 用程序提供服务,但是,我们应当理解,如果希望的话,我们可以代换库函数,但是通常我们却不能代换系 统服务。

以存储器分配函数 malloc 为例。有多种方法可以进行存储器分配及与其相关的无用区收集 操作 ( 最佳适应,首次适应等 ) ,并不存在对所有程序都最佳的一种技术。 Unix 系统调用中 处理存储器分配的是 sbrk(2) ,它不是一个通用的存储器管理器。它增加或减少指定字节数 的进程地址空间。如何管理该地 址空间却取决于进程。存储器分配函数 malloc(3) 实现一 种特定类型的分配。如果我们不喜欢其操作方式,则我们可以定义自己的 malloc 函数,极 其可能,它还是要调用 sbrk 系统调用。事实上,有很多软件包,它们实现自己的存储器分 配算法,但仍使用 sbrk 系统调用。

从中可见,两者职责不同,相互分 开,要核中的系统调用分配另外一块空间给进程,而库 函数 malloc 则管理这种空间。

另一个可说明系统调用和库函数之 间的差别的例子是, Unix 提供决定当 前时间和日期的界 面。某些操作系统提供一个系统调用以返回时间,而另一个则返回日期。任何特殊的处理 ,例如正常时制和日光节约时制 之间的转换,由系统核处理或要求人的干予。 Unix 则不同 ,它只提供一条系统调用,该系统调用返回国际标准时公元一九七 年一月一日午夜来所以 经过的秒数。对该值的任何解释, 例如将其变换成人们可读的,使用本地时区的时间和日 期,都留给用户进程运行。在标准 C 库中,提供了若干例程以处理大多数情况。这些库函数处理各种细节,例如各种日光节约时算法。

应用程序可以或者调用系统调用, 或者库函数,而很多库函数则会调用系统调用。 另一个系统调用和库函数之间的差别是:系统调用通常提供一种最小界面,而库函数通常 提供比较复杂的功能。我们从 sbrk 系统调用和 malloc 库函数之间的差别中看到了这一点, 在以后当比较不带缓存的 I/O 库数 ( 3 ) 以及标准 I/O 标准 ( 在第 5 ) 时,我们还将看到这 种差别。

进程控制系统调用 (fork exec wait) 通常由用户的应用程序直接调用。 ( 请回忆程序 1.5 的基本 shell) 但是为了简化某些常见的情况, UNIX 系统也提供了一些库函数;例如 system popen 。在 8.12 节中,我们将说明 system 函数的一种实现,它使用基本的进程控制系统调用。在 10.18 中,我们还将强化这一实例以正确地处理信号。

为使读者了解大多数程序员应用的 Unix 系统界面,我们不得不既说明系统调用,只介绍某 些库函数。例如若我们只说明 sbrk 系统调用,那么就会忽略很多应用程序使用的 malloc 库函数。

分享到:
评论

相关推荐

    集团企业数字孪生平台信息化蓝图(应用系统架构、数据架构、IT基础设施与信息安全架构、信息化组织与管控.pptx

    集团企业数字孪生平台信息化蓝图(应用系统架构、数据架构、IT基础设施与信息安全架构、信息化组织与管控.pptx

    基于微信小程序的助农扶贫小程序

    大学生毕业设计、大学生课程设计作业

    node-v6.9.1.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于matlab开发的多元散射校正和变量标准化Matlab处理程序,可以对建模前的原始数据进行校正、处理.rar

    基于matlab开发的多元散射校正和变量标准化Matlab处理程序,可以对建模前的原始数据进行校正、处理.rar

    吉林大学离散数学2笔记 自用.pdf

    吉林大学离散数学2笔记 自用

    MyBatis使用动态SQL的if标签

    mybatis动态sql

    信息办公淘客在线客服管理系统TaokeOCS v3.2 站点版-root.rar

    TaokeOCS v3.2 站点版_root.rar是一个专为淘客设计的在线客服管理系统的JSP源码资料包。这个系统是针对淘宝客服务的一个全面解决方案,它提供了一种高效、便捷的在线客服管理方式。该系统采用JSP技术构建,具有高度的可扩展性和稳定性。通过这个系统,淘客可以方便地管理和跟踪他们的客户,提供实时的在线客服支持。系统的主要功能包括客户信息管理、在线聊天、问题反馈处理、订单管理等。此外,TaokeOCS v3.2 站点版还具有强大的数据分析功能,可以帮助淘客分析客户行为,优化销售策略。系统还提供了丰富的报表和统计图表,让淘客可以直观地了解业务运行情况。总的来说,TaokeOCS v3.2 站点版是一款功能强大、操作简便的在线客服管理系统,是淘客提升服务质量,提高销售效率的得力工具。无论是对于新手还是有经验的淘客,都可以通过这个系统轻松地进行在线客服管理,提高工作效率,增强客户满意度。重新回答||

    hushubo.zip

    hushubo.zip

    node-v12.8.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v9.6.1-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    matlab实现遗传算法matlab源码.zip

    优秀源码设计,详情请查看资源内容

    3D模型004,可用于建模、GIS、BIM、CIM学习

    3D模型004,可用于建模、GIS、BIM、CIM学习

    毕业设计:基于SSM的mysql-口腔护理网站(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_口腔护理网站(源码 + 数据库 + 说明文档) 第二章 可行性分析 5 1. 业务流程描述 5 2. 经济可行性 5 3. 技术可行性 6 4. 运行可行性 6 第三章 需求分析 6 1. 健康管理系统的发展历史与现状 6 2. 健康管理系统的需求分析 7 3. 数据字典 7 第四章 总体设计 8 1.系统模块总体设计 8 2.数据库总体设计 9 3.数据库详细设计 9 第五章 详细设计与实现 11 1.运行环境 11 2.开发工具及技术介绍 11 3.系统界面设计 12 第六章 系统测试与性能分析 13 1.软件测试的概念 13 2.本系统的软件测试 13 3.本系统测试的总结 14

    基于matlab开发的单值分类,包括很多的工具函数,使用时直接调用就可,用起来相当方便的,欢迎大家下载.rar

    基于matlab开发的单值分类,包括很多的工具函数,使用时直接调用就可,用起来相当方便的,欢迎大家下载.rar

    毕业设计:基于SSM的mysql-在线考试系统(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_在线考试系统(源码 + 数据库 + 说明文档) 第2章 主要技术和工具介绍 1 2.1 SSM 框架 1 2.1.1. Spring 框架 1 2.1.2 SpringMVC 2 2.1.3. MyBatis 的选用 2 2.2 mysql数据库 2 2.3 eclipse与Tomcat简介 2 第3章 系统分析 1 3.1可行性分析 1 3.1.1经济可行性 1 3.1.2技术可行性 1 3.1.3操作可行性 1 3.2需求分析 1 3.3业务流程分析 2 3.4数据流程分析 3 第4章 系统设计 6 4.1系统结构设计 6 4.2功能模块设计 6 4.3数据库设计 7 4.3.1数据库设计概述 7 4.3.1概念设计 7 4.3.2表设计 8 第5章 系统实现 13 5.1基本任务 13 5.2登录模块的实现 14 5.2.1首页实现 14 5.2.2管理员后台登录 14 5.3教师用户模块的实现 17 5.3.1试题信息管理模块的实现 17 5.3.2试卷生成管理模块的实现 18 5.4管理员模块的实现 20 5.4.1系统用户管理模块的实现

    毕业设计:基于SSM的mysql-在线读书与分享论坛(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_在线读书与分享论坛(源码 + 数据库 + 说明文档) 2 系统需求设计 5 2.1 系统需求 5 2.2可行性分析 6 2.2.1技术的可行性 6 2.2.2经济的可行性 6 2.2.3操作可行性 7 2.2.4法律的可行性 7 2.4功能模块需求分析 7 3 系统设计 9 3.1系统结构设计 9 3.2 数据库设计 9 3.2.1 数据库实体 10 3.1.2 数据库表设计 12 4 系统的实现 13 4.1 主页的实现 13 4.2 章节信息界面 13 4.3 书籍信息界面 14 4.4 后台管理界面 15 4.6书籍添加管理界面实现 16 4.6书籍类别管理实现 17 5 系统测试 18 5.1 测试的目的及方法 18 5.2功能测试 18 5.3测试用例 19 5.4测试结果 20

    毕业设计:基于SSM的mysql-校园外卖管理系统(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_校园外卖管理系统(源码 + 数据库 + 说明文档) 二 关键技术介绍 3 2.1文件的上传和下载 3 2.2 echarts数据展示 3 2.3 MySQL数据库 4 2.4 java语言 5 2.5 MVC框架介绍 5 2.6 B/S结构 5 2.7小结 6 三 需求分析 7 3.1业务背景及需求分析 7 3.2业务建模 7 3.3系统角色分析 7 3.4系统用例分析 8 1、消费者用例图 8 2、 商户用例图 8 3、 管理员用例图 8 3.5非功能性需求 9 3.6小结 9 四 系统分析与设计 10 4.1系统架构 10 4.2系统功能设计 10 4.3数据库设计 12 4.3.1概念结构设计 12 4.3.2逻辑模型设计 13 4.3.3数据库物理模型设计 14 4.4系统界面设计 14 4.5小结 14 五 系统实现 15 5.1系统实现概述 15 5.1.1系统实现描述 15 5.1.2系统开发工具、语言、编码规范 15 5.2功能模块实现 15 5.2.1校园外卖订餐管理系统首页 15 5.2.2消费者会员登录的实现 15 5.2

    TypeScript-2.3.1.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Python和Flask实现的基于体检数据的城市公共健康可视分析系统源码+使用说明.zip

    优秀源码设计,详情请查看资源内容

    基于matlab开发的简单的TD-SCDMA通信系统仿真

    基于matlab开发的简单的TD-SCDMA通信系统仿真,包括由基本的上下行同步码得到传输用的上下行同步码,信号的调制,通过信道后的解调以及误码率分析。.rar

Global site tag (gtag.js) - Google Analytics