เหตุใดระบบปฏิบัติการ 64 บิตไม่สามารถเรียกใช้แอปพลิเคชัน 16 บิตได้


38

ทำไมเป็นเช่นนั้น:

  • ระบบปฏิบัติการ 32 บิตเมื่อติดตั้งบน CPU 64 บิตสามารถเรียกใช้แอปพลิเคชัน 16 บิตเก่าได้
  • แต่ถ้าคุณติดตั้งระบบปฏิบัติการ 64- ​​บิตมันไม่สามารถเรียกใช้แอพพลิเคชั่นเหล่านั้นได้โดยตรงและต้องการการจำลองบางอย่าง (ที่ไม่ได้ทำงานได้อย่างสมบูรณ์)

เฉพาะเจาะจงมากขึ้นฉันมีโปรเซสเซอร์ 64 บิต (Intel Core 2 Duo) เมื่อฉันติดตั้ง Windows XP และ Windows 7 (ทั้ง 32 บิต) พวกเขาสามารถเรียกใช้แอปพลิเคชัน DOS และ 616 บิต Windows แบบเก่าได้

ตอนนี้ฉันได้ติดตั้ง Windows 7 รุ่น 64 บิตแล้วทำไมมันไม่สามารถเรียกใช้แอปพลิเคชันเดียวกันเหล่านั้นได้อีกต่อไป


3
ฉันคิดว่ามันมีส่วนเกี่ยวข้องกับระบบปฏิบัติการของแขกน้อยลง ระบบปฏิบัติการใดที่คุณอ้างถึงโดยเฉพาะ?
Pekka สนับสนุน GoFundMonica

มันจะทำงานภายใต้ DOSBox หรือไม่
Penguat

1
มีโปรแกรมอรรถประโยชน์ที่เรียกว่าDOSBOXเป็นตัวจำลอง 16 บิตที่ให้โปรแกรม 16 บิตของคุณเป็นคอมพิวเตอร์เสมือน 16 บิตเพื่อทำงานบนและฟรี

ฉันเห็นด้วยกับ Pekka ความจริงก็คือระบบ 64- บิต (ฮาร์ดแวร์) สามารถเรียกใช้รหัส 16 บิต (heck หรือแม้แต่รหัส 1 บิตถ้าระบบปฏิบัติการได้รับการออกแบบ) สิ่งที่จับได้จริงคือ CPU ไม่สามารถเรียกใช้รหัส 16 บิตได้โดยตรงเนื่องจากสิ่งต่าง ๆ เช่นขนาดตัวชี้ที่แตกต่างกัน แต่ปัญหาเหล่านี้สามารถแยกออกจากระบบปฏิบัติการได้ ข้อ จำกัด นี้เป็นของปลอมที่ Microsoft กำหนดให้ลดความซับซ้อนของสิ่งต่าง ๆ (แม้ว่าพวกเขาจะยังคงเลียนแบบ 32 บิตเพราะยังมีรหัส 32 บิตมาก) มี OS อื่น (* nix?) ที่สามารถเรียกใช้รหัส 16 บิตได้โดยไม่มีปัญหา
Synetech

คุณสับสน Windows กับระบบปฏิบัติการทั้งหมด
Ken Sharp

คำตอบ:


24

จากความเข้าใจของฉันเป็นเพราะเมื่อทำงานในโหมด Long (x64 เนทีฟ) ตัวซีพียูเองไม่รองรับการเข้าสู่โหมด 16 บิต ดูวิกิพีเดีย ดังนั้นเพื่อรองรับโหมด 16 บิต NTVDM (เลเยอร์ 16 บิตใน Windows) จะต้องจำลองตัวประมวลผล 16 บิตอย่างเต็มที่

ฉันคิดว่าพวกเขาชั่งน้ำหนักการใช้เลเยอร์การเลียนแบบอีกครั้งโดยใช้ซอฟต์แวร์การจำลองเสมือนที่มีอยู่แล้ว (VirtualPC, VirtualBox) เพื่อจัดการสิ่งนี้และได้ตัดสินใจที่จะตัด VDM


