ฉันจะรู้ได้อย่างไรว่าเคอร์เนล linux ของฉันทำงานใน 32 บิตหรือ 64 บิต


10

เมื่อฉันทำแมวใน / proc / cpuinfo มันจะแสดงบรรทัดที่มี clflushsize: 64

นี่หมายความว่าเคอร์เนลของฉันทำงานเป็น 64 บิตหรือไม่?

คำตอบ:


15
uname -a

จะบอกคุณเคอร์เนล - บิตสุดท้ายบอกสถาปัตยกรรม

สองตัวอย่าง:

แม็คของฉัน:

Darwin Mac.local 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:55:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_I386 i386

โฮสติ้ง Dreamhost ของฉัน:

Linux ecco 2.6.24.5-serf-xeon-c6.1-grsec #1 SMP Tue Oct 7 06:18:04 PDT 2008 x86_64 GNU/Linux

i386 = 32 บิต

x86_64 = 64 บิต


3
คำตอบนี้ผิด บิตสุดท้ายจะบอกสถาปัตยกรรมที่เปิดเผยกับกระบวนการไม่ใช่สถาปัตยกรรมเคอร์เนล ดูลิงค์นี้
David Schwartz

12

uname -mจะให้สถาปัตยกรรมที่เคอร์เนลที่คุณคอมไพล์ด้วย หากพิมพ์ออกi686มาเคอร์เนลของคุณคือ 32 บิตถ้าx86_64เป็น 64 บิตถือว่าคุณมีชิป Intel / AMD


ยังอาจเป็นi386พี่แพลตฟอร์ม 32 บิต (และฉันได้เห็นแม้กระทั่งบางแพคเกจเรียบเรียงสำหรับi586- ไม่แน่ใจว่าที่เคยจะถูกส่งออกโดยunameแม้ว่า)
a_m0d

3
คำตอบนี้ผิด uname -mให้สถาปัตยกรรมแก่เคอร์เนลที่เลือกที่จะเปิดเผยกับกระบวนการนี้ไม่ใช่สถาปัตยกรรมดั้งเดิมของเคอร์เนล ดูลิงค์นี้
David Schwartz

@David Schwartz: ความคิดเห็นของคุณรุนแรงเกินไปโดยไม่มีเหตุผลที่ดีและความจริงที่ว่าคุณโพสต์ไม่มีทางเลือกก็ทำให้ดูแย่ลงไปอีก โปรดทราบว่าโดยค่าเริ่มต้นuname -m จะรายงานสถาปัตยกรรมจริง ถ้าไม่ใช่ก็เป็นไปได้ว่าผู้ดูแลระบบต้องการให้คุณเชื่อว่าคุณอยู่ในสถาปัตยกรรมอื่นและทางออกที่ดีที่สุดของคุณคือยอมรับว่าเขารู้ว่าเขากำลังทำอะไรอยู่ หากคุณเป็นผู้ดูแลระบบและคุณกำลังเล่นกับsetarchคุณก็จะรู้ดีกว่าอยู่แล้ว
ndemou

ฉันไม่รู้ว่าอะไรเป็นความจริงเกี่ยวกับคำแถลงข้อเท็จจริงที่แท้จริงว่าคำตอบนั้นผิด คุณหมายความว่าอย่างไรโดยทำให้มันดูแย่ลง อาจจะไม่มีทาง อาจจะมีวิธีที่ดี ฉันไม่ได้รู้ดังนั้นฉันจึงไม่ตอบคำถามนี้ ในตอนท้ายของความคิดเห็นของคุณฉันแค่ไม่เห็นด้วย สคริปต์สามารถทำได้ทำและใช้setarchและคุณอาจเรียกใช้สคริปต์ดังกล่าวโดยไม่ต้องมีความคิดใด ๆ ที่ทำให้เกิดuname -mการส่งคืนสิ่งที่แตกต่าง อาจเป็นไปได้ว่าอาจเป็นไปได้ว่าปัญหาประเภทนี้เป็นสาเหตุที่ OP ถาม
David Schwartz

