สามารถแปลรหัสเครื่องเป็นสถาปัตยกรรมอื่นได้หรือไม่


11

ดังนั้นนี่คือชนิดของที่เกี่ยวข้องกับคำถามเกี่ยวกับการทำงานของเซิร์ฟเวอร์ Windows บน ARM ดังนั้นหลักฐานของคำถามของฉันคือสามารถแปลรหัสเครื่องจากสถาปัตยกรรมหนึ่งไปอีกสถาปัตยกรรมหนึ่งเพื่อดำเนินการไบนารีบนสถาปัตยกรรมที่แตกต่างจากสถาปัตยกรรมที่คอมไพล์ให้ทำงาน

QEMU และอีมูเลเตอร์อื่น ๆ สามารถแปลคำแนะนำได้ทันทีดังนั้นจึงเรียกใช้ไฟล์ปฏิบัติการได้บนคอมพิวเตอร์ที่ไม่ได้รวบรวมไว้ ทำไมไม่แปลเร็ว ๆ นี้แทนที่จะทำทันทีเพื่อเร่งกระบวนการ? จากความรู้ที่ค่อนข้าง จำกัด ของฉันเกี่ยวกับการชุมนุมคำแนะนำส่วนใหญ่เช่นMOVนี้ADDและอื่น ๆ ควรเป็นแบบพกพาข้ามสถาปัตยกรรม

สิ่งที่ไม่ได้มีการแมปโดยตรงสามารถแมปกับชุดคำสั่งอื่น ๆ ได้เนื่องจากเครื่องทั้งหมดนั้นกำลังทำทัวริงเสร็จสมบูรณ์ การทำเช่นนี้จะซับซ้อนเกินไปหรือไม่ มันจะไม่ทำงานด้วยเหตุผลบางอย่างที่ฉันไม่คุ้นเคยหรือไม่ มันจะใช้งานได้ แต่ให้ผลลัพธ์ไม่ดีไปกว่าการใช้อีมูเลเตอร์?


เทคนิคดังกล่าวมีแนวโน้มที่จะไม่พอใจเพราะ (นอกเหนือจากความไม่แน่นอน) มันไม่จำเป็นมากนัก ความสะดวกในการพกพา / การกำหนดมาตรฐาน (ดีขึ้นเล็กน้อย) ในทุกวันนี้ (ถ้าเพียงเพราะ Wintel ได้ครอบครองไปทั่วโลก) และในกรณีที่จำเป็นต้องใช้การจำลองแบบข้ามเครื่องจักร (เช่นสำหรับตัวจำลองโทรศัพท์ในสภาพแวดล้อมการพัฒนาแอป) ผลลัพธ์ที่น่าเชื่อถือและแม่นยำยิ่งขึ้น นอกจากนี้โปรเซสเซอร์ยังเร็วพอที่ต้นทุนการจำลองจะไม่เป็นปัญหารุนแรงเหมือนในอดีต
Daniel R Hicks

คำตอบ:


6

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


คำตอบที่ยาว :

QEMU และอีมูเลเตอร์อื่น ๆ สามารถแปลคำแนะนำได้ทันทีดังนั้นจึงเรียกใช้ไฟล์ปฏิบัติการได้บนคอมพิวเตอร์ที่ไม่ได้รวบรวมไว้ ทำไมไม่แปลเร็ว ๆ นี้แทนที่จะทำทันทีเพื่อเร่งกระบวนการ?

ฉันรู้ว่ามันอาจดูง่ายในหลักการ แต่ในทางปฏิบัติมันเป็นไปไม่ได้เกือบด้วยเหตุผลหลักสองสามข้อ ในการเริ่มต้นชุดคำสั่งต่าง ๆ จะใช้โหมดการกำหนดแอดเดรสที่แตกต่างกันส่วนใหญ่โครงสร้าง opcode ที่แตกต่างกันขนาดคำที่ต่างกันและบางคำอาจไม่มีคำแนะนำที่คุณต้องการ

