Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
第'册的澄清;解释和源代码:#定义位块位(sizeof(BITCHUNK\u t)*字符位)_C_Minix - Fatal编程技术网

第'册的澄清;解释和源代码:#定义位块位(sizeof(BITCHUNK\u t)*字符位)

第'册的澄清;解释和源代码:#定义位块位(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

关于Tanenbaum的操作系统设计和实现,第154页说位图对每个NR_SYS_进程都有一个位(32)

在minix/kernel/table.c的末尾,有一个检查,以确保引导映像中的进程数不大于ipc掩码:

/*验证ipc掩码的第一块是否有足够的位来容纳进程
*在图像中。*/

我研究了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" );