Уточнение объяснения книги и исходного кода: #define BITCHUNK_BITS (sizeof(bitchunk_t) * CHAR_BIT)

О разработке и реализации операционных систем Таненбаума на стр. 154 говорится, что растровое изображение имеет бит для каждого из NR_SYS_PROCS (32).

А в конце minix/kernel/table.c есть проверка, чтобы количество процессов в загрузочном образе не превышало маску ipc:

/* убедиться, что в первом фрагменте маски 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 — беззнаковый короткий, а CHART_BIT — 8.

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


person Kevin    schedule 27.11.2015    source источник


Ответы (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" );
person Lundin    schedule 27.11.2015
comment
Хм, поскольку массив с 0 элементами также незаконен, интересно, почему они просто не использовали dummy[BITCHUNK_BITS > NR_BOOT_PROCS - 1]. - person too honest for this site; 27.11.2015
comment
@Olaf Возможно, потому что у некоторых компиляторов есть злые нестандартные настройки, например, gcc -std=gnu90, которые разрешают массивы нулевого размера. (Это делается для того, чтобы включить старый трюк взлома структуры. GNU изобрел это в 90-х годах как обходной путь, чтобы сделать взлом структуры безопасным, до того, как в C99 были введены гибкие элементы массива) - person Lundin; 27.11.2015
comment
Хм, я думал, что это справедливо только для массивов в struct (именно для предоставления гибкого элемента массива). Возможно, я проверю, верно ли это и для глобальных массивов (где это не имеет смысла, поскольку такой массив не может быть расширен во время выполнения). Хорошо, я проверил. Это действительно сложная вещь, которая также позволяет использовать массивы, определенные инициализатором. - person too honest for this site; 27.11.2015
comment
Спасибо за современный эквивалент фиктивной функции. Но как конкретный вопрос к миниксу, зачем ему проверять, чтобы убедиться, что бит меньше 16, а не 32? - person Kevin; 27.11.2015