64 비트 OS가 16 비트 응용 프로그램을 실행할 수없는 이유는 무엇입니까?


38

왜 그럴까요?

  • 64 비트 CPU에 설치된 32 비트 OS는 이전 16 비트 응용 프로그램을 실행할 수 있습니다.
  • 그러나 64 비트 OS를 설치하면 해당 응용 프로그램을 직접 실행할 수 없으며 일종의 에뮬레이션이 필요합니다 (항상 완벽하게 작동하지는 않습니다)?

좀 더 구체적으로 말하면 64 비트 프로세서 (Intel Core 2 Duo)가 있습니다. Windows XP와 Windows 7 (32 비트 모두)을 설치하면 이전 DOS 및 616 비트 Windows 응용 프로그램을 실행할 수 있습니다.

이제 64 비트 버전의 Windows 7을 설치했습니다. 왜 동일한 응용 프로그램을 더 이상 실행할 수 없습니까?


3
게스트 운영 체제와는 조금 관련이 있다고 생각합니다. 어떤 OS를 구체적으로 언급하고 있습니까?
페카는 GoFundMonica 지원

DOSBox에서 실행됩니까?
Penguat

1
16 비트 에뮬레이터 인 DOSBOX 라는 16 비트 프로그램에 가상 16 비트 컴퓨터를 제공 하는 무료 유틸리티가 있습니다 .

Pekka에 동의합니다. 사실 64 비트 (하드웨어) 시스템 16 비트 코드를 실행할 수 있습니다 (OS가 그렇게 설계된 경우 1 비트 코드까지도 가능). 실제로는 포인터 크기가 다르기 때문에 CPU가 16 비트 코드를 직접 실행할 수 없지만 이러한 문제는 OS에 의해 추상화 될 수 있습니다. 제한 사항은 Microsoft가 사물을 단순화하기 위해 부과 한 인공적인 것입니다 (32 비트 코드가 너무 많기 때문에 여전히 32 비트를 에뮬레이션했지만). 문제없이 16 비트 코드를 실행할 수있는 다른 OS (* nix?)가 있습니다.
Synetech

Windows를 모든 OS와 혼동하고 있습니다.
Ken Sharp

답변:


24

내 이해에서, 그것은 Long Mode (x64 native)에서 실행될 때 CPU 자체가 16 비트 모드로 들어가는 것을 지원하지 않기 때문입니다. Wikipedia를 참조하십시오 . 따라서 16 비트 모드를 지원하려면 NTVDM (Windows의 16 비트 계층)이 16 비트 프로세서를 완전히 에뮬레이트해야합니다.

필자는 이미 존재하는 가상화 소프트웨어 (VirtualPC, VirtualBox)를 사용하여 에뮬레이션 레이어를 다시 구현하여 VDM을 줄이기로 결정했다고 생각합니다.


6
Wikipedia 인용 : 64 비트 아키텍처 (x64 및 IA-64) 용 Windows NT 버전에는 NTVDM이 포함되어 있지 않으며 DOS 또는 16 비트 Windows 응용 프로그램을 실행할 수 없습니다. x86-64 CPU에서 가상 8086 모드는 기본 64 비트 롱 모드가 아닌 레거시 모드 (16 비트 및 32 비트 운영 체제를 실행하는 경우)에서만 하위 모드로 사용할 수 있기 때문입니다. 레거시 모드로 전환하려면 CPU의 하드 리셋이 필요합니다. 따라서 NTVDM이 지금까지 작동 한 유일한 방법은 더 이상 사용할 수 없으며 전체 VM이 충분하므로 NTVDM이 줄었습니다.
Joey

5
ck, 나는 그들이 V86 모드를 버렸다고 믿을 수 없다. 리얼 모드를 완전히 버리고 32/64 비트 부트 로더가 필요할 수도 있습니다.
Brian Knoblauch

