2015-11-27 1 views
1

О разработке и реализации операционных систем Tanenbaum, стр.154 говорит, что битмап имеет бит для каждого из NR_SYS_PROCS (32).Уточнение пояснения и исходного кода книги: #define BITCHUNK_BITS (sizeof (bitchunk_t) * CHAR_BIT)

И в конце Minix/ядра/table.c, есть проверка, чтобы убедиться, что количество процессов в загрузочном образе не больше КУМИ маски:

/* проверить, что первый кусок маски ipc имеет достаточно бит для размещения процессов
* на картинке. */

extern int dummy[(BITCHUNK_BITS > NR_BOOT_PROCS - 1) ? 1 : -1]; 

Я смотрел в размер BITCHUNK_BITS, думая, что это был бы равен 32, но он равен 16, как определено в /minix/kernal/const.h

#define BITCHUNK_BITS (sizeof(bitchunk_t) * CHAR_BIT)

где bitchunk_t не имеет знака short и CHART_BIT - 8.

Почему необходимо удостовериться, что количество процессов в загрузочных образах меньше 16, а не 32, когда можно добавить больше пользователей pro загружается ли загрузочный образ?

ответ

1

Это всего лишь грязный трюк для генерации ошибки времени компиляции, когда некоторые константы имеют неправильные значения.

Если у них есть правильные значения, логическое выражение BITCHUNK_BITS > NR_BOOT_PROCS - 1 будет оценивать 1, и программа попытается объявить фиктивный массив размером 1. Все в порядке, и массив никогда не будет использоваться.

Если у них плохие значения, логическое выражение BITCHUNK_BITS > NR_BOOT_PROCS - 1 будет оценивать значение 0, и программа будет пытаться объявить фиктивный массив с размером -1. Это незаконно в C, поэтому программа никогда не будет компилироваться.

В современном C, вы не используете такие пакости, но вместо этого

_Static_assert(BITCHUNK_BITS > (NR_BOOT_PROCS - 1), "BITCHUNK_BITS too small"); 
+0

Хм, а массив 0-запись также является незаконным, я задаюсь вопросом, почему они не просто использовать 'фиктивный [BITCHUNK_BITS> NR_BOOT_PROCS - 1] '. – Olaf

+0

@Olaf Вероятно, потому что у некоторых компиляторов есть злые нестандартные настройки, например, например, 'gcc -std = gnu90', который позволяет массивы нулевого размера. (Он делает это, чтобы включить старый трюк «struct hack». GNU придумал это в 90-х годах в качестве рабочего процесса, чтобы сделать «хакерство» безопасным, до того, как на C99 были введены гибкие элементы массива). – Lundin

+0

Хм, я думал, что это было справедливо для массивов в 'struct' (чтобы обеспечить член гибкого массива). Может быть, я проверю, верно ли это для глобальных массивов (где нет смысла, так как такой массив не может быть расширен во время выполнения). Хорошо, я проверил. Это действительно вязаная вещь, которая также допускает определенные пользователем массивы. – Olaf

 Смежные вопросы

  • Нет связанных вопросов^_^