6
การอ้างอิงจากWikipedia : รุ่นของ Windows NT สำหรับสถาปัตยกรรม 64- บิต (x64 และ IA-64) ไม่รวม NTVDM และไม่สามารถเรียกใช้แอปพลิเคชัน DOS หรือ 16 บิตของ Windows นี่เป็นเพราะในซีพียู x86-64 โหมด 8086 เสมือนนั้นมีให้เป็นโหมดย่อยเฉพาะในโหมดดั้งเดิม (สำหรับการใช้งานระบบปฏิบัติการ 16 และ 32 บิต) ไม่ใช่โหมดเนทิฟ 64 บิตแบบดั้งเดิม ต้องรีเซ็ตฮาร์ด CPU ให้สลับเป็นโหมดดั้งเดิม ดังนั้นวิธีเดียวที่ NTVDM ไม่สามารถใช้งานได้อีกต่อไปและ VM เต็มรูปแบบจะมีอยู่มากมายดังนั้น NTVDM จึงถูกตัด
Joey

5
Yuck ฉันไม่อยากจะเชื่อเลยว่าพวกเขาทิ้งโหมด V86 อาจโยนโหมดจริงอย่างสมบูรณ์และต้องการบูตโหลดเดอร์ 32/64 บิตหากคุณกำลังจะทำเช่นนั้น
Brian Knoblauch

5
นั่นคือสิ่งที่เกิดขึ้นแล้ว M. Knoblauch เครื่อง x86 ทันสมัยพร้อมเฟิร์มแวร์ EFI ส่งตรงจากโหมดไม่จริงในคำแนะนำแรก ๆ ไปยังโหมดป้องกัน 64/32 บิต ตัวตักการบูตนั้นแท้จริงแล้วคือโปรแกรมโหมดการป้องกัน 64/32 บิต นั่นคือสิ่งที่ EFI บูทแอปพลิเคชั่นเป็น ไม่มีการใช้โหมดจริงหรือโหมดการป้องกัน v8086 ที่ใดก็ได้ในกระบวนการ
JdeBP

3
-1 WINE รองรับการเรียกใช้แอพ Windows 16 บิตในโหมด VM86 บน Linux 64 บิต สกรีนช็อต หน้า V86-64 โครงการ คำตอบของ Mehrdad ดูเหมือนจะเป็นเหตุผลที่น่าสนใจมากกว่า
Hugh Allen

3
@HughAllen: หน้าปัจจุบันกล่าวว่า "เคอร์เนล linux รุ่น 64 บิตขาดการสนับสนุนโหมด V86 เนื่องจากไม่รองรับในโหมดปฏิบัติการดั้งเดิม (โหมดยาว) ของโปรเซสเซอร์เหล่านี้" และ "โปรแกรมแก้ไขนี้ทดลองใช้งานมาก " คำตอบสั้น ๆ คือแม้ว่าคุณจะสามารถเรียกใช้รหัส 16 บิตได้ด้วยการออกจากโหมดยาวอย่างสมบูรณ์ แต่ก็ไม่มีเหตุผลที่จะทำเช่นนั้น
แฮร์รี่จอห์นสตัน

14

เนื่องจากการจัดการ 64- ​​บิตมี 32 บิตที่สำคัญ :

โปรดทราบว่า Windows 64 บิตไม่รองรับการใช้งานแอพพลิเคชั่นที่ใช้ Windows 16 บิต
เหตุผลหลักคือที่จับมี 32 บิตที่สำคัญบน Windows 64 บิต
ดังนั้นการจัดการไม่สามารถตัดทอนและส่งผ่านไปยังแอปพลิเคชัน 16 บิตโดยไม่สูญเสียข้อมูล

ใน Windows โปรแกรมต่าง ๆ "จัดการ" ไปยังระบบปฏิบัติการและในทางกลับกัน (ซึ่งเป็นตัวเลขที่ระบบปฏิบัติการใช้เพื่อระบุทรัพยากรเฉพาะเช่นหน้าต่าง)

เพื่อรองรับโปรแกรม 16 บิต Windows 32 บิตจะสร้างตัวจัดการที่มี 16 บิตที่มีนัยสำคัญเท่านั้นระบบปฏิบัติการ16 บิตจะไม่สนใจ (แม้ว่าโปรแกรมจะไม่ใช้ประโยชน์จากข้อเท็จจริงนี้) ดังนั้นจึงไม่มีโปรแกรมใดที่สามารถโต้ตอบกับวัตถุมากกว่า 2 16ซึ่งจริง ๆ แล้วค่อนข้างต่ำ

อย่างไรก็ตามเพื่อปรับปรุงสิ่งนี้ Windows 64 บิตเพิ่มจำนวนบิตที่สำคัญในการจัดการเป็น 32 แต่ตอนนี้นั่นหมายความว่าการจัดการไม่สามารถส่งผ่านไปยังโปรแกรม 16 บิตโดยไม่สูญเสียข้อมูล ดังนั้นโปรแกรม 16 บิตไม่สามารถทำงานบน Windows 64 บิต


