澄清书的解释和源代码:#define BITCHUNK_BITS(sizeof(bitchunk_t)* CHAR_BIT)

时间:2015-11-27 12:27:53

标签: c minix

在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?

1 个答案:

答案 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" );