内核空间,用户空间,系统调用三者之间的关系

内核空间,用户空间,系统调用

内核在OS启动时部署在内存上称为“内核空间”的区域中并运行,但其他程序在称为“用户空间”的内存区域中运行。

Shell也在“用户空间”中运行,从shell调用的程序(命令)也在“用户空间”中运行。这是一个通过分离来保护内核的结构。用户空间上的进程访问内核空间的手段是“系统调用”。内核空间,用户空间,系统调用三者之间的关系
正在运行的程序(=进程)可以在自己的内存区域内自由使用(不通过内核),但是在向HDD写入或通过NIC进行网络通信等,在向自己的内存外发送信息时,会问内核。

但是,如果进程可以任意处理内核的请求内容,就会出现安全问题。因此,在系统调用中准备了几种,根据种类决定可以委托的内容。

例如,从文件中读取使用系统调用为read。

同样,写入文件是write,内存请求是malloc,新的进程生成是fork和clone。

都是内核的工作是必要的处理,这样的定型的委托使之使用,随意的委托不能发出的限制,是为了保护内核。

换句话说,内核在结构上受到保护,通过固定的漏洞“系统调用”可以安全地使用内核的功能。

一般用户

用户空间的程序必须被授予“运行用户”。

例如,在多用户环境的Linux的情况下,一般用户在登录时启动shell,一般用户使用该shell进行操作。

Shell的执行用户是登录用户,从shell调用的程序基本上也是其登录用户。

这种绑定到人的用户被称为“普通用户”。

例如,当登录到Linux帐户i.suzuki并启动bash时,bash的执行用户是i.suzuki。

以下是普通用户通过shell使用cat命令时的图像。
内核空间,用户空间,系统调用三者之间的关系

系统用户

另一方面,在Linux服务器等中,即使人不手动登录,程序也会自动启动,对来自网络的请求自动进行应答处理。

例如,DNS服务器的bind的程序和邮件服务器的postfix的程序很有名。

Bind的执行用户是named,postfix的执行用户一般是postfix,但这些用户不能登录。因为没有设置登录shell(在成功登录后可以操作的shell)。(反过来说,如果您设置登录shell,您可以登录。)。

这种不允许登录并用于执行自动启动程序的用户被称为“系统用户(服务用户)”。
内核空间,用户空间,系统调用三者之间的关系
程序只能在执行用户权限内完成。例如,程序的执行用户判断是否可以访问文件系统。

一般用户通过shell当场一边思考一边进行非定型处理。另一方面,系统用户的程序按照预先确定的(编程)进行定型处理。
那个时候不使用shell。

这个想法在GUI环境的Linux和Windows中也是一样的。

在登录时,启动各种程序来提供桌面环境,而不是shell,但运行用户将成为登录用户,访问文件系统也受到执行用户的限制。