转载:[译] Linux 系统调用权威指南(2016)

http://arthurchiao.art/blog/system-call-definitive-guide-zh/

what

系统调用是一种 程序进入内核执行任务的方式

glibc 提供的 wrapper 封装了底层代码, 如果使用这些 wrapper 函数,只需要传递相应的参数给它就可以进入内核。

在Linux系统中,glibc(GNU C Library)是一个重要的C库,提供了许多系统级别的函数和服务,用于支持应用程序的开发和执行。在glibc中,Wrapper是一种机制,用于在调用底层系统调用之前或之后添加额外的功能或处理。

Wrapper函数是对底层系统调用的封装函数,它们提供了更高级别的接口,并在调用系统调用之前或之后执行一些额外的操作。这些额外的操作可以包括参数验证、错误处理、资源管理、性能统计等。通过使用Wrapper函数,glibc可以为应用程序提供更方便、更安全、更可靠的系统调用接口。

Wrapper函数的命名通常是在原始系统调用函数名前面加上"__"(两个下划线)的前缀。例如,原始的系统调用函数是open(),对应的Wrapper函数是__open()。应用程序在调用系统调用时,通常直接调用Wrapper函数而不是直接调用底层的系统调用函数。

how

用户程序、内核和 CPU 特权级别

用户程序(例如编辑器、终端、ssh daemon 等)需要和 Linux 内核交互,内核代替它们完 成一些它们自身无法完成的操作。

例如,如果用户程序需要做 IO 操作(open、read、write 等),或者需要修改它的 内存地址(mmpa、sbrk 等),那它必须触发内核替它完成。 什么禁止用户程序做这些操作?

原来,x86-64 CPU 有一个特权级别 (privilege levels)的概念。这个概念很复杂,完全可以单独写一篇博客。 出于本文讨论目的,我们将其(大大地)简化为如下:

特权级别是权限控制的一种方式。当前的特权级别决定了允许执行哪些 CPU 指令和操作
内核运行在最高级别,称为 “Ring 0”; 用户程序运行在稍低的一个级别,一般称作 “Ring 3”
用户程序要进行特权操作必须触发一次特权级别切换(从 “Ring 3” 到 “Ring 0”), 由内核(替它)执行。触发特权级别切换有多种方式,我们先从最常见的方式开始:中断

传统系统调用(Legacy system calls)

https://zhuanlan.zhihu.com/p/363290974

posted @ 2024-03-29 16:54  skyycj  阅读(1)  评论(0编辑  收藏  举报