Как определить разрядность аппаратных средств и ОС?

Я видел несколько оснований, мой фаворит - то, что это должно праздновать 20 лет Linux. Независимо от этого между версиями нет никакого заметного изменения, сам Linus непреклонен по отношению к этому; это не Gnome 3.0 или KDE 4.

4
16.11.2011, 16:12
3 ответа

Аппаратные средства, ядро и программы пространства пользователя могут иметь различные размеры слова ¹.

  • Вы видите, является ли ЦП 64-разрядным, 32-разрядным, или способным к обоим путем проверки flags строка в /proc/cpuinfo. Необходимо знать возможные флаги на семействе архитектуры. Например, на i386/amd64 платформах, lm флаг определяет amd64-способные центральные процессоры (центральные процессоры, которые не имеют того флага, i386-только).

    grep -q '^flags *:.*\blm\b' /proc/cpuinfo    # Assuming a PC
    
  • Вы видите, является ли ядро 32-разрядным или 64-разрядным путем запросов архитектуры с uname -m. Например, i[3456]86 являются 32-разрядными в то время как x86_64 является 64-разрядным. Обратите внимание, что на нескольких архитектуре, 64-разрядное ядро может запустить 32-разрядные программы пространства пользователя, поэтому даже если uname -m показывает 64-разрядное ядро, нет никакой гарантии, что 64-разрядные библиотеки будут доступны.

    [ "$(uname -m)" = "x86_64" ]    # Assuming a PC
    
  • Вы видите то, что доступно в пространстве пользователя путем запросов поддержки LSB с lsb_release команда. Более точно, lsb-release -s печать a :- разделенный список поддерживавших функций LSB. Каждая функция имеет форму module-version-architecture. Например, доступность библиотеки ix86 C обозначается core-2.0-ia32, в то время как core-2.0-amd64 аналог для amd64. Не каждое распределение объявляет все доступные модули LSB, хотя, таким образом, больше может быть доступным, чем обнаруживаемо таким образом.

  • Вы видите то, для чего создаются программы архитектуры в системе с командой как file /bin/ls. Обратите внимание, что возможно иметь смешанную систему; даже если ls 64-разрядная программа, Вашей системе можно было установить библиотеки для запущения 32-разрядных программ, и (реже) наоборот.

  • Можно узнать предпочтительный размер слова для разработки (предполагающий, что компилятор C доступен) путем компиляции программы C с 5 строками, которая печатает sizeof(void*) или sizeof(size_t). Можно получить ту же информацию немного менее надежным способом ² путем выполнения команды getconf LONG_BIT.

    #include <stdio.h>
    int main() {
        printf("%d\n", (int)sizeof(void*));
        return 0;
    }
    

Что касается виртуальных машин, можете ли Вы выполнить 64-разрядный VM в 32-разрядной системе или наоборот зависите от Вашей технологии виртуальной машины. Посмотрите в особенности, Как я могу установить виртуальную машину Linux на 64 бита на Linux на 32 бита?

¹ “размер Word” обычное название того, что Вы называете разрядностью.
² Это может быть ненадежно, если кто-то установил альтернативный компилятор C с другой целевой архитектурой, но сохранил системное значение по умолчанию getconf.

5
27.01.2020, 20:53
  • 1
    Привет Gilles, "файл which init "может быть взлом, который стоит добавить к списку. (Вне темы: Вы когда-либо писали какие-либо книги по Unix? Я купил бы один)) –  ジョージ 20.03.2015, 17:47
  • 2
    В то время как мы при обнаружении реального размера целого типа в C: возрасты старый прием присваивает константу "1" переменной, затем рассчитывая, сколько раз Вы можете оставленный сдвиг, это перед чем-либо неблагоприятным происходит. –  rackandboneman 24.03.2018, 23:36

Взгляните на man uname.

Можно скомпилировать и запустить 32-разрядные программы на 64-разрядной машине (хотя это требует специальной установки), но не может выполнить 64-разрядные двоичные файлы в 32-разрядной системе. То же относится ко многим Виртуальным машинам, но не all*. Таким образом, если у Вас есть ядро на 64 бита, нет никакого способа, которым Ваши аппаратные средства составляют 32 бита только.

Если Вы хотите протестировать, для какой разрядности программа в двоичном представлении сделана, выполнение file /path/to/the/program.

* Это зависит на уровне, на который воздействует данная Виртуальная машина: Те, которые выполняют двоичный код (почти) непосредственно на хосте ЦП, не смогут выполнить 64-битный код на 32-разрядном хосте. Те, которые эмулируют определенный ЦП, могут сделать это, но они менее эффективны из-за уровня эмуляции.

0
27.01.2020, 20:53
  • 1
    , можно скомпилировать двоичные файлы на 64 бита в системах на 32 бита, просто не выполнить их. И VM на 32 бита мог эмулировать ЦП на 64 бита. положительная сторона –  Mat 16.11.2011, 15:30
  • 2
    у компиляции - мое плохое. Вторая часть зависит от программного обеспечения VM, IIRC. –  rozcietrzewiacz 16.11.2011, 15:38
  • 3
    , Некоторые пакеты VM могут выполнить 64-разрядные гостевые Ose (и 64-разрядное программное обеспечение в них) исходно на 64-разрядном ЦП, даже если хост ОС составляет 32 бита. –  David Schwartz 16.11.2011, 22:30
  • 4
    @DavidS также... Однако, никакой путь, который мог быть сделан на 32-разрядном ЦП. –  rozcietrzewiacz 16.11.2011, 22:48

Вы задаваетесь вопросом о uname Несколько вхождений X86_64:

x86_64 x86_64 x86_64

Это те три значения ( omit -p и -i, если неизвестно » )

    -m, --machine 
          print the machine hardware name
    -p, --processor
          print the processor type or "unknown"
    -i, --hardware-platform
          print the hardware platform or "unknown"

Обратите внимание, что -P и --i не являются частью стандарта POSIX . Значения Неизвестно на Debian, поэтому uname будет печатать x86_64 только один раз. Red Hat / Centos определяет значение.

Также прочитал: Как unux unime -m Получить свою информацию? и Почему uname -p и uname -m и arch вывод разные архитектуры? Отказ

1
27.01.2020, 20:53

Теги

Похожие вопросы