C 为什么系统调用位左移?

C 为什么系统调用位左移?,c,kernel,minix,C,Kernel,Minix,在Tanenbaum中,系统调用位定义为: /* System call numbers that are passed when trapping to the kernel. The * numbers are carefully defined so that it can easily be seen (based on * the bits that are on) which checks should be done in sys_call(). */ #define S

在Tanenbaum中,系统调用位定义为:

/* System call numbers that are passed when trapping to the kernel. The 
 * numbers are carefully defined so that it can easily be seen (based on 
 * the bits that are on) which checks should be done in sys_call().
 */
#define SEND           1    /* 0 0 0 1 : blocking send */
#define RECEIVE        2    /* 0 0 1 0 : blocking receive */
#define SENDREC        3    /* 0 0 1 1 : SEND + RECEIVE */
#define NOTIFY         4    /* 0 1 0 0 : nonblocking notify */
#define ECHO           8    /* 1 0 0 0 : echo a message */
但在系统调用中,位的定义如下:

/* Define system call traps for the various process types. These call masks
 * determine what system call traps a process is allowed to make.
 */
#define TSK_T   (1 << RECEIVE)                   /* clock and system */
#define SRV_T   (~0)                             /* system services */
#define USR_T   ((1 << SENDREC) | (1 << ECHO))   /* user processes */
/*为各种进程类型定义系统调用陷阱。这些叫面具
*确定允许进程进行的系统调用陷阱。
*/

#定义TSK_T(1从
kernel/table.c
显示的代码中形成的值不是系统调用的代码号的值。它们是系统调用的位掩码

位掩码通常用于实现集合。假设我们有三个对象,例如苹果、香蕉和樱桃,我们希望记录某些集合X是否包含苹果、是否包含香蕉以及是否包含樱桃

我们可以通过指定位置0处的位(值1)表示苹果,位置1处的位(值2)表示香蕉,位置2处的位(值4)来实现表示一个樱桃。那么,任何集合X是否包含这些项目都可以用一个数字来表示,该数字是否设置了相应的位。例如,数字5在0和2处设置了位,因此它表示一个集合,其中包含一个苹果和一个樱桃,但不包含一个香蕉


kernel/table.c
中的代码分配位掩码中的位,以便使用代码i的系统调用由位置i处的位表示。因此,使用代码i的系统调用的位掩码中的位值具有值
1从
kernel/table.c
显示的代码中形成的值不是代码num的值用于系统调用的BER。它们是用于系统调用的位掩码

位掩码通常用于实现集合。假设我们有三个对象,例如苹果、香蕉和樱桃,我们希望记录某些集合X是否包含苹果、是否包含香蕉以及是否包含樱桃

我们可以通过指定位置0处的位(值1)表示苹果,位置1处的位(值2)表示香蕉,位置2处的位(值4)来实现表示一个樱桃。那么,任何集合X是否包含这些项目都可以用一个数字来表示,该数字是否设置了相应的位。例如,数字5在0和2处设置了位,因此它表示一个集合,其中包含一个苹果和一个樱桃,但不包含一个香蕉


kernel/table.c
中的代码分配位掩码中的位,以便使用代码i的系统调用由位置i处的位表示。因此,使用代码i的系统调用的位掩码中的位值具有值
1。ip.h名称是位位置,表值是位掩码。ip.h名称是位位置,th表值是位掩码,不是吗?哦!我想我明白了!你看
1@JakeKing:我在位掩码上添加了一些简单操作的示例。等等,难道不能用
value&RECEIVE
(value&ECHO)|(value&SENDREC)来完成位掩码吗
?@JakeKing:value
是什么?如果它只是一个0或1表示开或关,那么,不,
value&RECEIVE
不是你想要的。
value&RECEIVE
不会将位移动到所需的位置。试着编写一些代码来移动位和and并对其进行or(并以十六进制或二进制显示结果)那么它不是
x吗?哦!我想我明白了!你看
1@JakeKing:我添加了一些关于位掩码的简单操作的示例。等等,难道不能用
value&RECEIVE
(value&ECHO)|(value&SENDREC)来完成位掩码吗
?@JakeKing:value
是什么?如果它只是一个0或1表示开或关,那么,不,
value&RECEIVE
不是你想要的。
value&RECEIVE
不会将位移动到所需的位置。试着编写一些代码来移动位和and并对其进行or(并以十六进制或二进制显示结果)。 Call Name Code Number Bit Mask SEND 1 2 RECEIVE 2 4 SENDREC 3 8 NOTIFY 4 16 ECHO 8 256