linux系统调用与标准库调用的区别详细解析
函数库中的函数可以没有调用系统调用,也可以调用多个系统调用。编程人员可以通过函数库调用系统调用。
高级编程也可以直接采用int0x80进入系统调用,而不必通过函数库作为中介。如果是在核心编程,也可以通过int0x80进入系统调用,此时不能使用函数库。因为函数库中的函数是内核访问不到的。
2)库函数会执行int0x80中断。因为中断使得进程从用户态进入内核态,所以参数通过寄存器传送。
3)0x80中断对应的中断例程被称为systemcallhandler。
其工作是:
i. 存储大多数寄存器到内核堆栈中。这是汇编代码写的。
ii. 执行真正的系统调用函数??systemcallserviceroutine。这是C代码。
iii.通过ret_from_sys_call()返回,回到用户态的库函数。这是汇编代码。
Linux系统默认分配了3个文件描述符值:
系统调用通常用于底层文件访问(low-levelfileaccess),例如在驱动程序中对设备文件的直接访问。
系统调用是操作系统相关的,因此一般没有跨操作系统的可移植性。
系统调用发生在内核空间,因此如果在用户空间的一般应用程序中使用系统调用来进行文件操作,会有用户空间到内核空间切换的开销。事实上,即使在用户空间使用库函数来对文件进行操作,因为文件总是存在于存储介质上,因此不管是读写操作,都是对硬件(存储器)的操作,都必然会引起系统调用。也就是说,库函数对文件的操作实际上是通过系统调用来实现的。例如C库函数fwrite()就是通过write()系统调用来实现的。
这样的话,使用库函数也有系统调用的开销,为什么不直接使用系统调用呢?这是因为,读写文件通常是大量的数据(这种大量是相对于底层驱动的系统调用所实现的数据操作单位而言),这时,使用库函数就可以大大减少系统调用的次数。这一结果又缘于缓冲区技术。在用户空间和内核空间,对文件操作都使用了缓冲区,例如用fwrite写文件,都是先将内容写到用户空间缓冲区,当用户空间缓冲区满或者写操作结束时,才将用户缓冲区的内容写到内核缓冲区,同样的道理,当内核缓冲区满或写结束时才将内核缓冲区内容写到文件对应的硬件媒介。
相关文章
- 守护Linux系统:守护进程之安全护卫(守护进程linux)
- 实现127.0.0.1的精准同步——Linux系统时间(同步linux系统时间)
- 深入Linux系统:查看系统状态的步骤(查看linux系统状态)
- 位置Linux启动脚本存放之路(linux启动脚本存放)
- 客入侵黑客闯入:Linux系统遭到破坏(linux被黑)
- 使用Linux:从ISO镜像文件下载(linux镜像文件iso下载)
- Linux系统:研究与发展(linux系统论文)
- 【Linux操作系统:拿证明你的技能】(linux操作系统考试)
- Linux在线手册:满足你的每一个指令需求(linux在线手册)
- Linux环境下的Exec函数简介(linux中exec函数)
- 深入探索Linux系统数据盘的查看方法(linux数据盘查看)
- Linux 文件覆盖恢复:从无中重新拾起(linux文件覆盖恢复)
- Linux磁盘监控:解决硬盘问题至关重要(linux磁盘监控)
- 关闭Linux系统的防火墙(关闭linux的防火墙)
- Linux运维日常:确保系统平稳运行(linux运维日常工作)
- “保护你的系统:Linux防篡改软件”(linux防篡改软件)
- 「打造随身携带的Linux系统,简单易用」(linux便携系统)
- 探索Linux下街机模拟器之旅(linux街机模拟器)
- 如何优雅地使用代理管理Linux系统(代理linux)
- Linux系统中 tar 命令的使用(linux中 tar命令)
- 如何在 Linux 上创建系统用户(linux 创建系统用户)
- Linux系统中的病毒扫描:保卫软件安全(linux 病毒扫描)
- Linux 管理之ITOP:精确快速的系统运维解决方案(linux itop)