มีคำสั่งของระบบใน Linux หรือไม่ที่รายงานถึง endianness


30

ไม่มีใครรู้คำสั่งที่รายงานว่าระบบเป็น Big Endian หรือ Little Endian หรือเป็นตัวเลือกที่ดีที่สุดในการใช้เทคนิคเช่นนี้โดยใช้ Perl หรือสตริงคำสั่ง?

Perl

# little
$ perl -MConfig -e 'print "$Config{byteorder}\n";'
12345678

# big
$ perl -MConfig -e 'print "$Config{byteorder}\n";'
87654321

od | awk

# little
$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
1

# big
$ echo -n I | od -to2 | awk 'FNR==1{ print substr($2,6,1)}'
0

อ้างอิง


เกิดอะไรขึ้นกับodวิธีการ? มันง่ายและใช้งานได้ทุกที่ มันเป็นสิ่งที่ฉันคิดก่อนอ่านคำถามของคุณ
Gilles 'หยุดความชั่วร้าย'

@Gilles - ไม่มีอะไรเลยรู้สึกเหมือนแฮ็ค (อย่างน้อยสำหรับฉัน) จริงมันจะปรากฏเป็นแบบพกพาในระบบอื่น ๆ เช่น Solaris + AIX แต่ดูเหมือนว่า Endianness ของระบบควรได้รับการกำหนดอย่างชัดเจนมากขึ้นเช่น 32- บิตกับ 64- บิตดังนั้นฉันรู้สึกประหลาดใจเล็กน้อยที่มันไม่ได้ ' เสื้อ lscpuวิธีการใหม่เป็นสิ่งที่ฉันคาดหวังมากขึ้น
slm

Endianness นั้นใช้ง่ายกว่าการกำหนดขนาดของคำศัพท์เนื่องจากคุณจะมีช่วงเวลาที่ยากลำบากในการหาแพลตฟอร์มที่ไม่ใช่ endian เล็ก ๆ น้อย ๆ หรือ big-endian ระหว่าง 32- บิตและ 64- บิต (CPU, kernel, userland, กระบวนการที่กำหนด)
Gilles 'หยุดความชั่วร้าย'

@Gilles - ใช่มุมมองของฉันเกี่ยวกับโลกอาจเล็กน้อยเนื่องจากฉันโตมากับ Solaris หรือ Linux ไม่มากไปกว่านั้น
slm

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

คำตอบ:


40

lscpu

lscpuคำสั่งแสดง (เหนือสิ่งอื่น):

Byte Order:            Little Endian

ระบบนี้เป็นที่รู้จักกันในการทำงาน

  • CentOS 6
  • Ubuntu (12.04, 12.10, 13.04, 13.10, 14.04)
  • Fedora (17,18,19)
  • ArchLinux 2012+
  • Linux Mint Debian (ดังนั้นสมมติว่าใช้การทดสอบ Debian ด้วย)

ระบบนี้เป็นที่รู้จักกันว่าไม่ทำงาน

  • Fedora 14
  • CentOS 5 (สมมติว่า RHEL5 เป็นเพราะสิ่งนี้)

ทำไมความแตกต่างที่เห็นได้ชัดในเรื่อง distros

หลังจากขุดมากฉันพบว่าทำไม ดูเหมือนว่าเวอร์ชัน util-linux เวอร์ชัน 2.19 เป็นรุ่นแรกที่มีคุณสมบัติที่lscpuแสดงผลลัพธ์ที่รายงาน Endianness ของระบบของคุณ

จากการทดสอบฉันรวบรวมทั้งเวอร์ชั่น 2.18 และ 2.19 ในระบบ Fedora 14 ของฉันและผลลัพธ์ด้านล่างแสดงถึงความแตกต่าง:

util-linux 2.18

$ util-linux-ng-2.18/sys-utils/lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
CPU(s):                4
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               1199.000
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

util-linux 2.19

$ util-linux-2.19/sys-utils/lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
CPU socket(s):         1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 37
Stepping:              5
CPU MHz:               2667.000
BogoMIPS:              5320.02
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3

รุ่นดังกล่าวข้างต้นถูกดาวน์โหลดจากเว็บไซต์ kernel.org


ขอบคุณเดวิดฉันคิดถึงสิ่งนั้นเมื่อตอนที่ฉันทำ greping ไฟล์นั้น จะต้องตาบอด 8-)
slm

ฉันเห็นว่าทำไมฉันถึงพลาด ระบบ Fedora 14 ของฉันlscpuไม่แสดงค่านั้น แต่ระบบ Ubuntu 12.10 ของฉันทำ หากคุณไม่รังเกียจฉันอาจตอบคำถามของคุณและแบ่งออกเป็นส่วนสำหรับระบบที่แตกต่างกันและวิธีการที่จะทำในแต่ละ
slm

@slm แน่นอนไปเลย สำหรับการอ้างอิงlscpuทำงานบน Archlinux ด้วย
David Baggerman

เวอร์ชันของ Arch
slm

Arch ไม่มีเวอร์ชัน มันเป็นรุ่นที่วางจำหน่าย ...
jasonwryan

6

วิธีหนึ่งที่ฉันพบในระบบ Debian / Ubuntu คือการเรียกใช้คำสั่งนี้:

$ dpkg-architecture
DEB_BUILD_ARCH=amd64
DEB_BUILD_ARCH_BITS=64
DEB_BUILD_ARCH_CPU=amd64
DEB_BUILD_ARCH_ENDIAN=little
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_GNU_CPU=x86_64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=x86_64-linux-gnu
DEB_BUILD_MULTIARCH=x86_64-linux-gnu
DEB_HOST_ARCH=amd64
DEB_HOST_ARCH_BITS=64
DEB_HOST_ARCH_CPU=amd64
DEB_HOST_ARCH_ENDIAN=little
DEB_HOST_ARCH_OS=linux
DEB_HOST_GNU_CPU=x86_64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=x86_64-linux-gnu
DEB_HOST_MULTIARCH=x86_64-linux-gnu

นี่จะแสดงคำว่าเล็กหรือใหญ่ขึ้นอยู่กับสถาปัตยกรรมที่ระบบของคุณประกอบด้วย:

$ dpkg-architecture | grep -i end
DEB_BUILD_ARCH_ENDIAN=little
DEB_HOST_ARCH_ENDIAN=little

6

การใช้python:

$ python -c "import sys;print sys.byteorder"
little

หรือ:

printf '\1' | od -dAn
1

อยู่ที่ไหน1สำหรับ endian น้อยและ00256สำหรับ endian ใหญ่

หรือใช้perlเวอร์ชันที่สั้นกว่า:

$ perl -V:byteorder
byteorder='12345678';

5

โซลูชัน POSIX Shell & C:

cat << EOF > foo.c

#include <endian.h>
#include <stdio.h>

int main() {
  printf("Byte Order: ");
  if (BYTE_ORDER == LITTLE_ENDIAN) 
    printf("little");
  else {
    if (BYTE_ORDER == BIG_ENDIAN)
      printf("big");
    else
      printf("unknown");
  }
  printf(" endian.\n");
  return 0;
}
EOF

gcc -D__USE_POSIX foo.c
./a.out

1

หากคุณอยู่ในระบบที่ไม่มีendian.h:

#include <stdio.h>

int main() {
  int test = 0;
  char *bytes = (char *) &test;
  *bytes = 0x1;

  printf("Byte Order: ");
  if (test == 1){
    printf("little");
  }
  else {
      printf("big");
  }
  printf(" endian.\n");
  return 0;
}

ไม่มีความรักอะไรกับ VAX ชนชั้นกลาง
thrig

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