5
바로 그 일이 벌써 일어난 일입니다, 크 노블 라흐 M. EFI 펌웨어가 장착 된 최신 x86 시스템은 처음 몇 지침의 언리얼 모드에서 64/32 비트 보호 모드로 바로 전환됩니다. 부트 로더는 실제로 64/32 비트 보호 모드 프로그램입니다. 이것이 바로 EFI 부팅 응용 프로그램입니다. 프로세스의 어느 곳에서나 리얼 모드 또는 v8086 보호 모드를 사용하지 않습니다.
JdeBP

3
-1. WINE은 64 비트 Linux에서 VM86 모드로 16 비트 Windows 앱 실행을 지원합니다. 스크린 샷 . V86-64 프로젝트 페이지 . Mehrdad의 대답은 더 매력적인 이유처럼 보입니다.
휴 알렌

3
@HughAllen :이 페이지는 현재 "현재 64 비트 버전의 Linux 커널은 V86 모드를 지원하지 않습니다. V86 모드는 이러한 프로세서의 기본 작동 모드 (긴 모드)에서 지원되지 않기 때문입니다." "이 패치는 매우 실험적 입니다." 짧은 대답은하지만 것입니다 완전히 긴 모드를 종료하여, 16 비트 코드를 실행하는 데, 그렇지 않은 분별 그렇게 할.
Harry Johnston

14

때문에 64 비트 핸들 (32)의 유효 비트가 :

64 비트 Windows는 16 비트 Windows 기반 응용 프로그램 실행을 지원하지 않습니다.
주된 이유는 핸들이 64 비트 Windows에서 32 개의 유효 비트를 갖기 때문입니다.
따라서 데이터 손실없이 핸들을 자르고 16 비트 응용 프로그램으로 전달할 수 없습니다.

Windows에서 프로그램은 "핸들"을 OS로 전달하고 그 반대로 (OS가 창과 같은 특정 자원을 고유하게 식별하기 위해 사용하는 숫자) 전달합니다.

16 비트 프로그램을 지원하기 위해 32 비트 Windows 는 16 개의 유효 비트를 가진 핸들 생성합니다. 16 개의 상위 비트는 OS에서 무시됩니다 (프로그램에서이 사실을 이용하지는 않더라도). 따라서 어떤 프로그램도 2 16 개 이상의 객체 와 상호 작용할 수 없으며 실제로는 다소 낮습니다.

그러나이를 개선하기 위해 64 비트 Windows는 핸들의 유효 비트 수를 32 개로 늘 렸습니다. 그러나 이제는 정보 손실없이 핸들을 16 비트 프로그램으로 전달할 수 없습니다. 따라서 16 비트 프로그램은 64 비트 Windows에서 실행할 수 없습니다.


3
@Joey : 나는 당신이 무슨 말을하는지 이해하지 못합니다. OS가 64 비트 Windows 인 경우 16 비트 응용 프로그램을 해당 기간 동안 실행할 수 없습니다. "DOS"또는 "Windows"응용 프로그램이라는 사실이 여기에서 어떤 내용을 변경하는지 알 수 없습니다. 어느 쪽이든, 응용 프로그램에서 핸들을 잘라야합니다.
Mehrdad

1
DOS 응용 프로그램에는 핸들이 없습니다. 사실, 그들은 (보통) Windows에서 실행되고 있는지조차 알지 못합니다.
Joey

1
... 실제로 Win16 코드조차도 큰 문제가되어서는 안됩니다. 이제 생각합니다. 조회 테이블 만 있으면됩니다.
Harry Johnston

1
@HarryJohnston : 문제가없는 것 같습니다. 응용 프로그램이 호출 EnumWindows되고 시스템에 2 ^ 16 개가 넘는 창이있을 때 가상의 "조회 테이블"에서 어떤 작업을 수행해야 합니까?
Mehrdad

1
나는 창 핸들이 아니라 기사에 따라 커널 핸들에 대해 이야기했다. 그들은 완전히 다른 것입니다. 16 비트 응용 프로그램에도 32 비트 창이 표시됩니까? 메시지 구조가 다르기 때문에 그럴 것 같지 않습니다. 16 비트 앱에 32 비트 wParam이 포함 된 메시지가 전송되면 어떻게됩니까? 또한 msdn.microsoft.com/en-us/library/windows/desktop/
Harry Johnston

10

