ทำไมไฟล์ที่เรียกใช้งานจึงขึ้นอยู่กับระบบปฏิบัติการ แต่ไม่ได้ใช้กับซีพียู


16

ถ้าฉันเขียนโปรแกรม C และคอมไพล์มันลงใน.exeไฟล์ไฟล์นั้น.exeจะมีคำสั่งเครื่องดิบไปยัง CPU (ฉันคิด).

ถ้าเป็นเช่นนั้นจะเป็นไปได้อย่างไรที่ฉันจะเรียกใช้ไฟล์ที่คอมไพล์ในคอมพิวเตอร์เครื่องใดก็ได้ที่ใช้ Windows รุ่นทันสมัย CPU แต่ละตระกูลมีชุดคำสั่งต่างกัน ดังนั้นคอมพิวเตอร์เครื่องใดที่ใช้ระบบปฏิบัติการที่เหมาะสมสามารถเข้าใจคำแนะนำใน.exeไฟล์ของฉันได้อย่างไรไม่ว่าจะเป็น CPU จริงหรือไม่

นอกจากนี้บ่อยครั้งในเว็บไซต์ในหน้า "ดาวน์โหลด" ของแอพพลิเคชั่นบางตัวคุณมีการดาวน์โหลดสำหรับ Windows สำหรับ Linux และสำหรับ Mac (มักดาวน์โหลดสองครั้งสำหรับแต่ละระบบปฏิบัติการสำหรับคอมพิวเตอร์ 86 และ 64 บิต) เหตุใดจึงไม่มีการดาวน์โหลดเพิ่มเติมจำนวนมากสำหรับซีพียูแต่ละตระกูล


4
ซีพียูมีมาตรฐานเช่น x86, 64b และอื่น ๆ executables จะขึ้นอยู่กับซีพียู คุณไม่สามารถเรียกใช้ exe ของคุณที่คุณกล่าวถึงใน CPU พิเศษบางอย่างเช่น RISC มี CPU วัตถุประสงค์พิเศษมากมายเช่นกัน
InformedA

ระบบปฏิบัติการประกอบด้วยไฟล์ปฏิบัติการและขึ้นอยู่กับ CPU ไม่ใช่ในระบบปฏิบัติการเพราะเป็นระบบปฏิบัติการ
Tulains Córdova

เนื่องจากความเข้ากันได้ย้อนหลัง
MiKL

2
มักจะดาวน์โหลดสองครั้งสำหรับแต่ละระบบปฏิบัติการสำหรับคอมพิวเตอร์ 86 และ 64 บิต : ฉันตีความว่าเป็นการพึ่งพาของ executables บนซีพียู
mouviciel

คำตอบ:


37

การปฏิบัติการนั้นขึ้นอยู่กับทั้ง OS และ CPU:

  • Instruction Set:คำสั่งไบนารีในการปฏิบัติการถูกถอดรหัสโดย CPU ตามชุดคำสั่งบางอย่าง CPU สำหรับผู้บริโภคส่วนใหญ่รองรับชุดคำสั่ง x86 (“ 32 บิต”) และ / หรือ AMD64 (“ 64 บิต”) โปรแกรมสามารถรวบรวมสำหรับชุดคำสั่งเหล่านี้ แต่ไม่ใช่ทั้งสองชุด มีส่วนขยายของชุดคำสั่งเหล่านี้ การสนับสนุนสำหรับสิ่งเหล่านี้สามารถสอบถามได้ที่รันไทม์ ส่วนขยายดังกล่าวเสนอการรองรับ SIMD การปรับแต่งคอมไพเลอร์อาจพยายามใช้ประโยชน์จากส่วนขยายเหล่านี้หากมีอยู่ แต่โดยปกติแล้วจะเสนอเส้นทางของรหัสที่ทำงานโดยไม่มีส่วนขยายใด ๆ

  • รูปแบบไบนารี่:ไฟล์สั่งการจะต้องเป็นไปตามรูปแบบไบนารี่ซึ่งช่วยให้ระบบปฏิบัติการโหลดเริ่มต้นและเริ่มโปรแกรมได้อย่างถูกต้อง Windows ส่วนใหญ่ใช้รูปแบบ Portable Executable ในขณะที่ Linux ใช้ ELF

  • API ของระบบ:โปรแกรมอาจใช้ไลบรารีซึ่งจะต้องมีอยู่ในระบบปฏิบัติการ หากโปรแกรมใช้ฟังก์ชั่นจาก Windows API จะไม่สามารถเรียกใช้บน Linux ได้ ในโลก Unix API ของระบบปฏิบัติการกลางได้รับการกำหนดมาตรฐานให้กับ POSIX: โปรแกรมที่ใช้เฉพาะฟังก์ชั่น POSIX จะสามารถทำงานบนระบบ Unix ที่สอดคล้องเช่น Mac OS X และ Solaris

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

