เคอร์เนล 64 บิต แต่ทุกกระบวนการทำงานได้ของ ELF 32- บิตนี่คืออะไร?


9

ผลลัพธ์จากuname:

root@debian:~ # uname -a
Linux 5asnb 2.6.32-5-amd64 #1 SMP Mon Jun 13 05:49:32 UTC 2011 x86_64 GNU/Linux

อย่างไรก็ตาม/sbin/initไฟล์ปฏิบัติการแสดงเป็น 32- บิต:

root@debian:~ # file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

ด้านอื่น ๆ ของระบบดูเหมือนจะขัดแย้งกับสิ่งต่าง ๆ เช่นกัน:

root@debian:~ # echo $HOSTTYPE
i486

root@debian:~ # getconf LONG_BIT
32

คำตอบ:


13

เคอร์เนล 64 บิตสามารถติดตั้งบน Debian 32 บิต คุณจะเห็นว่าเคอร์เนล amd64 สามารถใช้ได้สำหรับ 32bit Debian ที่เป็นของหน้าแพคเกจ สามารถใช้เป็นทางเลือกแทนการใช้เคอร์เนลที่เปิดใช้งาน PAE เพื่อสนับสนุน RAM ทั้งหมดมากกว่า 4G โปรดทราบว่าไบนารี 32 บิตยังคงไม่สามารถเข้าถึง RAM ของ 3G ได้มากกว่าคร่าวๆต่อกระบวนการ


ขอบคุณ! คำตอบของคุณนั้นชัดเจนเหมือนลูกบอลคริสตัล ~: D ไม่เคยสังเกต Debian ใช้แพ็คเกจเคอร์เนลแบบนี้
kiiwii

1
ไม่เป็นความจริง: โปรแกรม 32 บิตสามารถใช้ 4Gio ทั้งหมดของพื้นที่ที่อยู่เสมือนของพวกเขาเมื่อทำงานบนเคอร์เนล 64 บิต (ยกเว้นว่าพวกเขากำลังทำงานกับบุคลิกภาพ ADDR_LIMIT_3GB)
ysdx

@ysdx ดังนั้นการ จำกัด ขนาด 2GB เป็นสิ่งเฉพาะของ Windows และที่อยู่ด้านบน 0x80000000 จะได้รับอนุญาตใน userspace แบบ 32 บิต?
Paul Stelian

1
@ PaulStelian บน Windows 32 บิตโดยปกติแล้วคุณจะ จำกัด หน่วยความจำเสมือน 2GB ต่ำสุดสำหรับความเข้ากันได้ย้อนยุค (ฉันคิดว่าบางโปรแกรมใช้เพื่อสำรองพอยน์เตอร์ไปยังหน่วยความจำเสมือนสูงสุด 2GB สำหรับวัตถุประสงค์พิเศษ) คุณสามารถตั้งค่าสถานะ LARGEADDRESSAWARE ในไฟล์เรียกทำงาน ( docs.microsoft.com/fr-fr/cpp/build/reference/ … ) ของคุณเพื่อเลือกรับการเข้าถึงหน่วยความจำเสมือน 4GB ทั้งหมด
ysdx

15

โปรเซสเซอร์ทั้งหมดที่รองรับชุดคำสั่งx64 (หรือที่เรียกว่า x86_64 หรือ amd64) ยังรองรับชุดคำสั่งx86 (หรือที่เรียกว่า i386 หรือ i686 ซึ่งเป็นรุ่นที่เฉพาะเจาะจงที่พูด x86 อย่างเคร่งครัด) เดียวกันจะไปสำหรับARM A64 (ใหม่ 64 บิตชุดคำสั่งที่ปรากฏใน ARMv8) และ A32 (ชื่อสำหรับ“คลาสสิก” ชุดคำสั่ง 32 บิต) สำหรับSPARC64และSPARCและผมเชื่อว่าสำหรับMIPS64และMIPS ดังนั้นในตระกูลสถาปัตยกรรมทั้งหมดหากโปรเซสเซอร์สามารถเรียกใช้รหัส 64 บิตได้ก็สามารถเรียกใช้รหัส 32 บิตได้

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

นี่คือตัวเลือกการออกแบบใน Linux ซึ่งได้รับแรงบันดาลใจจากความปรารถนาที่จะใช้งานไบนารี 32 บิตที่มีอยู่ในการติดตั้ง 64 บิต ตัวเลือก Unix อื่น ๆ มีตัวเลือกที่แตกต่างกัน: Solaris สามารถเรียกใช้โปรแกรม 64 บิตบนเคอร์เนล 32 บิตรวมถึงวิธีอื่น ๆ ในขณะที่ OpenBSD ไม่สามารถเรียกใช้โปรแกรม 32 บิตบนเคอร์เนล 64 บิต

