gpt4 book ai didi

c - 为什么系统调用位左移?

转载 作者:太空宇宙 更新时间:2023-11-04 07:54:11 25 4
gpt4 key购买 nike

kernel/ipc.h 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 */

然后在kernel/table.c系统调用位定义为:

/* 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 */

为什么一切都向左移动了一点? 1 << RECEIVE将是 0100 而不是 0010。这是否意味着时钟和系统任务可以通知但不能接收?

最佳答案

您从 kernel/table.c 显示的代码中形成的值不是系统调用代码的值。它们是系统调用的位掩码。

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

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

kernel/table.c中的代码在位掩码中分配位,以便代码为 i 的系统调用由位置 i 处的位表示。因此,代码为i 的系统调用的位掩码中位的值为1 << i。 .

下表显示了调用代码的值及其位掩码的值:

    Call Name    Code Number    Bit Mask    SEND         1              2    RECEIVE      2              4    SENDREC      3              8    NOTIFY       4              16    ECHO         8              256

它们的使用方式是,为了表示包含多个调用的集合,将这些调用的位掩码值相加(或者,等效地,结合按位或运算)。所以包含 SEND 的集合, RECEIVE , 和 SENDREC表示为 2+4+8 = 14。

所以 1 << SENDREC是表示 SENDREC 的位的值在面具里,和1 << ECHO是表示 ECHO 的位的值在面具里。这些值的或,1 << SENDREC | 1 << ECHO , 是一个包含 SENDREC 的位掩码和 ECHO但不包括 SEND或其他代码。

位掩码的一些操作是:

  • 如果i是一个项目的编号,1<<i是集合中表示它的位的值。
  • 添加一项 i一组X , OR 位到集合中,用 X |= 1<<i .
  • 取两个集合的并集XY , 或它们,用 X | Y .
  • 取两个集合的交集XY , 和他们, X & Y .

关于c - 为什么系统调用位左移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51528069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com