@ ผู้ดูแลระบบอาจตั้งค่าระบบในลักษณะที่แอพพลิเคชั่นใด ๆ รวมทั้งinitคิดว่ามันเป็นแบบ 32 บิต: สถานการณ์สำหรับเรื่องนี้คือเคอร์เนล 64- บิตที่มีผู้ใช้ 32- บิต ระบบการรวบรวมจำนวนมากขึ้นอยู่กับuname -mการกำหนดธงคอมไพเลอร์เช่นของ GDB พวกเขาจะต้องมาพร้อมกับบุคลิกภาพปลอม แต่แอปพลิเคชัน userspace อื่น ๆ ยังคงต้องการทราบว่าเคอร์เนลชนิดใดที่มี (เช่นสำหรับความต้องการระดับต่ำ) โดยไม่คำนึงถึงบุคลิกภาพ
Ruslan


2

หากคุณต้องการรายงานที่ง่าย แต่มีรายละเอียดเกี่ยวกับระบบของคุณ (CPU, Kernel และซอฟต์แวร์ Core OS) ไม่ใช่แค่เคอร์เนลเท่านั้นนี่เป็นสคริปต์ทุบตีเล็ก ๆ ที่จะให้คำตอบของคุณได้อย่างรวดเร็ว

หากคุณรู้เพียงพอเกี่ยวกับคุณลักษณะเฉพาะของ 32 บิต / 64 บิตซีพียูและ S / W มันก็มีประโยชน์ หากคุณไม่รู้อะไรมากและคิดว่า"ระบบ"ของคุณเป็น 32 บิตหรือ 64 บิตก็จะช่วยให้คุณค้นพบว่าความจริงนั้นซับซ้อนกว่าเดิม (บางส่วนของระบบของคุณอาจเป็น 64 บิตในขณะที่คนอื่น ๆ 32 บิต) โดยไม่ทำให้คุณสับสน

อีกครั้งสคริปต์นี้ (และคำตอบ) ไม่ได้สำหรับคำถามที่แท้จริง"ฉันจะรู้ได้อย่างไรว่าเคอร์เนล Linuxของฉันทำงานใน 32 บิตหรือ 64 บิต?" แต่สำหรับผู้ที่ต้องการทราบส่วนโค้งของ CPU และ core OS SW

ตัวอย่างรายงาน

นี่เป็นตัวอย่างสำหรับกรณีที่ค่อนข้างผิดปกติ:

รายงานจาก mini-script (สำหรับผู้ใช้ที่มีประสบการณ์)

You have a 64 bit CPU
Your kernel reports that the architecture is 32 bit
Your /sbin/init process is 64 bit
Your C compiler is configured to produce 32 bit executables

รายงานจากสคริปต์ขนาดใหญ่ (สำหรับผู้ใช้ที่มีประสบการณ์น้อย)

You have a 64 bit CPU
Your kernel reports that the architecture is 32 bit
    If you are not the admin he can make a 64bit kernel report 32bit (see man setarch)
    In this case he has (because we have 64bit programs)
Your /sbin/init process is 64 bit
    Most other core OS programs will probably be 64 bits also.
    You may use the following command to check a specific program.
      file -L /path/to/program
Your C compiler is configured to produce 32 bit executables
    (Note that a 64bit compiler may be setup to produce 32bit code)

สคริปต์

มินิสคริปต์ (สำหรับผู้ดูแลระบบที่มีประสบการณ์)

4 บรรทัดเหล่านี้ให้ข้อมูลที่จำเป็นทั้งหมด

grep -w 'lm' /proc/cpuinfo > /dev/null && echo "You have a 64 bit CPU" || echo "You have a 32 bit CPU"
echo "Your kernel reports that the architecture is $(uname -m|sed -e 's/x86_64/64 bit/' -e 's/i.86/32 bit/')"
echo "Your /sbin/init process is $(file /sbin/init|sed -e 's/^.* \(32\|64\) bit.*$/\1bit/')"
echo "Your C compiler is configured to produce $(getconf LONG_BIT) bit executables"

สคริปต์ที่ใหญ่ขึ้น (สำหรับผู้ใช้ที่มีประสบการณ์น้อย)

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

#!/bin/bash

# collect system info
grep -w 'lm' /proc/cpuinfo > /dev/null && CPU=64 || CPU=32
ARCH=$(uname -m|sed -e 's/x86_64/64/' -e 's/i.86/32/')
INIT=$(file -L /sbin/init|sed -e 's/^.* \(32\|64\)-bit.*$/\1/')
COMPILER=$(getconf LONG_BIT)

