Có một lệnh hệ thống, trong Linux, báo cáo sự kết thúc?


30

Có ai biết một lệnh báo cáo xem một hệ thống là Big Endian hay Little Endian hay là tùy chọn tốt nhất một kỹ thuật như thế này bằng cách sử dụng Perl hoặc một chuỗi các lệnh?

Perl

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

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

od | ôi

# 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

Tài liệu tham khảo


Có gì sai với odphương pháp? Nó đơn giản và hoạt động ở mọi nơi. Đó là những gì tôi nghĩ trước khi đọc nội dung câu hỏi của bạn.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles - không có gì thực sự, cảm thấy giống như một hack (ít nhất là với tôi). Đúng là nó có vẻ là di động trên các hệ thống khác như Solaris + AIX, nhưng có vẻ như Endianness của hệ thống nên được xác định rõ ràng hơn một chút như 32 bit so với 64 bit, vì vậy tôi hơi ngạc nhiên rằng nó không phải là ' t. lscpuPhương pháp mới hơn là những gì tôi sẽ mong đợi.
slm

Thực tế, endianness dễ xác định hơn kích thước từ, bởi vì bạn sẽ gặp khó khăn trong việc tìm kiếm các nền tảng không phải là endian nhỏ hoặc endian lớn (ít nhất là đối với số nguyên, float là một vấn đề khác) trong khi có rất nhiều hỗn hợp giữa 32 bit và 64 bit (CPU, kernel, userland, một quy trình nhất định).
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles - vâng, quan điểm của tôi về thế giới có lẽ bị giảm nhẹ vì tôi chủ yếu lớn lên với Solaris hoặc Linux. Không quá nhiều như vậy.
slm

các odcách tiếp cận nên làm việc trên hầu hết các hệ thống mở, không chỉ Linux, mà sẽ là trường hợp với việc sử dụng lscpu. Vì vậy, "tốt nhất" phụ thuộc vào hoàn cảnh.
MattBianco

Câu trả lời:


40

lscpu

Các lscpuchương trình lệnh (trong số những thứ khác):

Byte Order:            Little Endian

Hệ thống này được biết là hoạt động trên

  • CentOS 6
  • Ubuntu (12.04, 12.10, 13.04, 13.10, 14.04)
  • Fedora (17,18,19)
  • ArchLinux 2012+
  • Linux Mint Debian (do đó cũng giả sử kiểm tra Debian).

Hệ thống này được biết là không hoạt động trên

  • Fedora 14
  • CentOS 5 (giả sử RHEL5 vì điều này)

Tại sao sự khác biệt rõ ràng giữa các distro?

Sau khi đào nhiều tôi đã tìm ra lý do tại sao. Có vẻ như phiên bản produc-linux phiên bản 2.19 là phiên bản đầu tiên bao gồm tính năng trong đólscpu hiển thị cho bạn kết quả đầu ra báo cáo Endianness của hệ thống.

Khi thử nghiệm, tôi đã biên dịch cả phiên bản 2.18 và 2.19 trên hệ thống Fedora 14 của mình và kết quả đầu ra dưới đây cho thấy sự khác biệt:

sử dụng 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

sử dụng 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

Các phiên bản trên đã được tải xuống từ trang web kernel.org .


Cảm ơn David, tôi đã bỏ lỡ điều đó khi tôi đang đọc tập tin đó. Phải bị mù 8-)
slm

Tôi thấy tại sao tôi bỏ lỡ nó. Hệ thống Fedora 14 của lscputôi không hiển thị giá trị đó, tuy nhiên hệ thống Ubuntu 12.10 của tôi thì có. Nếu bạn không phiền, tôi có thể lấy câu trả lời của bạn và chia nó thành các phần cho các hệ thống khác nhau và cách thực hiện trên mỗi hệ thống.
slm

@slm Chắc chắn, đi tiếp. Để tham khảo, lscpuhoạt động trên Archlinux quá.
David Baggerman

Phiên bản nào của Arch?
slm

Arch không có phiên bản; đó là một bản phát hành ...
jasonwryan

6

Một phương pháp tôi tìm thấy trên các hệ thống Debian / Ubuntu là chạy lệnh này:

$ 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

Điều này sẽ cho bạn thấy các từ nhỏ hay lớn tùy thuộc vào kiến ​​trúc mà hệ thống của bạn bao gồm:

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

6

Sử dụng python:

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

hoặc là:

printf '\1' | od -dAn
1

nơi 1dành cho endian nhỏ và 00256endian lớn.

Hoặc sử dụng perlphiên bản ngắn hơn :

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

5

Giải pháp 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

Nếu bạn đang ở trên một hệ thống không có 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;
}

Điều gì không có tình yêu cho VAX giữa cuối?
thrig

Được phát hiện rõ ràng, tôi đã rất mải mê với các vấn đề Intel-> PowerPC hiện tại của mình, tôi đã không nghĩ ra điều gì quá kinh khủng.
Matthew V Carey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.