Linux: обнаружение 64-битного ядра (длинный режим) из программы 32-битного пользовательского режима - PullRequest
5 голосов
/ 10 мая 2011

Какой самый лучший и самый надежный способ определить, работает ли 32-битная программа в пользовательском режиме на 64-битном ядре или нет (т. Е. Находится ли система в «длинном режиме»)? Я бы предпочел не вызывать внешние программы, если это возможно (или загружать любые модули ядра).

Примечание. Я хочу определить, используется ли 64-разрядное ядро ​​(или действительно ли процессор находится в длинном режиме), а не просто, если присутствует 64-разрядный процессор (/proc/cpuinfo говорит, что не используется ли 64-битная возможность).

Ядро подделывает 32-битный процессор, если uname скомпилирован 32-битный или используется setarch i686.

Ответы [ 3 ]

6 голосов
/ 10 мая 2011

Вызовите функцию uname() и проверьте возвращенную строку machine, которая будет x86_64 для 64-разрядной платформы Intel.

Один из способов обратить вспять эффект использования setarch для сброса личности:

#include <stdio.h>
#include <sys/utsname.h>
#include <sys/personality.h>

int main()
{
    struct utsname u;

    personality(PER_LINUX);

    uname(&u);
    puts(u.machine);
    return 0;
}

Это показывает правильные результаты при компиляции в 32-битном режиме и запуске в 64-битной системе:

$ gcc -m32 -o u u.c
$ ./u
x86_64
$ setarch i686 ./u
x86_64

EDIT: исправлен коддля обратного эффекта setarch.

Ссылка .

1 голос
/ 10 мая 2011

Предполагая, что uname () обманывает, есть еще несколько механизмов. Один из способов - проверить ширину адреса любого из символов ядра.

#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char **argv) {
  char *inputline = malloc(1024);
  char *oinputline = inputline;
  int fd = open("/proc/kallsyms", O_RDONLY);
  int numnibbles = 0;
  if (fd == -1) {
      perror("open");
      free(inputline);
      exit(1);
  }
  read(fd, inputline, 1024);
  close(fd);
  while(!isspace(*inputline)) {
      numnibbles++;
      inputline++;
  }
  printf("%dbit\n", numnibbles*4);
  free(oinputline);
  exit (0);
}
0 голосов
/ 10 мая 2011

Если ядро ​​настроено для него, вы можете прочитать конфигурацию ядра из /proc/config.gz

zcat /proc/config.gz | grep CONFIG_64BIT
# CONFIG_64BIT is not set

Я не уверен, насколько вам это нужно - это не такпохоже на супер общий параметр конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...