> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/sys/i386_vm86.2.md).

# i386\_vm86(2)

`i386_vm86` — 控制 vm86 相关功能

## 名称

`i386_vm86`

## 库

Lb libc

## 概要

`#include <sys/types.h>`

`#include <machine/sysarch.h>`

`#include <machine/vm86.h>`

```c
int
i386_vm86(int function, void *data);
```

## 描述

`i386_vm86()` 系统调用用于调用各种 vm86 相关功能。`function` 参数可为以下值之一：

```c
struct vm86_init_args {
        int     debug;
        int     cpu_type;
        u_char  int_map[32];
};
```

```c
struct vm86_intcall_args {
	int	intnum;
	struct	vm86frame vmf;
};
```

```c
struct vm86_vme_args {
	int	state;			/* 状态 */
};
```

**`VM86_INIT`** 这将初始化进程的内核 vm86 参数区，并允许该进程进行 vm86 调用。`data` 参数指向以下结构：`debug` 参数用于启用调试代码。`cpu_type` 参数控制所模拟的 CPU 类型，目前未实现。`int_map` 参数是一个位图，用于确定 vm86 中断应在 vm86 模式中处理，还是反射回进程。如果第 *N* 位被设置，中断将反射到进程；否则由 vm86 中断表分派。

**`VM86_INTCALL`** 这允许进程调用 vm86 中断处理程序。它实际上模拟了一条 INT 指令。`data` 应指向以下结构：`intnum` 指定模拟调用的 INT 操作数。例如，值 0x10 通常用于调用 VGA BIOS。`vmf` 用于根据中断处理程序的调用约定初始化 CPU 寄存器。

**`VM86_GET_VME`** 这用于获取 Pentium(r) 处理器 VME（Virtual-8086 模式扩展）标志的当前状态，即 CR4 的第 0 位。`data` 应初始化为指向以下结构：返回时 `state` 将包含 VME 标志的状态。

vm86 模式通过以正确的 vm86 机器上下文调用 [sigreturn(2)](/sys/sigreturn.2.md) 并设置 `PSL_VM` 位进入。在传递信号时控制返回到进程。

## 返回值

成功完成后返回 0；否则返回 -1，并设置 `errno` 以指示错误。

## 错误

`i386_vm86()` 系统调用将在以下情况下失败：

**\[`EINVAL`]** 内核不支持 vm86，或指定了无效的 function。

**\[`ENOMEM`]** 没有足够的内存初始化内核数据结构。

## 作者

本手册页由 Jonathan Lemon 编写，由 Bruce M Simpson 更新。