คุณจะได้รับข้อมูลเกี่ยวกับหน่วย/proc/cpuinfoใน หาก CPU x86 ของคุณมีlmธงแสดงว่าเป็น CPU 64 บิต

โดยค่าเริ่มต้นuname -mหรือarchแสดงสถาปัตยกรรมที่เคอร์เนลถูกคอมไพล์ Linux สามารถตั้งค่า "บุคลิกภาพ" ของการpersonalityเรียกใช้ระบบ(ด้วย) คุณสามารถเรียกใช้กระบวนการย่อยในบุคลิกภาพที่แตกต่างด้วยsetarchคำสั่ง; setarch i686 someprogramหรือlinux32 someprogramรันโปรแกรมที่ระบุไว้ในสภาพแวดล้อมที่uname -mผลตอบแทนi686ในขณะที่setarch amd64 someprogramหรือlinux64 someprogramรันโปรแกรมที่ระบุไว้ในสภาพแวดล้อมที่ผลตอบแทนuname -mamd64

file /sbin/initบอกให้คุณทราบว่าสถาปัตยกรรมinitโปรแกรมที่คอมไพล์แล้ว แม้ว่ามันจะเป็นไปได้ที่จะผสมเอ็กซีคิ้วท์แบบ 32 บิตและ 64 บิตในการติดตั้งโดยปกติแล้วโปรแกรมหลักของระบบปฏิบัติการหลักทั้งหมดจะมาจากสถาปัตยกรรมเดียวกันเพราะมันง่ายต่อการจัดการ

$HOSTYPEเป็นตัวแปร bash และบอกคุณว่าสถาปัตยกรรมใดที่bashโปรแกรมรวบรวม

getconf LONG_BITช่วยให้คุณทราบว่าคอมไพเลอร์ C เริ่มต้นถูกตั้งค่าให้คอมไพล์โปรแกรม 32- บิตหรือ 64- บิต การทดสอบที่แม่นยำยิ่งขึ้นคือการรวบรวมและเรียกใช้โปรแกรมที่พิมพ์sizeof(void*)หรือsizeof(size_t)- การโทรgetconfสามารถให้ข้อมูลเกี่ยวกับสิ่งที่getconfคิดว่าเป็นคอมไพเลอร์เริ่มต้นเท่านั้น


1
แท้จริงแล้ว Solaris 32 บิตเปลี่ยนเป็นโหมด 64 บิตเพื่อเปลี่ยนไปใช้กระบวนการ 64 บิตแล้วเปลี่ยนกลับ สิ่งนี้จะต้องมีค่าใช้จ่ายมากและไม่สมเหตุสมผลเพราะเคอร์เนลนั้นมีประสิทธิภาพ 64 บิต
Ruslan

1
@ Ruslan ทำไมมันมีค่าใช้จ่ายมาก? การสลับโหมดบนสวิตซ์บริบทนั้นมีค่าใช้จ่ายไม่มาก (ถ้ามีอะไรฉันไม่รู้ x86 ที่ระดับต่ำพอ) เคอร์เนลยังคงที่อยู่เสมือนแบบ 32 บิต: 32 บิตสำหรับการแมปเคอร์เนลใช้ชุดคำสั่งแบบ 32 บิต
Gilles 'ดังนั้นหยุดความชั่วร้าย'

1
เคอร์เนลต้องบำรุงรักษาโครงสร้างข้อมูล 64- บิตเฉพาะเพื่อรองรับแอป 64 บิตอย่างน้อย 64 บิตหน้าตารางทราบ นี่ทำให้มันไม่ใช่เคอร์เนลขนาด 32 บิต ฉันไม่ได้พยายามเจาะลึก amd64 arch จริงๆ แต่ฉันคิดว่าการปิดการสนับสนุน 64 บิตจะมีค่าใช้จ่ายจำนวนมากตรงกันข้ามกับการใช้โหมดความเข้ากันได้ที่ออกแบบมาเป็นพิเศษ
Ruslan

1
@Ruslan มีเพียงหน้า 64- บิตที่ทราบตารางและจำเป็นจริงๆและเป็นค่าใช้จ่ายเล็กน้อย ทุกสิ่งสามารถหลีกเลี่ยงได้ด้วยการออกแบบเคอร์เนลที่เหมาะสม ฉันไม่เคยขุดลงในเคอร์เนล Solaris ฉันคิดว่าพวกเขาจัดเรียงเพื่อให้มีความยืดหยุ่นเพียงพอ (พวกเขาเคยมีประสบการณ์กับ SPARC64 มาก่อน)
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.