สมมติว่าคุณจำเป็นต้องเปลี่ยนการเรียนการสอนXYZที่มีสองคำแนะนำเพิ่มเติมและABC DEFตอนนี้คุณได้เลื่อนที่อยู่สัมพัทธ์ / ออฟเซ็ตทั้งหมดในโปรแกรมทั้งหมดจากจุดนั้นอย่างมีประสิทธิภาพดังนั้นคุณจะต้องวิเคราะห์และผ่านโปรแกรมทั้งหมดและอัปเดตออฟเซ็ต (ทั้งก่อนและหลังการเปลี่ยนแปลง) ทีนี้สมมติว่าหนึ่งในออฟเซ็ตมีการเปลี่ยนแปลงอย่างมากตอนนี้คุณต้องเปลี่ยนโหมดการกำหนดแอดเดรสซึ่งอาจเปลี่ยนขนาดของที่อยู่ การดำเนินการนี้จะบังคับให้คุณสแกนไฟล์ทั้งหมดอีกครั้งและคำนวณที่อยู่ทั้งหมดอีกครั้งและอื่น ๆ และลำดับที่สี่

เมื่อคุณเขียนโปรแกรมแอสเซมบลีคุณอาจใช้เลเบล แต่ CPU ไม่ได้ - เมื่อประกอบไฟล์แล้วเลเบลทั้งหมดจะถูกคำนวณว่าเป็นตำแหน่งสัมพัทธ์สัมบูรณ์หรือออฟเซ็ต คุณสามารถดูว่าทำไมสิ่งนี้จึงกลายเป็นเรื่องไม่สำคัญอย่างรวดเร็วและเป็นไปไม่ได้ การเปลี่ยนคำสั่งเดียวอาจทำให้คุณต้องผ่านโปรแกรมทั้งหมดหลายร้อยครั้งก่อนที่จะดำเนินการต่อ

จากความรู้เกี่ยวกับการประกอบที่ จำกัด ของฉันคำแนะนำส่วนใหญ่เช่น MOV, ADD และอื่น ๆ ควรพกพาข้ามสถาปัตยกรรม

ใช่ แต่ดูที่ปัญหาที่ฉันระบุไว้ด้านบน ขนาดของคำศัพท์ของเครื่องเป็นอย่างไร? ที่อยู่ยาวหรือไม่ มันมีโหมดการกำหนดแอดเดรสเหมือนกันหรือไม่? อีกครั้งคุณไม่เพียงแค่ "ค้นหาและแทนที่" คำแนะนำ ทุกส่วนของโปรแกรมมีที่อยู่ที่กำหนดไว้โดยเฉพาะ การข้ามไปยังป้ายกำกับอื่นจะถูกแทนที่ด้วยที่อยู่หน่วยความจำที่แท้จริงหรือออฟเซ็ตเมื่อมีการประกอบโปรแกรม

สิ่งที่ไม่ได้มีการแมปโดยตรงสามารถแมปกับชุดคำสั่งอื่น ๆ ได้เนื่องจากเครื่องทั้งหมดนั้นกำลังทำทัวริงเสร็จสมบูรณ์ การทำเช่นนี้จะซับซ้อนเกินไปหรือไม่ มันจะไม่ทำงานด้วยเหตุผลบางอย่างที่ฉันไม่คุ้นเคยหรือไม่ มันจะใช้งานได้ แต่ให้ผลลัพธ์ไม่ดีไปกว่าการใช้อีมูเลเตอร์?

คุณถูกต้อง 100% ว่ามันมีทั้งที่เป็นไปได้และจะมากได้เร็วขึ้น อย่างไรก็ตามการเขียนโปรแกรมเพื่อให้บรรลุนี้เป็นเรื่องยากอย่างเหลือเชื่อและไม่น่าเป็นไปได้สูงหากไม่ใช่เพื่อสิ่งใดนอกจากปัญหาที่ฉันระบุไว้ข้างต้น

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

การทำเช่นนี้สำหรับโปรแกรมที่มีคำสั่งไม่กี่พันคำสั่งจะต้องมีการนับหมื่นหากไม่ผ่านไปหลายแสนครั้ง สำหรับโปรแกรมที่มีขนาดค่อนข้างเล็กอาจเป็นไปได้ แต่โปรดจำไว้ว่าจำนวนการส่งผ่านจะเพิ่มขึ้นตามจำนวนคำสั่งเครื่องในโปรแกรม สำหรับโปรแกรมที่มีขนาดพอเหมาะมันใกล้จะเป็นไปไม่ได้


