在Tanenbaum的操作系统设计和实现中,第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?
答案 0 :(得分: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" );