อย่างไรก็ตามมีวิธีในการบรรลุความเข้ากันได้มากขึ้น:

  • ระบบที่ทำงานบนชุดคำสั่ง AMD64 โดยทั่วไปจะเรียกใช้โปรแกรมปฏิบัติการ x86 รูปแบบไบนารีบ่งชี้ว่าจะเรียกใช้โหมดใด การจัดการทั้งโปรแกรม 32 บิตและ 64 บิตนั้นต้องใช้ความพยายามเพิ่มเติมจากระบบปฏิบัติการ

  • รูปแบบไบนารีบางรูปแบบอนุญาตให้ไฟล์มีหลายเวอร์ชันของโปรแกรมรวบรวมสำหรับชุดคำสั่งต่าง ๆ Apple ได้รับการสนับสนุนจาก "fat ไบนารี" ในขณะที่พวกเขาเปลี่ยนจากสถาปัตยกรรม PowerPC เป็น x86

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

  • ระบบปฏิบัติการหนึ่งระบบสามารถรองรับรูปแบบไบนารี่ได้หลายแบบ Windows ใช้งานได้ค่อนข้างย้อนหลังและยังคงรองรับรูปแบบจากยุค DOS บน Linux ไวน์อนุญาตให้โหลดรูปแบบ Windows

  • API ของระบบปฏิบัติการหนึ่งสามารถนำมาใช้ใหม่สำหรับโฮสต์ระบบปฏิบัติการอื่น บน Windows ระบบย่อย Cygwin และ POSIX สามารถใช้เพื่อรับสภาพแวดล้อมที่สอดคล้องกับ POSIX (ส่วนใหญ่) บน Linux ไวน์จะใช้ Windows APIs จำนวนมากอีกครั้ง

  • ไลบรารีข้ามแพลตฟอร์มอนุญาตให้โปรแกรมเป็นอิสระจาก OS API ภาษาการเขียนโปรแกรมจำนวนมากมีไลบรารีมาตรฐานที่พยายามทำให้สำเร็จเช่น Java และ C

  • จำลองเลียนแบบระบบที่แตกต่างกันโดยแยกรูปแบบไบนารีต่างประเทศการตีความคำแนะนำและเสนอขาย reimplementation ของ API ที่จำเป็นทั้งหมด ตัวเลียนแบบมักใช้เพื่อเรียกใช้เกม Nitendo แบบเก่าบนพีซีที่ทันสมัย


10
คุณควรพูดถึงว่าทั้ง java และ. net เป็นตัวอย่างของการใช้รูปแบบสื่อกลาง - รูปแบบสื่อกลางเป็นที่นิยมอย่างมากในปัจจุบันและไม่เพียง แต่เป็นที่ระลึกถึงระบบในปี 1970 ที่วิ่งออกมาจากแผ่นฟลอปปี 5 1/4
jmoreno

@AKoscianski ขอขอบคุณสำหรับการแก้ไขปัญหา อย่างไรก็ตามฉันคิดว่าการออกแบบความปลอดภัยไม่ได้เป็นเหตุผลว่าทำไมปฏิบัติการขึ้นอยู่กับระบบปฏิบัติการ แต่เหตุผลที่ทำให้เราแยก OS กับ userland ตั้งแต่แรก API ที่แตกต่างกันกับฟังก์ชั่นระบบปฏิบัติการที่ได้รับการป้องกันดังกล่าวได้รับการแก้ไขแล้วโดยส่วน "System APIs" ของคำตอบนี้
amon

2

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

MacOS X และ iOS รองรับ "fat ไบนารี" - สิ่งที่คุณดาวน์โหลดจริง ๆ อาจมีรุ่นสำหรับโปรเซสเซอร์ที่แตกต่างกัน ไม่มีใครสร้างแอปพลิเคชั่นสำหรับตัวประมวลผล PowerPC อีกต่อไป แต่ในบางจุดเมื่อไม่กี่ปีที่ผ่านมาปฏิบัติการอาจมี PowerPC, Intel 32 บิตและ 64 บิต Intel และรุ่นที่ถูกต้อง ทุกวันนี้บน iOS เมื่อคุณดาวน์โหลดแอพคุณจะได้รับเวอร์ชันที่เหมาะสมสำหรับโปรเซสเซอร์บนอุปกรณ์ของคุณ ดาวน์โหลดบนอุปกรณ์อื่นและคุณจะได้รับเวอร์ชันที่ต่างออกไป ผู้ใช้มองไม่เห็นทั้งหมด


-1

exe มีข้อมูลมากกว่ารหัสเครื่องดิบ ระบบปฏิบัติการจะอ่านสิ่งนี้เมื่อทำการโหลดและสามารถหาวิธีที่จะทำงานได้

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

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