สิ่งสำคัญที่ต้องทำคือ "decompile" หรือ "disassemble" ซอร์สโค้ดวัตถุ สำหรับโค้ดที่ค่อนข้างตรงไปตรงมา (โดยเฉพาะโค้ดที่สร้างโดยคอมไพเลอร์หรือแพ็คเกจการสร้างรหัสที่มี "สไตล์" ที่รู้จัก) การแทรกเลเบลอีกครั้งและสิ่งที่คล้ายกันนั้นค่อนข้างง่าย อย่างไรก็ตามแน่นอนว่าคอมไพเลอร์ที่ได้รับการปรับให้เหมาะสมที่สุดรุ่นใหม่จะสร้างโค้ดที่ยากต่อการ "grock" ด้วยวิธีนี้
Daniel R Hicks

@DanH หากคุณมีรหัสวัตถุต้นทางคุณมีแหล่งที่มาของการประกอบ ( ไม่ใช่รหัสเครื่อง) ไฟล์ออบเจ็กต์มีลำดับชื่อ (อ่าน: กำกับ) ของรหัสเครื่องที่จะเชื่อมโยงเข้าด้วยกัน ปัญหาเกิดขึ้นเมื่อคุณเชื่อมโยงไฟล์รหัสวัตถุลงในไฟล์เรียกทำงาน เซ็กเมนต์ขนาดเล็กเหล่านี้สามารถจัดการ (หรือวิศวกรรมย้อนกลับ) ได้ง่ายขึ้นมากแล้วปฏิบัติการที่เชื่อมโยงทั้งหมด
พัฒนา

แน่นอนรูปแบบไฟล์ออบเจ็กต์บางอย่างทำให้งานง่ายขึ้น บางคนอาจมีข้อมูลการแก้จุดบกพร่องช่วยให้คุณสามารถเรียกคืนป้ายส่วนใหญ่ คนอื่นมีประโยชน์น้อยกว่า ในบางกรณีข้อมูลส่วนใหญ่จะถูกเก็บไว้แม้ในรูปแบบไฟล์ที่เชื่อมโยงในกรณีอื่น ๆ ก็ตาม มีรูปแบบไฟล์ที่แตกต่างกันมากมาย
Daniel R Hicks

2

ใช่สิ่งที่คุณแนะนำสามารถทำได้และได้ทำไปแล้ว มันไม่ธรรมดาเกินไปและฉันก็ไม่ทราบว่าระบบใด ๆ ในปัจจุบันที่ใช้เทคนิคนี้ แต่มันก็อยู่ในขอบเขตของความเป็นไปได้ทางเทคนิค

มันเคยทำมามากมายเพื่อเปิดใช้งานการเปลี่ยนรหัสจากระบบหนึ่งไปสู่อีกระบบหนึ่งก่อนที่ทุกคนจะประสบความสำเร็จในการ "พกพา" อย่างหยาบ ๆ ที่เรามีอยู่ตอนนี้ มันต้องการการวิเคราะห์ที่ซับซ้อนของ "แหล่งที่มา" และอาจถูกขัดขวางโดยการแก้ไขโค้ดและวิธีปฏิบัติแปลก ๆ อื่น ๆ แต่ก็ยังทำอยู่

เมื่อเร็ว ๆ นี้ระบบเช่น IBM System / 38 - iSeries - System i ได้รับประโยชน์จากความสามารถในการพกพาของรหัสกลาง (คล้ายกับ Java bytecodes) ที่จัดเก็บด้วยโปรแกรมที่คอมไพล์เพื่อให้สามารถพกพาได้ระหว่างสถาปัตยกรรมชุดคำสั่ง


ยอมรับว่าสิ่งนี้ทำไปแล้วมักจะมีชุดคำสั่งที่เก่ากว่า (ง่ายกว่า) มาก มีโครงการ IBM ในปี 1970 เพื่อแปลงโปรแกรมไบนารี 7xx เก่าเป็น System / 360
ขี้เลื่อย

1

รหัสเครื่องนั้นเป็นสถาปัตยกรรมเฉพาะ

ภาษาที่อนุญาตให้พกพาได้ง่ายในหลาย ๆ สถาปัตยกรรม (Java น่าจะเป็นที่รู้จักกันดีที่สุด) มีแนวโน้มที่จะอยู่ในระดับสูงมากต้องการล่ามหรือเฟรมเวิร์กที่ต้องติดตั้งบนเครื่องเพื่อให้ทำงานได้