3
@ โจอี้: ฉันไม่เข้าใจสิ่งที่คุณพูด หากระบบปฏิบัติการเป็น Windows แบบ 64 บิตดังนั้นแอปพลิเคชันแบบ 16 บิตจะไม่สามารถรันได้ ฉันไม่เห็นความจริงที่ว่าพวกเขาเป็นแอปพลิเคชั่น "DOS" หรือ "Windows" เปลี่ยนแปลงอะไรที่นี่ - ไม่ว่าจะด้วยวิธีใดด้ามจับจะต้องถูกตัดทอนโดยแอปพลิเคชัน
Mehrdad

1
แอปพลิเคชัน DOS ไม่มีที่จับ ในความเป็นจริงพวกเขา (ปกติ) ไม่รู้ด้วยซ้ำว่าพวกเขากำลังทำงานบน Windows
Joey

1
... จริงๆแล้วแม้แต่รหัส Win16 ก็ไม่ควรมีปัญหามากเกินไปตอนนี้ฉันก็คิดถึงมันแล้ว สิ่งที่คุณต้องการคือตารางการค้นหา
Harry Johnston

1
@HarryJohnston: ฉันคิดว่าคุณขาดปัญหา คุณเสนอสิ่งใดควรเกิดขึ้นกับ "ตารางค้นหา" ในจินตนาการของคุณเมื่อแอปพลิเคชันโทรออกEnumWindowsและมีหน้าต่างมากกว่า 2 ^ 16 ในระบบ
Mehrdad

1
ฉันกำลังพูดเกี่ยวกับเคอร์เนลที่จับตามบทความไม่ใช่จับหน้าต่าง พวกมันต่างกันอย่างสิ้นเชิง แอปพลิเคชัน 16 บิตเห็นแม้แต่หน้าต่าง 32 บิตหรือไม่ ดูเหมือนไม่น่าเป็นไปได้เพราะโครงสร้างข้อความนั้นแตกต่างกัน จะเกิดอะไรขึ้นหากแอป 16 บิตส่งข้อความด้วย wParam แบบ 32 บิต นอกจากนี้โปรดทราบว่าจำนวนสูงสุดของการจัดการหน้าต่างยังคงเป็น 2 ^ 16 ตามmsdn.microsoft.com/en-us/library/windows/desktop/…
แฮร์รี่จอห์นสตัน

10

สำหรับ Windows นั้นเป็นเพราะระบบปฏิบัติการรุ่น x86 มีการจำลองแบบ 16 บิตที่อนุญาตให้พวกเขาเรียกใช้กระบวนการ DOS รุ่นเก่าเหล่านั้นได้ ในรุ่น x64 พวกเขาต้องเลียนแบบการดำเนินการ x86 (พวกเขาเรียกมันว่า WoW64) เพื่อให้กระบวนการแบบ 32 บิตสามารถทำงานได้และฉันเดาว่าการใช้ Wow64 เพื่อเลียนแบบตัวจำลอง 16 บิตทำให้เกิดปัญหามากเกินไป

กระบวนการ 16 บิตที่ได้รับการยอมรับจำนวนหนึ่งจะทำงานเนื่องจากการจำลองนั้นใช้รหัสยากในการจัดการ แต่ส่วนที่เหลือไม่ทำงานเนื่องจากการจำลองไม่รวมอยู่ใน x64

ดู "ไม่มีรหัส 16 บิต" ที่บทความ MSKB: http://support.microsoft.com/kb/282423


14
ไม่มีการจำลองเกิดขึ้น - x86 / 64 สามารถเรียกใช้สิ่งเหล่านี้ได้โดยกำเนิด มี API thunking เกิดขึ้นอย่างไรก็ตาม Microsoft ได้เลือกโอกาสนี้ในการเกษียณเทคโนโลยีที่เก่าและไม่ได้ใช้งานเป็นส่วนใหญ่
Chris K

@Chris Kaminski - ฉันประหลาดใจที่พวกเขาทำเช่นนั้นในการตัดสินใจทางสถาปัตยกรรม - x86 เทียบกับ x64 - ซึ่งต่างกับการพูดว่า "เอาล่ะ - เป็น Windows 7 และเราไม่ได้ใช้กระบวนการแบบ 16 บิตอีกต่อไป" โดยเฉพาะอย่างยิ่งกับ "โหมด Windows XP" ตอนนี้ฝังอยู่ใน 7 ดูเหมือนว่าเวลาที่เหมาะที่จะตัดการสนับสนุนแม้ในรุ่น x86
SqlRyan