Windows의 경우 x86 버전의 OS에는 이전 DOS 프로세스를 실행할 수있는 16 비트 에뮬레이션이 포함되어 있기 때문입니다. x64 버전에서는 32 비트 프로세스를 실행할 수 있도록 x86 실행을 에뮬레이션해야합니다 (WoW64라고 함) .Wow64를 사용하여 16 비트 에뮬레이터를 더 에뮬레이션하면 너무 많은 문제가 발생했다고 생각합니다.

에뮬레이션이 처리하도록 하드 코딩되어 있기 때문에 소수의 인식 된 16 비트 프로세스가 실행되지만 에뮬레이션이 x64에 포함되어 있지 않기 때문에 나머지는 작동하지 않습니다.

MSKB 기사 ( http://support.microsoft.com/kb/282423) 에서 "16 비트 코드 없음"을 참조하십시오.


14
에뮬레이션이 진행되지 않습니다. x86 / 64는 이러한 작업을 기본적으로 실행할 수 있습니다. 그러나 API 썽킹이 진행 중입니다. Microsoft는이 기회를 선택하여 상당히 오래되고 대부분 사용되지 않은 기술을 폐기했습니다.
Chris K

@Chris Kaminski- "괜찮아-그것은 Windows 7이고 더 이상 16 비트 프로세스를 실행하지 않습니다"라는 말과는 달리 아키텍처 결정-x86 대 x64-로 그렇게 할 것입니다. 특히 7에 내장 된 "Windows XP Mode"에서는 x86 버전에서도 지원을 중단하기에 완벽한시기 인 것 같습니다.
SqlRyan

@ Chris Kaminski : 더 많은 생각을 한 후에는 일종의 API- 마킹이 아니라 그것을 모방해야한다고 생각합니다. 다른 비트 빌드 코드를 기본적으로 실행할 수 있다면 x64에 Wow64가 32 비트 응용 프로그램을 실행하는 이유는 무엇입니까?
SqlRyan

@darthcoder : CPU는 단순히 긴 (64 비트) 모드에서 NTVDM에 필요한 가상 8086 모드를 지원하지 않습니다. 따라서 NTVDM은 전체 VM이되어 모든 것을 모방하거나 잘라 내야합니다. 이미 충분한 VM이 있기 때문에 (그리고 MS도 마찬가지이므로) 어려운 결정은 아닙니다. 나는 그것이 얼마나 오래되었는지 또는 얼마나 많이 사용되었는지와 관련이 없다고 생각합니다.
Joey

rwmnau : WoW64의 경우 에뮬레이션이 진행되지 않습니다 (Itanium 제외). x64-64 CPU는 여전히 32 비트 명령어를 지원하므로 거의 모든 Windows에서 32 비트 모드로 CPU를 전환하고 몇 가지 포인터로 엉망입니다.
Joey

3

내가 틀렸다면 바로 잡으십시오. 그러나 NTVDM이 가상 8086 모드를 사용하고 있다는 것은 Windows 고유의 문제 때문입니다. (긴 모드에서 실행)의 x64 프로세서 호환성 모드는 여기 발견 한 것과 전체 '깨끗한'보호 모드, 16 및 32 비트 지원 http://en.wikipedia.org/wiki/Long_mode 의 일부가 아닌를 가상 8086 모드와 같은 386 개 추가. 따라서 Microsoft가 NTVDM을 다시 프로그래밍하는 데 돈을 들이지 않기 때문에 대부분 지원되지 않습니다. 일부 16 비트 보호 모드 응용 프로그램은 가상 8086을 사용할 수 있기 때문에 더 많은 에뮬레이션을 추가해야 할 수도 있습니다. 충분한 노력으로 16 비트 응용 프로그램에 대한 하드웨어 지원이 있기 때문에 장거리 모드에서 실행되는 dosbox보다 더 빠른 것을 작성할 수 있다고 생각합니다.


−1. 16 비트 세그먼트를 처리하는 16 비트 모드는 로컬 디스크립터 테이블을 통해 지원됩니다. . 실제로 Linux에서 winedvm은 바로 그렇게합니다! otvdm 이라는 비공식 대체품도 있습니다 .
user2284570

글쎄, 내 이해에 따르면 (와인 솔루션) CPU 에뮬레이터가 포함되어 있습니다. 따라서 가상 8086 모드를 사용하지 않습니다. 이것이 정확히 DOSBOX (Win16 사용)와 같이 전체 PC를 에뮬레이션하지 않고 NTVDM에서 구현 될 수있는 솔루션입니다. 그리고 16 비트 보호 모드가 긴 모드에서 지원된다고하면 Win16 리얼 모드 앱은 어떻습니까?
MichaelS

여기에는 에뮬레이터가 포함되어 있지만 Windows에서 로컬 디스크립터 테이블을 수정하는 방법이 발견되면 ᴄᴘᴜ 에뮬레이션이 전혀 필요하지 않습니다. 리얼 모드에 관해서는 Dosemu (최소한 Linux 버전)와 같은 방식으로 에뮬레이션 할 수도 있습니다. Ntvdm은 처음에 이전 버전의 Windows에서 지원되었던 Mips 또는 PowerPc와 같은 플랫폼에서 Dos 프로그램을 실행할 수 있도록 설계되었습니다. 컴파일 타임에 활성화해야하는 선택적 기능입니다. 그리고 누군가가 그렇게 할 수 있도록 소스 코드가 유출 된 것 같습니다 : columbia.edu/~em36/ntvdmx64.html
user2284570

3

Dos 애플리케이션과 16 비트 Windows 애플리케이션의 상황은 다릅니다.

Dos 애플리케이션의 문제점은 가상 모드에서 가상 8086 모드를 사용할 수 없다는 것입니다. 이것은 CPU 아키텍처 제한 사항입니다.

16 비트 보호 모드에서 실행되는 16 비트 Windows 응용 프로그램의 경우 MS가 적절한 호환성 계층을 구현하기위한 작업을 수행 할 준비가되어 있지 않기 때문입니다. 흥미롭게도 Wine은 64 비트 Linux에서 16 비트 Windows 앱을 완벽하게 실행할 수 있습니다.


1
64 비트 Windows에 NTVDM이 없기 때문입니다. CPU는 여전히 호환 모드에서 16 비트 코드를 실행할 수 있습니다. 인텔 설명서 : "호환 모드 (IA-32e 모드의 하위 모드) — 호환 모드를 사용하면 대부분의 기존 16 비트 및 32 비트 응용 프로그램을 64 비트 운영 체제에서 재 컴파일하지 않고 실행할 수 있습니다"
phuclv

내가 알기로 호환성 모드는 16 비트 보호 모드를 허용하지만 가상 8086 모드는 허용하지 않습니다.
플러그 워시

2

가장 큰 이유는 PC 소유자 중 소수만이 실제로 새로운 64 비트 하드웨어에서 오래된 16 비트 응용 프로그램을 실행할 수 있기를 원하기 때문이라고 생각합니다. 마이크로 소프트는 16 비트 애플리케이션을 계속 지원하면서 가치가 없다고 생각했다.


이 때문에 분명히 그것의 가치는 그들이 이미 가지고있는 것을 사용하지만 x86-64에 필요한 것으로 인한없는 가상 8086 모드 (그것을 다시 구현하지, 윈도우 7 32 비트 여전히 지원을 제외하고 의미가 있습니다
Earlz

"복잡한 코드 기반을 유지하고 싶지 않다"고 생각했습니다. 16 비트를 유지한다면 80 년대로 거슬러 올라가는 소프트웨어를 지원해야 할 수도 있습니다. Lotus 1-2-3이 여전히 작동하도록 추한 해킹을 포함 할 수 있습니다.
Joe Plante

@Earlz 예, 16 비트의 Local Descriptor 테이블에 액세스하기위한 실제 솔루션이므로 이것이 Vm86 모드를 통하지 않고 직접 수행하는 것입니다. Microsoft는 단순히 코드를 이식하지 않았습니다. 사실 기본 64 비트 Windows 용으로 설계된 Ntᴠᴅᴍ 비공식 소프트웨어 대체품이 있습니다.
user2284570
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.