Linux'ta endianness bildiren bir sistem komutu var mı?


30

Bir sistemin Büyük Endian mı yoksa Küçük Endian mı olduğunu bildiren bir komuttan mı, yoksa Perl veya komutlardan oluşan bir komut kullanarak en iyi seçenek bu gibi bir teknik midir?

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

Referanslar


odYöntemin nesi var ? Çok basit ve her yerde çalışıyor. Sorunuzun gövdesini okumadan önce düşündüğüm şeydi.
Gilles 'SO- kötülük olmayı bırak'

@Gilles - hiçbir şey gerçekten, bir kesmek gibi hissediyorum (en azından bana). Solaris + AIX gibi diğer sistemlerde taşınabilir göründüğü doğru, ancak sistemin Endianness'i 32 bit ve 64 bit gibi biraz daha açık bir şekilde belirlenmeli gibi görünüyordu, bu yüzden biraz şaşırdım. t. Yeni lscpuyöntem beklediğimden daha fazla.
slm

Endianness pratikte kelime boyutundan daha kolaydır, çünkü küçük-endian veya büyük-endian olmayan (en azından tamsayılar için yüzer başka bir maddedir) olmayan platformlar bulmakta zorlanacaksınız. 32 bit ve 64 bit arasında (CPU, çekirdek, kullanıcı alanı, belirli bir işlem).
Gilles 'SO- kötülük' dur '31

@Gilles - Evet, dünyaya bakış açım büyük olasılıkla Solaris ya da Linux ile büyüdüğüm için muhtemelen bozuluyor. Bunun ötesinde değil.
slm

Bu odyaklaşım, kullanımda olduğu gibi sadece linux için değil, çoğu açık sistemde çalışmalıdır lscpu. Öyleyse "en iyisi" şartlara bağlıdır.
MattBianco

Yanıtlar:


40

lscpu

lscpu(Diğer şeylerin yanı sıra) komutu gösterir:

Byte Order:            Little Endian

Bunun üzerinde çalıştığı bilinen sistemler

  • CentOS 6
  • Ubuntu (12.04, 12.10, 13.04, 13.10, 14.04)
  • Fedora (17,18,19)
  • ArchLinux 2012+
  • Linux Mint Debian (bu nedenle Debian testini de üstlenerek).

Bunun üzerinde çalışmadığı bilinen sistemler

  • Fedora 14
  • CentOS 5 (bundan dolayı RHEL5 varsayarsak)

Neden dağıtımlar arasındaki belirgin farklar?

Çok kazdıktan sonra nedenini öğrendim. Versiyon util-linux sürüm 2.19 gibi görünüyor lscpu, sisteminizin Endianness'ını bildiren çıktıyı gösteren özelliği içeren ilk sürümdü.

Test olarak Fedora 14 sistemimde hem 2.18 hem de 2.19 versiyonlarını derledim ve aşağıdaki çıktı farklılıkları gösteriyor:

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

Yukarıdaki sürümler kernel.org web sitesinden indirilmiştir .


Sağol David, o dosyayı elimde tuttuğumda bunu özledim. Kör olmalı 8-)
slm

Neden özlediğimi anlıyorum. Fedora 14 sistemim lscpubu değeri göstermiyor, ancak Ubuntu 12.10 sistemim gösteriyor. Sakıncası yoksa cevabınızı alıp farklı sistemler için bölümlere ayırabilirim ve her birinde bunu yapmanın yolları olabilir.
slm

@slm Tabii, devam et. Referans olarak, lscpuArchlinux'da da çalışır.
David Baggerman

Arch hangi sürümü?
slm

Arch'ın versiyonları yok; Bu bir haddeleme sürümü ...
jasonwryan 31:13

6

Debian / Ubuntu sistemlerinde bulduğum yöntemlerden biri bu komutu çalıştırmak:

$ 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

Bu, sisteminizin içerdiği mimariye bağlı olarak küçük veya büyük kelimeleri gösterecektir:

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

6

Kullanarak python:

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

veya:

printf '\1' | od -dAn
1

1Küçük endian ve 00256büyük endian için nerede .

Veya daha kısa bir perlsürüm kullanarak :

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

5

Bir POSIX Shell & C çözümü:

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

Sahip olmayan bir sistemdeyseniz 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 orta sınıf öğrencisi için sevgi yok mu?
salı

Anladığım kadarıyla şu anki Intel -> PowerPC sorunlarımda çok çekildim, çok korkunç bir şey düşünmedim.
Matthew V Carey,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.