C 为什么系统调用位左移?
在Tanenbaum中,系统调用位定义为: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
/* 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