คำสั่ง Linux เพื่อส่งคืนจำนวนบิต (32 หรือ 64)?


13

อะไรคือคำสั่ง Linux ที่ฉันสามารถรันเพื่อส่งคืน 32 หรือ 64 โดยทางโปรแกรมเพื่อระบุว่าโปรเซสเซอร์เป็นโปรเซสเซอร์ 32 บิตหรือ 64 บิต?


1
@Syaya: นั่นไม่ได้ซ้ำกันอย่างแน่นอนเพราะโปรเซสเซอร์สามารถ 64 บิตแม้ว่า Linux จะไม่
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


13
  • คุณสามารถดูว่าCPUเป็น 64 บิต 32 บิตหรือความสามารถของทั้งสองโดยการตรวจสอบสายในflags /proc/cpuinfoคุณต้องรู้ธงที่เป็นไปได้ในตระกูลสถาปัตยกรรมของคุณ ตัวอย่างเช่นบนแพลตฟอร์ม i386 / amd64 lmแฟล็กจะระบุซีพียูที่ใช้งานได้ amd64 (CPU ที่ไม่มีแฟล็กนั้นคือ i386- เท่านั้น)

    grep -q '^flags\s*:.*\blm\b' /proc/cpuinfo    # Assuming a PC
    
  • คุณสามารถดูว่าเคอร์เนลเป็น 32 บิตหรือ 64 uname -mบิตโดยการสอบถามสถาปัตยกรรมที่มี ตัวอย่างเช่นi[3456]86เป็น 32- บิตในขณะที่x86_6464- บิต โปรดทราบว่าในสถาปัตยกรรมหลาย ๆ ตัวเคอร์เนล 64 บิตสามารถรันโปรแกรม userland แบบ 32 บิตดังนั้นแม้ว่าuname -mเคอร์เนลจะแสดง 64- บิตไม่มีการรับประกันว่าไลบรารี 64 บิตจะพร้อมใช้งาน

    [ "$(uname -m)" = "x86_64" ]    # Assuming a PC
    

    โปรดทราบว่าuname -mอาจส่งคืนค่า“ เสมือนจริง” ตัวอย่างเช่นภายใต้ลินุกซ์ถ้าคุณทำงานsetarch i386 bashบนระบบ AMD64 และคุณเรียกใช้uname -mจากทุบตีที่คุณจะเห็นรายงานuname -m i386สิ่งนี้ช่วยให้คุณแกล้งทำเป็นว่าคุณอยู่ใน“ ระบบ 32 บิต” ได้อย่างมีประสิทธิภาพแม้ว่าเคอร์เนลจะเป็น 64- บิตตัวอย่างเช่นการคอมไพล์โปรแกรม 32- บิตโดยไม่ต้องตั้งค่าการคอมไพล์ข้าม

  • คุณสามารถดูสิ่งที่มีอยู่ใน userland โดยการสอบถามการสนับสนุนLSBด้วยlsb_releaseคำสั่ง แม่นยำยิ่งขึ้นlsb_release -sพิมพ์:รายการแยกของคุณสมบัติ LSB ที่รองรับ คุณลักษณะแต่ละคนมีรูปแบบ ตัวอย่างเช่นความพร้อมใช้งานของไลบรารี ix86 C ถูกระบุโดยในขณะที่เป็นอะนาล็อกสำหรับ amd64 ไม่ใช่ว่าทุกการแจกจ่ายจะประกาศโมดูล LSB ที่มีอยู่ทั้งหมด แต่อาจมีมากกว่านั้นที่ตรวจพบได้ด้วยวิธีนี้module-version-architecturecore-2.0-ia32core-2.0-amd64

  • คุณสามารถหาขนาดคำแนะนำสำหรับการพัฒนา (สมมติว่าคอมไพเลอร์ C สามารถใช้ได้) โดยการรวบรวมโปรแกรม 5 บรรทัดซีที่พิมพ์หรือsizeof(void*)sizeof(size_t)


3
บนระบบ GNU (และอื่น ๆ หากมี) คุณควรจะสามารถทำgetconf WORD_BITหรือgetconf LONG_BITแทนที่จะต้องคอมไพล์โปรแกรม C ของคุณเอง (ไม่สำคัญและพกพาได้แม้ว่ามันจะเป็น)
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

@Dennis: ขอบคุณสำหรับการแก้ไข ฉันไม่ได้คิดที่จะใช้getconfที่นี่ มันฟังดูดีในหลักการ แต่มันก็ยากที่จะมั่นใจได้ว่าผลลัพธ์ที่นำไปใช้กับคอมไพเลอร์ C ที่คุณจะใช้หากมีมากกว่าหนึ่ง (โดยทั่วไปคือ gcc / icc หรือคล้ายกันบน Linux, gcc / native cc ที่อื่น) ในระบบมาตรฐานgetconfควรนำไปใช้c89หรือc99ใน$(getconf PATH)แต่ในทางปฏิบัติฉันกังวลเกี่ยวกับคนที่ติดตั้งทางเลือกccซึ่งใช้โดยc89wrapper ผู้ขาย
Gilles 'หยุดความชั่วร้าย'

มีความเป็น.ขาดหายไปใน regex grep '^flags.*:.*\blm\b' /proc/cpuinfoนี้: นอกจากนี้ยังใช้งานได้เฉพาะกับฉันหากไม่มี-qธง
byf-ferdy

@ byf-ferdy มันไม่ได้หายไป.: ฉันมี "ศูนย์หรือมากกว่าช่องว่าง" แต่จริงๆแล้วมีแท็บ ฉันเปลี่ยน regexp เพื่ออนุญาตแท็บด้วย ด้วย-qแฟล็กไม่มีเอาต์พุต แต่สถานะออกของคำสั่งจะบอกคุณว่ามีแฟล็กอยู่หรือไม่ หากคุณต้องการเอาต์พุตให้ลบ-qแฟล็ก
Gilles 'หยุดความชั่วร้าย'

@Gilles อาฉันไม่รู้เกี่ยวกับ-qธง Ty ใช้งานได้แล้ว :)
byf-ferdy

3

คุณสามารถใช้uname -aและค้นหาx86_64เพื่อดูว่าคุณใช้ 64- บิตหรือไม่ สิ่งอื่น (เท่าที่ผมรู้) และคุณกำลังทำงาน 32 บิตหรือคุณอยู่บนฮาร์ดแวร์ที่ไม่ใช่พีซีเช่นalpha, หรือsparcppc64


3
และสิ่งอื่น ๆ ที่คุณกำลังใช้งานแบบ 32 บิตหรือฮาร์ดแวร์ที่ไม่ใช่พีซี (เช่นalpha, sparc64, ppc64...
กิลส์ 'ทีเราชั่วร้ายหยุดเป็น'

@Gilles: ขอบคุณฉันแก้ไขคำตอบของฉันแล้ว
Wuffers


1

ประเภท:

uname -a

หากคุณได้รับx86_64 GNU/Linuxคุณกำลังใช้เคอร์เนล 64 บิต หากคุณได้สิ่งที่คล้ายกับi386/i486/i586/i686คุณมากที่สุดอาจใช้เคอร์เนล 32 บิต


1
นั่นไม่ใช่คำถาม
harrymc

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