เฟรมเวิร์กหรือล่ามเหล่านี้เขียนขึ้นสำหรับสถาปัตยกรรมระบบเฉพาะที่พวกเขาจะใช้งานดังนั้นจึงไม่สามารถพกพาได้มากกว่าในโปรแกรม "ปกติ"


2
ภาษาที่คอมไพล์ด้วยเช่นกันแบบพกพาไม่เพียง แต่แปลภาษาเท่านั้นมันเป็นคอมไพเลอร์ที่มีสถาปัตยกรรมเฉพาะเนื่องจากเป็นสิ่งที่แปลโค้ดในท้ายที่สุดว่าแพลตฟอร์มนั้นเปิดอยู่สามารถรับรู้ได้ ข้อแตกต่างเพียงอย่างเดียวคือการแปลภาษาที่คอมไพล์ในเวลารวบรวมและภาษาที่แปลถูกแปลทีละบรรทัดตามต้องการ
MaQleod

1

เป็นไปได้อย่างแน่นอน รหัสเครื่องคืออะไร? มันเป็นแค่ภาษาคอมพิวเตอร์เฉพาะที่เข้าใจ คิดว่าตัวเองเป็นคอมพิวเตอร์และคุณพยายามเข้าใจหนังสือที่เขียนเป็นภาษาเยอรมัน คุณทำไม่ได้เพราะคุณไม่เข้าใจภาษา ตอนนี้ถ้าคุณต้องใช้พจนานุกรมภาษาเยอรมันและค้นหาคำว่า "Kopf" คุณจะเห็นมันแปลเป็นคำว่า "head" พจนานุกรมที่คุณใช้คือสิ่งที่เรียกว่าเลเยอร์จำลองในโลกคอมพิวเตอร์ ง่ายใช่มั้ย มันยากกว่ามาก ใช้คำภาษาเยอรมัน "Schadenfruede" และแปลเป็นภาษาอังกฤษ คุณจะเห็นว่าไม่มีคำในภาษาอังกฤษ แต่มีคำจำกัดความ ปัญหาเดียวกันนี้เกิดขึ้นในโลกคอมพิวเตอร์แปลสิ่งที่ไม่มีคำเทียบเท่า สิ่งนี้ทำให้พอร์ตโดยตรงเป็นเรื่องยากเนื่องจากผู้พัฒนาเลเยอร์การจำลองต้องทำการตีความความหมายของคำนั้นและทำให้คอมพิวเตอร์โฮสต์เข้าใจ บางครั้งมันก็ไม่ทำงานอย่างที่คาดหวัง เราทุกคนเห็นคำแปลหนังสือวลีและอื่น ๆ บนอินเทอร์เน็ตใช่ไหม?


1

กระบวนการที่คุณอธิบายนั้นเรียกว่าการรวบรวมซ้ำแบบคงที่และเสร็จสิ้นแล้วไม่ใช่วิธีที่ใช้กันโดยทั่วไป ความหมายมันเกินกว่าจะทำได้หลายครั้ง แต่ต้องใช้งานด้วยตนเอง

มีตัวอย่างทางประวัติศาสตร์มากมายที่ควรค่าแก่การค้นคว้า แต่พวกเขาไม่สามารถแสดงให้เห็นถึงความกังวลในปัจจุบันได้ ฉันได้พบสองตัวอย่างที่ควรทำให้คำถามคลางแคลงสมบูรณ์คนที่อ้างว่าทุกอย่างยากเป็นไปไม่ได้

ครั้งแรกที่ผู้ชายคนนี้ทำ Archetecture แบบคงที่และแพลตฟอร์มสำหรับ NES ROM http://andrewkelley.me/post/jamulator.html

เขาทำคะแนนได้ดีมาก แต่สรุปว่า JIT ยังใช้งานได้ดีกว่า จริง ๆ แล้วฉันไม่แน่ใจว่าทำไมเขาถึงไม่รู้ว่าสำหรับสถานการณ์นี้นี่อาจเป็นประเภทของสถานการณ์ที่คนส่วนใหญ่พิจารณา ไม่ต้องใช้ทางลัดเรียกร้องความแม่นยำรอบเต็มและไม่มีการใช้ ABI เลย ถ้ามันคือทั้งหมดที่มีเราสามารถโยนแนวคิดในถังขยะและเรียกมันว่าวัน แต่มันไม่ได้ทั้งหมดและไม่เคยเป็น .... เราจะรู้ได้อย่างไร เพราะโครงการที่ประสบความสำเร็จทั้งหมดไม่ได้ใช้วิธีการนี้