@Chris Kaminski: หลังจากให้ความคิดมากกว่านี้ฉันคิดว่ามันต้องเลียนแบบมันไม่ใช่แค่การเลียนแบบ API ถ้ามันสามารถเรียกใช้รหัสของบิตบิวด์ที่แตกต่างกันได้ทำไม x64 ถึงจะมี Wow64 ให้รันแอพแบบ 32 บิต - เหล่านั้นจะไม่ทำงานด้วยเช่นกัน?
SqlRyan

@darthcoder: CPU ไม่รองรับโหมด 8086 เสมือนที่ NTVDM ต้องการในโหมดยาว (64 บิต) ดังนั้น NTVDM จะต้องกลายเป็น VM แบบเต็มเลียนแบบทุกอย่างหรือถูกตัด เนื่องจากมี VMs เพียงพออยู่แล้ว (และ MS ก็มีเช่นกัน) นั่นไม่ใช่การตัดสินใจที่ยาก ฉันไม่คิดว่ามันจะเกี่ยวกับอายุเท่าไหร่หรือใช้ไปเท่าไหร่
Joey

rwmnau: สำหรับ WoW64 ไม่มีการจำลองเกิดขึ้น (ยกเว้น Itanium) x64-64 CPUs ยังคงรองรับคำสั่งแบบ 32 บิตดังนั้น Windows เกือบทั้งหมดที่ต้องทำคือเปลี่ยน CPU ในโหมด 32 บิตและยุ่งกับพอยน์เตอร์สองสามตัว
Joey

3

แก้ไขฉันถ้าฉันผิด แต่เพื่อความเข้าใจของฉันมันเป็นเพราะปัญหาเฉพาะ Windows ที่ NTVDM ใช้โหมดเสมือน 8086 โหมดความเข้ากันได้กับตัวประมวลผล x64 (ทำงานในโหมดยาว) รองรับโหมดเต็มรูปแบบที่ได้รับการป้องกัน 'สะอาด', 16 และ 32 บิตจากสิ่งที่ฉันพบที่นี่: http://en.wikipedia.org/wiki/Long_modeแต่ไม่ใช่ของบางอย่าง 386 สิ่งเพิ่มเติมเช่นโหมด 8086 เสมือน ดังนั้นจึงไม่ได้รับการสนับสนุนมากที่สุดเพราะไมโครซอฟท์ไม่จ่ายเงินให้กับ reprogram NTVDM ซึ่งอาจต้องเพิ่มการจำลองเพิ่มเติมเนื่องจากแอปพลิเคชันโหมด 16 บิตที่มีการป้องกัน 16 บิตสามารถใช้ virtual 8086 แม้ว่าส่วนใหญ่จะไม่ได้ทำ ฉันคิดว่ามีแรงงานเพียงพอที่จะเขียนสิ่งที่เร็วกว่า dosbox ที่ทำงานในโหมด Long เนื่องจากมีการรองรับฮาร์ดแวร์สำหรับแอพ 16 บิต


-1 การกำหนดที่อยู่โหมด 16 bits หรือที่รู้จักส่วน 16 บิตได้รับการสนับสนุนผ่านตารางตัวอธิบายเฉพาะที่ . ในความเป็นจริง winedvm บน Linux ทำอย่างนั้น! มีแม้กระทั่งการเปลี่ยนอย่างไม่เป็นทางการเรียกว่าotvdm
2284570

ตามความเข้าใจของฉัน (ไวน์) ประกอบด้วยตัวจำลอง CPU ดังนั้นจึงไม่ได้ใช้โหมด 8086 เสมือน นั่นเป็นคำตอบที่แม่นยำซึ่งสามารถนำไปใช้กับ NTVDM ได้โดยไม่ต้องเลียนแบบพีซีทั้งหมดเช่นเดียวกับ DOSBOX (ด้วย Win16) และถ้าคุณบอกว่าโหมดการป้องกัน 16 บิตรองรับภายใต้โหมดยาวแล้วแอพโหมดจริงของ Win16 เป็นอย่างไร
MichaelS

