栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【Linux】系统调用与库函数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Linux】系统调用与库函数



文章目录
        • (一)系统调用和库函数
        • (二)用户空间和内核空间
        • (三)当调用系统调用都发生了什么??
        • (四)printf库函数和write系统调用

(一)系统调用和库函数

概念:

  • 系统调用:在内核空间中实现的函数,内核空间中执行(内核态)
  • 库函数:在函数库中实现的函数,用户空间执行(用户态)
(二)用户空间和内核空间

(三)当调用系统调用都发生了什么??

当一个进程在用户空间执行系统调用时,将系统调用号写入eax寄存器并触发0x80中断,此时系统对该程序进行现场保护,CPU停止执行该进程用户空间的代码,进程会从运行态——>阻塞态,系统会让内核执行,内核通过读取eax寄存器中的调用号查询系统调用表,来执行对应的系统调用的内核代码(可能会访问PCB中的信息),内核代码执行完毕后,会进行现场恢复。

通过调用open系统调用加深理解:

  • 用户空间代码调用open系统调用
  • 将系统调用号写入eax寄存器中,并触发0x80中断
  • 系统对用户空间代码数据进行现场保护
  • 进程状态从运行态转成阻塞态
  • 内核从eax得到系统调用号,内核通过查询系统调用表得到内核代码(内核代码执行会访问用户空间的文件表,查询最小的文件描述符,再进行对open的文件分配文件描述符,最终返回写入用户空间的文件表中)
  • 内核代码执行完毕,恢复现场
(四)printf库函数和write系统调用

众所周知,printf是c库函数的打印函数,printf函数有一个输出缓冲区,每次将输出的数据暂时存放在这个缓冲区中,当遇到n或者缓冲区满或者fflush(stdout)来刷出缓冲区中的内容时,就会调用write系统调用将缓冲区中的数据输出在屏幕上。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/655407.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号