ตอนนี้มีความเป็นไปได้ที่ชัดเจนน้อยลงใช้ประโยชน์จากแพลตฟอร์มที่คุณมีอยู่แล้ว ... Starcraft บนมือถือ Linux ARM? ใช่วิธีการทำงานเมื่อคุณไม่ได้ จำกัด งานเพื่อสิ่งที่คุณทำแบบไดนามิก ด้วยการใช้ Winlib การเรียกใช้แพลตฟอร์ม Windows ล้วนเป็นพื้นฐานทั้งหมดที่เราต้องกังวลคือสถาปัตยกรรม

http://www.geek.com/games/starcraft-has-been-reverse-engineered-to-run-on-arm-1587277/

ฉันโยนดอลลาร์เพื่อโดนัทว่าการชะลอตัวนั้นแทบจะไม่สำคัญนักเนื่องจากแพนโดร่ามือถือของ ARM นั้นแข็งแกร่งกว่า Pi เล็กน้อย เครื่องมือที่เขาใช้อยู่ในที่เก็บนี้

https://github.com/notaz/ia32rtools

ผู้ชายคนนั้น decompiled ด้วยตนเองมากฉันเชื่อว่ากระบวนการอาจเป็นไปโดยอัตโนมัติอย่างมีนัยสำคัญโดยมีงานน้อยลง แต่ยังคงเป็นงานแห่งความรักในขณะนี้ อย่าให้ใครบอกคุณบางอย่างที่เป็นไปไม่ได้อย่าให้ฉันบอกคุณว่ามันใช้ไม่ได้ ... มันอาจจะเป็นประโยชน์ได้ทันทีที่คุณคิดค้นวิธีการใหม่


0

ในทางทฤษฎีใช่สิ่งนี้สามารถทำได้ ปัญหาที่ใหญ่กว่าที่เข้ามาเล่นคือการแปลแอปพลิเคชันสำหรับระบบปฏิบัติการหนึ่ง (หรือเคอร์เนล) ไปยังอีกระบบหนึ่ง มีความแตกต่างที่สำคัญระหว่างการทำงานในระดับต่ำของ Windows, Linux, OSX และ iOS ที่แอปพลิเคชันทั้งหมดสำหรับอุปกรณ์เหล่านั้นต้องใช้งาน

ในทางทฤษฎีอีกครั้งหนึ่งสามารถเขียนแอปพลิเคชันที่สามารถสลายแอปพลิเคชันเช่นเดียวกับรหัสเครื่องทั้งหมดที่เกี่ยวข้องกับระบบปฏิบัติการที่รวบรวมไว้เพื่อให้ทำงานและจากนั้นคอมไพล์รหัสเครื่องทั้งหมดสำหรับอุปกรณ์อื่น อย่างไรก็ตามมันจะผิดกฎหมายอย่างมากในทุกกรณีและยากที่จะเขียน ความจริงแล้วเกียร์ในหัวของฉันเริ่มที่จะคิดขึ้น

UPDATE

ความคิดเห็นสองข้อด้านล่างดูเหมือนจะไม่เห็นด้วยกับคำตอบของฉันอย่างไรก็ตามฉันคิดว่าพวกเขาพลาดจุดของฉัน สำหรับความรู้ของฉันไม่มีแอปพลิเคชันที่สามารถใช้ลำดับของไบต์ที่ปฏิบัติการได้สำหรับสถาปัตยกรรมเดียวสลายมันในระดับ bytecode รวมถึงการโทรที่จำเป็นทั้งหมดเพื่อ extrnal library รวมถึงการเรียกใช้เคอร์เนล OS พื้นฐานและรวมกันอีกครั้งสำหรับระบบอื่นและบันทึก ส่งผลให้ bytecode ไม่มีแอปพลิเคชันที่สามารถใช้งานอะไรง่ายๆอย่าง Notepad.exe ย่อยสลายไฟล์ขนาดเล็ก 190k ที่มันเป็นและ 100% ประกอบเข้าด้วยกันอีกครั้งในแอปพลิเคชันที่สามารถทำงานบน Linux หรือ OSX