มันมีอีมูเลเตอร์ แต่หากวิธีการแก้ไขตารางตัวบอกรายละเอียดโลคัลบน Windows จะไม่มีการจำลองใด ๆ เลย เกี่ยวกับโหมดจริงพวกเขายังสามารถจำลองในแบบที่ทำโดย Dosemu (เวอร์ชัน Linux อย่างน้อย) Ntvdm ถูกออกแบบมาเพื่ออนุญาตให้เรียกใช้โปรแกรม Dos บนแพลตฟอร์มเช่น Mips หรือ PowerPc ซึ่งรองรับใน Windows รุ่นก่อนหน้า เป็นเพียงฟีเจอร์เสริมที่จำเป็นต้องเปิดใช้งานในเวลารวบรวม และดูเหมือนว่าซอร์สโค้ดถูกปล่อยออกมาทำให้บางคนทำเช่นนั้น: columbia.edu/~em36/ntvdmx64.html
user2284570

3

สถานการณ์แตกต่างกันสำหรับแอ็พพลิเคชัน Dos และแอ็พพลิเคชัน windows 16 บิต

สำหรับแอปพลิเคชัน Dos ปัญหาคือว่าโหมด 8086 เสมือนไม่สามารถใช้งานได้ในโหมดยาว นี่เป็นข้อ จำกัด ด้านสถาปัตยกรรมของ CPU

สำหรับแอปพลิเคชัน Windows 16 บิต (ซึ่งทำงานในโหมดป้องกัน 16 บิต) เหตุผลก็คือว่า MS ไม่ได้เตรียมที่จะใช้งานเลเยอร์ความเข้ากันได้ที่เหมาะสม Amusingly Wine นั้นสามารถเรียกใช้แอพพลิเคชั่น Windows 16 บิตบน Linux 64 บิตได้อย่างสมบูรณ์แบบ


1
เป็นเพียงเพราะไม่มี NTVDM ใน Windows 64 บิต CPU ยังคงสามารถเรียกใช้รหัส 16 บิตในโหมดความเข้ากันได้ จากคู่มือ Intel: "โหมดความเข้ากันได้ (โหมดย่อยของโหมด IA-32e) - โหมดความเข้ากันได้อนุญาตให้แอปพลิเคชัน 16 บิตและ 32 บิตรุ่นเก่าส่วนใหญ่ทำงานโดยไม่ต้องรวบรวมใหม่ภายใต้ระบบปฏิบัติการ 64 บิต"
phuclv

ตามที่ฉันเข้าใจโหมดความเข้ากันได้นั้นอนุญาตให้ใช้โหมดป้องกัน 16 บิต แต่ไม่ใช่โหมด 8086 เสมือน
plugwash

2

ฉันคิดว่าเหตุผลที่น่าเป็นไปได้มากที่สุดคือมีเพียงเจ้าของเครื่องพีซีเพียงเล็กน้อยเท่านั้นที่ต้องการใช้งานแอพพลิเคชั่น 16 บิตแบบเก่าบนฮาร์ดแวร์ 64 บิตใหม่ของพวกเขา Microsoft อาจจะคิดว่ามันไม่คุ้มค่าในขณะที่ยังคงรองรับแอปพลิเคชั่น 16 บิต


สิ่งนี้มีเหตุผลยกเว้นสำหรับ Windows 7 32 บิตที่ยังคงรองรับอยู่ดังนั้นเห็นได้ชัดว่ามันคุ้มค่าที่จะใช้สิ่งที่พวกเขามีอยู่แล้ว แต่ไม่ได้ปรับใช้ใหม่ (ตามที่ต้องการสำหรับ x86-64 เนื่องจากไม่มีโหมดเสมือน 8086
Earlz

ฉันคิดว่า "เราไม่ต้องการรักษาฐานรหัสที่ซับซ้อน" หากพวกเขาเก็บไว้ใน 16 บิตพวกเขาอาจต้องสนับสนุนซอฟต์แวร์ที่มีอายุย้อนไปถึงยุค 80 ซึ่งอาจรวมถึงการใส่แฮ็กที่น่าเกลียดเพื่อให้ Lotus 1-2-3 ยังคงทำงานได้
Joe Plante

@Earlz ใช่ แต่ฉันคิดว่านี่เป็นคำตอบที่แท้จริงในฐานะวิธีแก้ปัญหาที่แท้จริงเพื่อเข้าถึงตาราง Local Descriptor สำหรับ 16 บิตคือการทำโดยตรงและไม่ผ่านโหมด Vm86 Microsoft ก็ไม่ได้รบกวนการเปลี่ยนรหัส ในความเป็นจริงแล้วการเปลี่ยนซอฟต์แวร์อย่างไม่เป็นทางการของ Nt designed ออกแบบมาสำหรับ Windows 64 บิตแบบดั้งเดิม
2284570
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.