概述
“用户空间”(或称为userland)是指所有在操作系统内核之外运行的代码。用户空间通常指操作系统用于与内核交互的各种程序和库:执行输入/输出、操作文件系统对象、应用软件等。
每个用户空间进程通常在其独立的虚拟内存空间中运行,除非显式允许,否则无法访问其他进程的内存。这是现代主流操作系统实现内存保护的基础,也是权限分离的一个重要组成部分。此外,单独的用户模式还可用于构建高效的虚拟机——参见Popek和Goldberg的虚拟化要求。在拥有足够权限的情况下,进程可以请求内核将其他进程的部分内存映射到自身内存空间中,调试器就是这种情况的一个例子。程序还可以请求与其他进程共享内存区域,尽管也有其他技术可用于进程间通信。
实现方式
实现用户模式与内核模式分离的最常见方法是使用操作系统保护环(protection rings)。保护环通过CPU模式实现,通常内核空间中的程序运行在内核模式(也称为监督模式),而用户空间中的普通应用程序则运行在用户模式。
某些操作系统是单地址空间操作系统,即它们为所有用户模式代码提供一个统一的地址空间(内核模式代码可能在相同的地址空间中,或可能在第二个地址空间中)。其他操作系统为每个用户模式进程提供独立的地址空间,即每个进程有独立的用户态地址空间。
实验性的操作系统则采用另一种方法,即为所有软件提供单一的地址空间,并依赖编程语言的语义来确保内存访问的安全性。应用程序无法获得不允许访问的对象引用。此方法已在JXOS、Unununium及微软的Singularity研究项目中实现。
实现
将用户模式与内核模式分离的最常见方法是通过操作系统的保护环来实现。保护环是使用CPU模式来实施的。通常,内核空间中的程序运行在内核模式(也称为监督模式)下;而用户空间中的普通应用程序则运行在用户模式下。
有些操作系统采用单一地址空间的方式,这意味着所有用户模式代码共享同一个地址空间。(内核模式代码可能与用户模式代码在同一地址空间,或者它可能位于另一个独立的地址空间)。另一些操作系统为每个进程提供独立的地址空间,即每个用户模式进程都拥有一个独立的地址空间。
在某些实验性操作系统中,采取的另一个方法是为所有软件提供一个单一的地址空间,并依赖编程语言的语义来确保无法访问任意的内存。也就是说,应用程序不能获取对不允许访问的对象的引用。这种方法已经在JXOS、Unununium以及微软的Singularity研究项目中得到了实现。