ฉันเข้าใจว่าผู้ถามคำถามต้องการทราบว่าหากเราสามารถจำลองซอฟต์แวร์หรือเรียกใช้แอปพลิเคชันผ่านทางโปรแกรมอย่าง Wine หรือ Parallels ทำไมเราไม่สามารถแปลรหัส byte สำหรับระบบที่แตกต่างกันได้ เหตุผลก็คือถ้าคุณต้องการประกอบแอปพลิเคชั่นใหม่สำหรับสถาปัตยกรรมอื่นอย่างสมบูรณ์คุณจะต้องสลายรหัสไบต์ทั้งหมดที่ใช้ในการเรียกใช้ก่อนที่จะประกอบใหม่อีกครั้ง มีทุกแอปพลิเคชันมากกว่าแค่ไฟล์ exe พูดสำหรับเครื่อง Windows แอปพลิเคชัน Windows ทั้งหมดใช้เคอร์เนลและฟังก์ชัน Windows เคอร์เนลระดับต่ำในการสร้างเมนูพื้นที่ข้อความวิธีการปรับขนาดหน้าต่างการวาดภาพไปยังจอแสดงผลการส่ง / รับข้อความ OS และอื่น ๆ ...

รหัสไบต์ทั้งหมดนั้นจะต้องถูกถอดแยกชิ้นส่วนหากคุณต้องการประกอบซ้ำกับแอปพลิเคชันและทำให้มันทำงานบนสถาปัตยกรรมที่แตกต่างกัน

แอปพลิเคชันเช่นไวน์ตีความไบนารีของ Windows ในระดับไบต์ พวกเขารู้จักการเรียกใช้เคอร์เนลและแปลการโทรเหล่านั้นไปยังฟังก์ชัน Linux ที่เกี่ยวข้องหรือจำลองสภาพแวดล้อม Windows แต่นั่นไม่ใช่การส่งต่อแบบไบต์ต่อไบต์ (หรือ opcode สำหรับ opcode) มันเป็นการแปลแบบฟังก์ชั่นสำหรับฟังก์ชั่นมากกว่าและมันค่อนข้างแตกต่างกันเล็กน้อย


มันไม่ใช่ทฤษฎีเลย และมีแอพพลิเคชั่นมากมายที่รันไบนารีอื่น ๆ บนระบบปฏิบัติการที่แตกต่างกัน คุณเคยได้ยินเรื่องไวน์หรือไม่ มันรันไบนารี Windows บนระบบปฏิบัติการที่แตกต่างกันเช่น Linux, Solaris, Mac OSX, BSD และอื่น ๆ
Keltari

ความแตกต่างในระบบปฏิบัติการสามารถปรับให้เข้ากับระบบส่วนใหญ่ได้อย่างง่ายดายโดยใช้ไฮเปอร์ไวเซอร์เพื่อเรียกใช้ระบบปฏิบัติการหลายระบบ AFAIK ตัวประมวลผลที่ไม่ฝังตัว "ทันสมัย" ทั้งหมดเป็น "เสมือนจริง" ดังนั้นจึงไม่จำเป็นต้องมีการจำลอง / แปลชุดคำสั่ง
Daniel R Hicks

0

ดูเหมือนว่าผู้เชี่ยวชาญทุกคนจะหายไปจุดนี้: 'การแปล' มีความซับซ้อน แต่เหมาะมากสำหรับคอมพิวเตอร์ แต่หลังจากการแปลโปรแกรมต้องการการสนับสนุนระบบปฏิบัติการเช่น: GetWindowVersion ไม่มีอยู่ใน Linux โดยทั่วไปแล้วเครื่องจำลองนี้จ่ายให้ (ขนาดใหญ่มาก) ดังนั้นคุณสามารถ 'แปลล่วงหน้า' โปรแกรมง่ายๆ แต่คุณต้องเชื่อมโยงไปยัง libary ขนาดใหญ่เพื่อให้ทำงานได้อย่างอิสระ การถ่ายภาพโปรแกรม windows ทุกโปรแกรมมาพร้อมกับ kernel.dll + user.dll + shell.dll ของตัวเอง ...


มันไม่เพียงแค่ลำบาก แต่ต้องใช้สติปัญญา ตัวอย่างเช่นสมมติว่าคุณเห็นการคำนวณบางอย่างที่ผลลัพธ์กำหนดที่อยู่ที่คุณข้ามไปซึ่งอาจอยู่ตรงกลางของบางสิ่งที่ดูเหมือนจะเป็นคำสั่งเดียว
David Schwartz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.