第'册的澄清;解释和源代码:#定义位块位(sizeof(BITCHUNK\u t)*字符位)
关于Tanenbaum的操作系统设计和实现,第154页说位图对每个NR_SYS_进程都有一个位(32) 在minix/kernel/table.c的末尾,有一个检查,以确保引导映像中的进程数不大于ipc掩码: /*验证ipc掩码的第一块是否有足够的位来容纳进程第'册的澄清;解释和源代码:#定义位块位(sizeof(BITCHUNK\u t)*字符位),c,minix,C,Minix,关于Tanenbaum的操作系统设计和实现,第154页说位图对每个NR_SYS_进程都有一个位(32) 在minix/kernel/table.c的末尾,有一个检查,以确保引导映像中的进程数不大于ipc掩码: /*验证ipc掩码的第一块是否有足够的位来容纳进程 *在图像中。*/ 我研究了BITCHUNK_BITS的大小,认为它等于32,但它等于16,如/minix/kernal/const.h中所定义 #定义BITCHUNK_位(sizeof(BITCHUNK_t)*CHAR_位) 其中,bit
*在图像中。*/ 我研究了BITCHUNK_BITS的大小,认为它等于32,但它等于16,如/minix/kernal/const.h中所定义
#定义BITCHUNK_位(sizeof(BITCHUNK_t)*CHAR_位)
其中,bitchunk\u t为无符号短,CHART\u位为8
当可以向启动映像添加更多用户进程时,为什么要确保启动映像中的进程数少于16而不是32?当某些常量的值错误时,生成编译时错误只是一个肮脏的把戏 如果它们具有OK值,布尔表达式
BITCHUNK\u BITS>NR\u BOOT\u PROCS-1
将计算为1,程序将尝试声明大小为1的伪数组。一切正常,阵列永远不会被使用
如果它们的值不正确,布尔表达式BITCHUNK\u BITS>NR\u BOOT\u PROCS-1
将计算为0,并且程序将尝试声明一个大小为-1的伪数组。这在C语言中是非法的,所以程序永远不会编译
在现代C语言中,您不会使用这些肮脏的技巧,而是
_Static_assert( BITCHUNK_BITS > (NR_BOOT_PROCS - 1), "BITCHUNK_BITS too small" );
嗯,由于0条目数组也是非法的,我想知道为什么他们不只是使用
dummy[BITCHUNK\u BITS>NR\u BOOT\u PROCS-1]
@Olaf,可能是因为一些编译器有邪恶的非标准设置,比如允许零大小数组的gcc-std=gnu90
。(这样做是为了启用旧的“struct hack”技巧。在C99引入灵活数组成员之前,GNU在90年代发明了它,作为一种解决“struct hack”安全的方法)嗯,我认为这只适用于struct
中的数组(正好是为了提供flex数组成员)。也许我会检查全局数组是否也是这样(因为这样的数组不能在运行时扩展,所以没有意义)。好的,我查过了。这真是一件奇怪的事情,它还允许初始化器定义数组。感谢虚拟函数的现代等价物。但作为minix的一个具体问题,它为什么要检查以确保少于16位而不是32位?
_Static_assert( BITCHUNK_BITS > (NR_BOOT_PROCS - 1), "BITCHUNK_BITS too small" );