가상 8086 모드
Virtual 8086 mode시리즈의 일부 |
x86 아키텍처용 마이크로프로세서 모드 |
---|
괄호 안에 표시된 첫 번째 지원 플랫폼 |
80386 마이크로프로세서 이후에는 가상 8086 모드(가상 리얼 모드, V86 모드 또는 VM86)를 사용하여 프로세서가 보호 모드 운영 체제를 실행하는 동안 보호 모드에서 직접 실행할 수 없는 리얼 모드 애플리케이션을 실행할 수 있습니다.386 칩을 사용하여 여러 8086 프로세서를 에뮬레이트할 수 있는 하드웨어 가상화 기술입니다.80286 보호 모드만으로는 동시 리얼 모드 애플리케이션을 제대로 [1]실행하기에 적합하지 않았던 고통스러운 경험에서 벗어났습니다.John Crowford는 레지스터 세트로 가상 모드 비트를 개발하여 [2]이 환경으로 전환되었습니다.
VM86 모드는 (호환성을 위해) 실제 모드와 동일한 세그멘테이션 방식을 사용합니다.이 방식은 실제 모드에서 20비트의 물리 주소를 생성하는 것과 동일한 방식으로 20비트의 선형 주소를 생성하지만 보호 모드의 메모리 페이징 메커니즘에 따라 달라집니다.
개요
가상 8086 모드는 보호 모드 작업의 모드입니다.따라서 프로세서는 VM86 태스크와 VM86 태스크 이외의 태스크를 전환할 수 있으므로 멀티태스킹 레거시(DOS) 애플리케이션을 사용할 수 있습니다.
가상 8086 모드를 사용하려면 운영 체제가 가상 8086 모드 모니터를 설정합니다. 이 모니터는 리얼 모드 프로그램을 관리하고 시스템 하드웨어 및 소프트웨어 리소스에 대한 액세스를 에뮬레이트 또는 필터링하는 프로그램입니다.모니터는 특권 수준 0에서 보호 모드로 실행해야 합니다.8086 프로그램만 VM86 모드에서 권한 수준 3으로 실행됩니다.리얼 모드 프로그램이 특정 I/O 포트에 액세스하여 하드웨어 디바이스를 사용하거나 메모리 공간 내의 특정 영역에 액세스하려고 하면 CPU는 이러한 이벤트를 트랩하여 V86 모니터를 호출합니다.V86 모니터는 리얼 모드 프로그램이 무엇을 하려고 하는지 검사하고 하드웨어와 인터페이스하기 위한 프록시 역할을 합니다.는, 리얼 모드 프로그램의 액세스를 시도하고 있거나, 리얼 모드 프로그램이 허가 또는 적절히 서포트되지 않는 조작(머신을 재기동하거나, 비디오 디스플레이를 하드웨어에 의해서 서포트되지 않는 모드로 설정하거나, operating system 코드를 덮어쓰거나 하는 등)을 실행하려고 했을 경우에 종료하고 있었습니다.
또한 V86 모니터는 요청된 작업의 오류를 에뮬레이트하여 사용 권한을 완만하게 거부할 수 있습니다. 예를 들어, 실제로 드라이브를 검사하지도 않았는데 단순히 리얼 모드 프로그램에서 디스크 드라이브에 액세스할 수 없도록 하는 등 디스크 드라이브가 항상 준비되지 않은 것처럼 보일 수 있습니다.또한 V86 모니터는 메모리 페이지 매핑, 호출 및 인터럽트 대행 수신, 리얼 모드 프로그램 프리엠프션 등의 작업을 수행할 수 있으므로 리얼 모드 프로그램을 보호 모드 프로그램처럼 멀티태스킹할 수 있습니다.리얼 모드 프로그램의 하드웨어 및 소프트웨어 I/O를 대행 수신하고 V86 프로그램이 기대하는 상태를 추적함으로써 여러 프로그램이 서로 [a]간섭하지 않고 동일한 하드웨어를 공유할 수 있습니다.따라서 V86 모드에서는 싱글태스킹 환경(DOS 등[b])용으로 설계된 리얼모드 프로그램을 멀티태스킹 환경에서 동시에 실행할 수 있습니다.
사용.
FlexOS 386(1987년 이후), Concurrent DOS 386(1987년 이후), Windows/386 2.10(1987년 이후), DESQview 386(1988년 이후), Windows 3.x(1990년 이후), 멀티유저 DOS(1991년 이후), Windows for Workgroups 3.1x(1992년 이후), OS 46x(2)에서 특정 DOS 프로그램을 실행하기 위해 사용됩니다.가상 DOS 머신을 통한 Windows 95, 98, 98 SE 및 ME, 머지를 통한 SCO UNIX 및 DOSMU를 통한 Linux의 경우 (보호 모드를 사용하는 다른 DOS 프로그램은 에뮬레이터에서 사용자 모드를 사용하여 실행됩니다.)x86 Windows NT 기반 운영 체제의 NTVDM도 VM86 [3]모드를 사용하지만 하드웨어 직접 액세스가 매우 제한됩니다.일부 부트 로더(GRUB 등)는 보호 모드를 사용하여 BIOS 인터럽트 콜을 Virtual 8086 [4][5]모드로 실행합니다.
메모리 어드레싱 및 인터럽트
보호 모드에서 8086 코드를 실행할 때 가장 일반적인 문제는 보호 모드와 실제 모드 간에 완전히 다른 메모리 주소 지정입니다.앞서 설명한 바와 같이 VM86 모드에서 작업함으로써 세그멘테이션 메커니즘은 리얼 모드와 동일하게 동작하도록 재구성되지만 페이징 메커니즘은 여전히 활성화되어 리얼 모드 코드에 대해 투과적입니다.따라서 메모리 보호는 여전히 적용 가능하며 주소 공간의 분리도 마찬가지입니다.
인터럽트(하드웨어, 소프트웨어 및 명령)가 발생하면 프로세서는 VM86 모드를 끄고 완전 보호 모드로 돌아가 인터럽트를 처리합니다.또한 인터럽트를 처리하기 전에 DS, ES, FS 및 GS 레지스터가 새 스택에 푸시되어 0이 됩니다.
Virtual-8086 모드 확장(VME)
Pentium 아키텍처는 가상 8086 모드에 많은 확장 기능을 추가했습니다.다만, 이것들은 이후의 P6(마이크로 아키텍쳐)[6]로부터만 인텔에 의해서 문서화되어 있습니다.그 보다 최근의 정식 명칭은 Virtual-8086 Mode Extensions(VME[7] 약어)입니다(구문서에서는 VME 약어로 [6]「Virtual 8086 mode enhancements」를 사용하는 경우가 있습니다).이후 인텔 486 칩도 이 [8][9]기능을 지원합니다.확장 기능은 주로 8086 가상화 오버헤드에 대처하며 특히 (가상)[6][10] 인터럽트에 초점을 맞춥니다.확장이 P6 문서에 공개 문서화되기 전에 공식 문서에는 유명한 부록 H가 언급되어 있었습니다. 부록 H는 공개 문서에서 제외되어 NDA에 따라 선택된 파트너와만 공유되었습니다.
VME 의 활성화는, CR4 의 비트 번호 0(값의 0x1)을 설정하는 것으로 행해집니다.VME 인터럽트 속도 향상 기능은 비 VM86 보호 태스크에 유용하기 때문에 비트 번호 1(0x2)만 설정하여 개별적으로 활성화할 수도 있습니다.이것을 PVI(Protected Mode Virtual Interrupts)[6][9]라고 부릅니다.프로세서가 VME(PVI 포함)를 서포트하고 있는지를 검출하려면 , CPUID 명령을 사용합니다.초기 EAX 값은 0x1 이며,[11][6] 프로세서에서 VME가 서포트되고 있는 경우에 설정되는 EDX 레지스터의 2번째 비트 값(비트 번호 1, 값의 0x2)을 테스트합니다.Linux 에서는, 이 후자의 비트는, 다음과 같이 보고됩니다. vmflag를 /filename/cpuinfo 파일의 "filename" 섹션에 저장합니다.
가상 8086 모드에서는 IOPL이 3 미만일 때 PUSHF/POPF/STI/CLI/INT/IRET 명령은 실제 32비트 EFLAGS 레지스터의 VIF 값을 시뮬레이션된 16비트 플래그 레지스터의 IF 값(32비트 PUSHF/IRET)으로 처리한다는 기본 개념입니다.VIP는 시뮬레이트된 IF 설정에서 GP 장애를 일으켜 보류 중인 인터럽트를 처리하도록 OS에 지시합니다.PVI는 같은 생각이지만 CLI/STI 명령에만 영향을 줍니다.
제1세대 AMD Ryzen CPU는 VME [12]구현에 장애가 있는 것으로 판명되었습니다.2세대 Ryzen(2000시리즈)에서는 이 [13]문제가 해결되었습니다.
64비트 및 VMX 지원
가상 8086 모드는 x86-64 롱 모드에서는 사용할 수 없지만 레거시 모드에서 실행되는 x86-64 지원 프로세서에서는 사용할 수 있습니다.
Intel VT-x는 x86-64 롱 모드에서 가상 8086 모드를 실행하는 기능을 되돌리지만, 이 기능을 수행하려면 (물리) 프로세서를 VMX 루트 모드로 전환하고 가상 8086 [14]모드에서 실행되는 논리(가상) 프로세서 자체를 실행해야 합니다.
Westmere 이후의 인텔 프로세서는[15] 통상, 「제한이 없는 게스트」기능을 사용해 가상 프로세서를 리얼 모드로 직접 기동할 수 있습니다(이 기능 자체에 확장 페이지 테이블이 필요).이 방법을 사용하면,[16][17] 레거시 BIOS 를 기동하기 위해서, 네스트 된 가상 8086 모드에 의지할 필요가 없어집니다.
AMD-V는 게스트에서도 가상 8086 모드를 수행할 수 있지만 CR0을 사용하여 SVM(Secure Virtual Machine) 모드 게스트를 생성하는 단계를 사용하여 게스트를 "페이징된 실제 모드"로 실행할 수도 있습니다.PE=0, 단 CR0.PG=1(즉, 보호 모드를 사용하지 않도록 설정했지만 페이징을 사용하도록 설정된 경우), 일반적으로 불가능하지만 호스트가 페이지 [18]장애를 가로채는 경우 SVM 게스트에 허용됩니다.
「 」를 참조해 주세요.
메모들
- ^ 예를 들어, 한 프로그램이 디스플레이에 쓰고, 다른 프로그램이 제어권을 얻어 같은 디스플레이에 쓰고, 첫 번째 프로그램이 제어권을 되찾으면 두 번째 프로그램이 디스플레이를 변경하지 않은 것처럼 디스플레이를 사용하려고 합니다.V86 모니터는, 디스플레이의 쓰기를 대행 수신해, 각 프로그램의 표시 상태를 추적해, 유저가 현재 사용하고 있는 프로그램에 따라서, 실제의 표시를 전환할 수 있습니다.V86 모니터는, 1개의 실제의 디스플레이만을 사용해 각 프로그램의 개별의 디스플레이를 에뮬레이트 합니다.
- ^ DOS가 언급되는 것은 인텔이 V86 모드를 설계할 때 특히 염두에 둔 기존 DOS 프로그램의 광범위한 라이브러리였기 때문입니다.
레퍼런스
- ^ Yager, Tom (November 5, 2004). "Sending software to do hardware's job". InfoWorld. Retrieved January 27, 2014.
- ^ Gnomes, Lee; "Behind The Scene:인텔 코퍼레이션, 스페셜 32비트 문제 해결법, 1985년 11월/12월, 19페이지
- ^ "Windows NT 4.0 Workstation Architecture". Microsoft.
- ^ Mike Wang. "Grub2 Booting Process".
{{cite journal}}
:Cite 저널 요구 사항journal=
(도움말) - ^ "Virtual 8086 Mode - OSDev Wiki". wiki.osdev.org. Retrieved 2020-12-10.
- ^ a b c d e T. Shanley (1998). Pentium Pro and Pentium II System Architecture. Addison-Wesley. pp. 427, 465–480. ISBN 978-0-201-30973-7.
- ^ Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3 (3A, 3B, 3C & 3D): System Programming Guide. Intel. May 2020. p. 2-17.
- ^ "Mailing List Archive: Re: 2.6.14: CR4 not needed to be inspected on the 486 anymore?". Gossamer-threads.com. Retrieved 2014-02-20.
- ^ a b "Pentium Protected Mode Virtual Interrupts (PVI)". Rcollins.org. Retrieved 2014-02-20.
- ^ "Virtual Mode Extensions on the Pentium Processor". Rcollins.org. Retrieved 2014-02-20.
- ^ Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2 (2A, 2B, 2C & 2D): Instruction Set Reference, A-Z. Intel. May 2020. pp. 3–199, 3–221, 3–222.
- ^ Michal Necasek (May 12, 2017). "VME Broken on AMD Ryzen". OS/2 Museum.
- ^ "Revision Guide for AMD Family 17h Models 00h-0Fh Processors" (PDF). AMD. June 2018.
- ^ 인텔 64, IA-32건축 소프트웨어 개발자의 매뉴얼권 3B:시스템 프로그래밍 가이드 제2부(PDF).인텔. 2009년 9월. p. 29-1.원본(PDF)에서 1월 5일 2010년. Archived VM항목 페이징과 보호된 모드 또는virtual-8086 모드에서 손님들 수 있었다만 수 있다.다른 프로세서 운영 모드에서 게스트 실행 그 VMM으로써 해결될;(봄은 2007년), 수업 24이곳에서 발견될 수 있는 방법 리눅스( 그렇게 as-is 현재 콘과 함께 일하지 않을 통해 코드의 꽤 구식이에요,)더 최신의 코드에서 이 생략한 것 역시 CS686년:특별한 토픽:인텔 EM64T과 VT확장 알아봐야 해또, 이 샘플 코드는, 가상 8086 모드로 논리 프로세서를 엄밀하게 기동하는 것보다 복잡합니다.이 샘플 코드는, 리얼 모드 BIOS 를 호출하는 것이 최종 목표입니다.
- ^ "Intel Virtualization Technology List". Ark.intel.com. Archived from the original on 2014-02-10. Retrieved 2014-02-20.
A list of Intel processors that support VT-x but not EPT
- ^ 인텔은 Westmere 마이크로아키텍처(architecture)에 제한 없는 게스트 모드를 추가해, EPT를 사용해 게스트의 물리 주소 액세스를 호스트의 물리 주소로 변환합니다.이 모드에서는, 이네이블 페이징을 사용하지 않는 VMEnter 가 허가됩니다.
- ^ "제한되지 않은 게스트" VM 실행 컨트롤이 1인 경우 "EPT 사용" VM 실행 컨트롤도 1이어야 합니다."
- ^ "15.19 Paged Real Mode". AMD64 Architecture Programmer's Manual, Volume 2: System Programming (PDF). Rev. 3.38. Advanced Micro Devices. November 2021. pp. 515–516.
To facilitate virtualization of real mode, the VMRUN instruction may legally load a guest CR0 value with PE = 0 but PG = 1. Likewise, the RSM instruction is permitted to return to paged real mode. This processor mode behaves in every way like real mode, with the exception that paging is applied. The intent is that the VMM run the guest in paged-real mode at CPL0, and with page faults intercepted. The VMM is responsible for setting up a shadow page table that maps guest physical memory to the appropriate system physical addresses. The behavior of running a guest in paged real mode without intercepting page faults to the VMM is undefined.