проверить тип процессора во время RUN для программы C на MAC - PullRequest
3 голосов
/ 02 декабря 2009

Как программа C определяет во время RUN (не во время компиляции), работает ли он на процессорах Little-Endian или Big-Endian?

Причина, по которой это должна быть проверка «во время выполнения», а не «время выполнения», заключается в том, что я собираю программу в универсальном двоичном формате MAC OSX, используя мой MAC с процессором Intel-CPU. Ожидается, что эта программа будет работать на процессорах Intel и Power-PC. то есть, используя универсальный двоичный формат для MAC, я хочу создать программу с использованием процессора Intel и запустить ее под процессором PPC.

Логика в моей программе, которая нуждается в проверке ЦП, - это функция изменения порядка байтов от хоста к сети для 64-битных целых чисел. Прямо сейчас у меня есть это слепо поменять местами порядок байтов, который работает нормально на Intel-CPU, но не работает на PPC. Вот функция C:

unsigned long long
hton64b (const unsigned long long h64bits) {
   // Low-order 32 bits in front, followed by high-order 32 bits.
   return (
       (
        (unsigned long long)
        ( htonl((unsigned long) (h64bits & 0xFFFFFFFF)) )
       ) << 32
      )
      |
      (
       htonl((unsigned long) (((h64bits) >> 32) & 0xFFFFFFFF))
      );
}; // hton64b()

Есть ли лучший способ сделать это кроссплатформенным способом?

Спасибо

Ответы [ 4 ]

2 голосов
/ 02 декабря 2009

Не беспокойтесь о проверке; просто используйте hton * везде, где вам нужно независимое от сети значение. При хорошем дизайне это должно быть ограничено только тем модулем, который взаимодействует между вашей программой и чем угодно, что требует независимых от сети целых чисел.

В системах с прямым порядком байтов, которые уже находятся в сетевом порядке, hton *, вероятно, просто макрос, поэтому он бесплатный. В системах с прямым порядком байтов вам все равно придется это делать, поэтому проверка необходимости этого просто замедляет работу.

Если этого недостаточно, вам нужно будет дать более подробное объяснение того, что вы пытаетесь выполнить, и почему вам нужно знать порядок работы системы во время выполнения.

1 голос
/ 02 декабря 2009
  • Там будут макросы препроцессора доступны для тестирования это big / little endian. например,
   #ifdef LITTLE_ENDIAN
   do it little endian way
   #else 
   do it big endian way
   #endif.

Это время компиляции, но источник жира двоичные файлы компилируется отдельно для каждая архитектура, это не проблема.

  • Я не уверен, что Macosx имеет Функция betoh64 () в sys / endian.h - если это так - используйте это, он сделает правильная вещь.
  • Последний подход заключается в простом распаковка отдельных байтов в путь, который не имеет смысла для хозяина Endian - вам нужно только знать порядок байтов в от источник.

    uint64_t unpack64(uint8_t *src)
    {
       uint64_t val;
    
       val  = (uint64_t)src[0] << 56;
       val |= (uint64_t)src[1] << 48;
       val |= (uint64_t)src[2] << 40;
       val |= (uint64_t)src[3] << 32;
       val |= (uint64_t)src[4] << 24;
       val |= (uint64_t)src[5] << 16;
       val |= (uint64_t)src[6] <<  8;
       val |= (uint64_t)src[7]      ;
    
       return val;
    }
    
0 голосов
/ 03 декабря 2009

Вам не нужно проверять порядок байтов во время выполнения. Когда вы компилируете приложение как универсальный двоичный файл, оно компилируется несколько раз с соответствующими определениями и макросами, даже если вы работаете на машине Intel. Во время выполнения загрузчик mach-o выберет лучшую архитектуру для запуска из вашего универсального двоичного файла (т. Е. PPC на PowerPC или i386 на Intel).

Универсальный двоичный файл не означает один двоичный файл для нескольких архитектур. Это означает один толстый двоичный файл, содержащий один двоичный файл для одной архитектуры.

Пожалуйста, обратитесь к http://developer.apple.com/legacy/mac/library/documentation/MacOSX/Conceptual/universal_binary/universal_binary_intro/universal_binary_intro.html для более подробной информации.

0 голосов
/ 02 декабря 2009

Понимаете ли вы, что универсальные двоичные файлы на Mac компилируются несколько раз, по одному для каждой архитектуры? Я полагаю, что когда вы говорите о времени компиляции, вы имеете в виду использование системы configure / make для уведомления источника ... Просто используйте константы gcc (например, LITTLE_ENDIAN)

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