跳至主要内容

在 VOS 和 OpenVOS 中,即使不了解操作系统如何管理用户地址空间的具体细节,您也能完成许多编程任务。但了解这些细节本身很有趣,而且有时为了完成某项任务,您需要调整默认配置。本文将为您介绍 VOS 的用户地址空间。

VOS 用户地址空间被划分为 5 个区域,每个区域都用于特定目的。从最低地址 (@0x) 到最高地址 (@7FFFFFFFx),依次为程序模块区、动态分配的共享虚拟内存区、用户堆、用户栈,以及一个为操作系统自身保留的小区域。 下图展示了这些区域的排列顺序。图中比例并非按实际比例绘制。此图专用于 V 系列实现(VOS 15.0 及更高版本)。

OpenVOS 用户地址空间
程序模块
共享虚拟内存
用户堆
(死区)
用户栈
系统数据

程序模块区的大小固定为 128 MB。系统数据区的大小固定在略低于 2 MB。其余 3 个区域的大小可根据运行程序的需求进行调整。共享虚拟内存区的默认大小为 896 MB。因此,前两个区域共占用 1 GB,即地址空间的一半。  用户堆的默认大小因 VOS 或 OpenVOS 的版本而略有不同。在 Release 17.0 中,默认大小为 64 MB。用户栈的默认大小为 8 MB。堆与栈之间的未使用空间称为“死区”。  由于堆向上扩展(从低地址到高地址),而栈向下扩展(从高地址到低地址),因此“死区”可被堆或栈任一方占用以供扩展。堆、栈和系统数据可用的虚拟内存总量为另外 1 GB。总计而言,用户进程可访问 2 GB 的虚拟内存。

可使用的堆空间总量受管理限制。栈空间以及总空间(即程序模块空间、共享虚拟内存空间、堆空间和栈空间之和)也是如此。  可通过 list_default_cmd_limits 命令查看模块级限制,并通过 update_default_cmd_limits 命令进行修改。新进程将继承这些模块级限制值。进程启动并运行后,可通过 list_process_cmd_limits 命令查看其限制,并通过 update_process_cmd_limits 命令进行修改。

随后,系统会使用这些全局限制值来初始化程序每次执行时所使用的限制。程序启动并运行后,可以调用 s$get_current_cmd_limits 和 s$set_current_cmd_limits 子程序,以在执行期间获取或修改这些限制。  通过这种方式,程序可以为其栈预留比系统初始默认值更大的空间,或者增加其允许使用的堆空间。反之,如果担心因编码错误等原因占用过多空间,程序也可以减少其可使用的空间。

如需了解更多信息,请阅读 update_default_cmd_limits 和 bind 命令的说明。