【Linux】系统调用与库函数



(一)系统调用和库函数

概念:

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

(二)用户空间和内核空间

请添加图片描述

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

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

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

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

(四)printf库函数和write系统调用

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

猜你喜欢

转载自blog.csdn.net/xiaoxiaoguailou/article/details/121825534