# if all values are the same we set UNIFORM="YES"
! echo "$CPU $ARCH $INIT $COMPILER" | grep -q "$CPU $CPU $CPU $CPU" && UNIFORM="NO" || UNIFORM="YES"

# report to the user
echo "You have a $CPU bit CPU"
echo "Your kernel reports that the architecture is $ARCH bit"
if [ "$UNIFORM" = "NO" ] && [ "$ARCH" = "32" ] ; then
       echo "    If you are not the admin he can make a 64bit kernel report 32bit (see man setarch)"
       if  [ "$INIT" = "64" ] ||  [ "$COMPILER" = "64" ] ; then
           echo "    In this case he has (because we have 64bit programs)"
       else
           echo "    We don't see such signs so you most likely run a 32bit kernel"
           echo "    (A 64bit CPU can run 32bit kernels)"
       fi
fi
echo "Your /sbin/init process is $INIT bit"
if [ "$CPU" = "64" ] ; then
     echo "    Most other core OS programs will probably be $INIT bits also."
     echo "    You may use the following command to check a specific program."
     echo "      file -L /path/to/program"
fi
if [ "$UNIFORM" = "NO" ] && [ "$INIT" = "32" ] ; then
     echo "    (Note that a 64bit kernel may start a 32bit init process)"
fi
echo "Your C compiler is configured to produce $COMPILER bit executables"
if [ "$UNIFORM" = "NO" ] && [ "$COMPILER" = "32" ] ; then
        echo "    (Note that a 64bit compiler may be setup to produce 32bit code)"
fi

หากคุณต้องการทราบเพิ่มเติมอ่านสองหน้านี้จากที่ฉันได้รับข้อมูลส่วนใหญ่ a) /programming/246007/how-to-determine-whether-a-given-linux-is-32-17 บิตหรือ 64 บิตข) https://unix.stackexchange.com/a/134394/73271


0

หากคุณต้องการเห็นเฉพาะแพลตฟอร์มที่คุณใช้งานอยู่คุณสามารถใช้

uname -i

รายการตัวเลือกทั้งหมดที่รองรับสำหรับunameคือ

$ uname --help
Usage: uname [OPTION]...
Print certain system information.  With no OPTION, same as -s.

  -a, --all                print all information, in the following order,
                             except omit -p and -i if unknown:
  -s, --kernel-name        print the kernel name
  -n, --nodename           print the network node hostname
  -r, --kernel-release     print the kernel release
  -v, --kernel-version     print the kernel version
  -m, --machine            print the machine hardware name
  -p, --processor          print the processor type or "unknown"
  -i, --hardware-platform  print the hardware platform or "unknown"
  -o, --operating-system   print the operating system
      --help     display this help and exit
      --version  output version information and exit

uname -iพิมพ์GenuineIntelซึ่งไม่ใช่สิ่งที่เขาต้องการจริงๆ
drrlvn

และUnknownบน Mac
Bradshaw รวย

พิมพ์i386บนเครื่องของฉัน!
a_m0d

0

CLFLUSHSIZEไม่ได้บอกอะไรคุณเกี่ยวกับโหมดการทำงานของโปรเซสเซอร์ ตามคำตอบนี้มันหมายถึงหน่วยแคชที่เล็กที่สุดที่ล้างได้ ในกรณีของคุณบรรทัดแคชจะอ่าน / เขียนในหน่วยที่ 64 ไบต์

unameเอาต์พุตแตกต่างกันมากเกินกว่าที่จะมีประโยชน์เนื่องจากภาพตัวอย่างของวิกิพีเดียแสดงให้เห็นอย่างรวดเร็ว วิธีการที่เชื่อถือได้มากที่สุดคือgetconf LONG_BITเป็นการแสดงในคำตอบกุมภ์เพาเวอร์ สิ่งนี้ใช้งานได้โดยไม่คำนึงถึงสถาปัตยกรรมโปรเซสเซอร์ดังนั้นอยู่ที่บ้านบน ARM, Power หรือ MIPS เหมือนกับ x86

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