linux 系统调用
在过去的几年中,我一直在使用容器进行大量工作。 早些时候,我看到了朱利安·弗里德曼 ( Julien Friedman)的一次有趣的演讲,他在几行Go语言中编写了一个准容器。 它给了我一个“哈哈”的时刻,让我了解到容器只不过是Linux进程而对它们所运行的机器的视野有限。
建立此受限视图涉及Golang的syscall软件包中的许多调用 。 最初,我只是以其面值为基础,但是过了一会儿,我想剥离洋葱的下一层,以查看这些syscall的含义以及它们的工作方式。 我将分享我在OSCON上的演讲中学到的知识。
顾名思义, 系统调用是系统调用,它们是您可以从用户空间向Linux内核发出请求的方式。 内核会为您完成一些工作,例如创建一个进程,然后将控制权交还给用户空间。
有一种通用的机制可以使所有系统调用都转换为内核,这由libc库处理。 用户空间代码设置一些寄存器,包括它要进行的系统调用的ID以及需要传递给系统调用的任何参数。 它触发一个“陷阱”以将控制权转移到内核。
这就是用户空间代码发出内核请求的方式,但是Linux也具有伪文件系统,该文件系统允许内核将信息传达给用户空间。 内容看起来像普通目录和文件。
/ proc目录是一个很好的例子。 向内看,您会发现有关计算机上运行的进程的各种有趣信息。 在某些情况下,例如cgroup (控制组),用户空间可以通过写入这些伪文件系统下的文件来配置参数。
当您使用容器时,这特别有趣,因为主机的/ proc包含有关所有容器化进程的信息。 这包括环境变量,它们也存储在/ proc中 伪文件系统,这意味着您的主机可以访问所有正在运行的容器的环境。 如果通过环境变量将证书或数据库密码之类的机密传递到容器中,则可能会带来安全后果。
许多从事普通应用程序的程序员可能不会觉得自己经常使用syscall。 实际上是这样,因为即使日常活动(例如制作文件或更改目录)也涉及Linux上的syscall。
您不必成为系统程序员就可以享受syscall的乐趣!
如果您想了解更多信息,Liz将 在德克萨斯州奥斯汀举行的OSCON 2017上介绍 Syscall入门指南 。 如果您有兴趣参加会议,请 在注册时 使用以下折扣代码 : PCOS 。
翻译自: https://opensource.com/article/17/5/beginners-guide-syscalls
linux 系统调用