- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在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
.X
和 Y
, 或它们,用 X | Y
.X
和 Y
, 和他们, X & Y
.关于c - 为什么系统调用位左移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51528069/
所以我正在阅读“Java:初学者指南”并且有这样的代码: class ShowBits{ int numbits; ShowBits(int n){ numbits =
我一直在调试 C++ 库中的问题,发现文字 0 和变量设置为 0 之间存在奇怪的差异,但仅在库内部。如果我将代码复制到我自己的代码中,它就会按预期工作。 库代码将 1 向下移动一个长整数,以一次屏蔽一
这个问题已经有答案了: Is left and right shifting negative integers defined behavior? (3 个回答) 已关闭 5 年前。 在解决问题时,
我想将 num 与 scale 参数相乘。这里 num 和 scale 是 float 变量。我打算使用左移 >运算符必须是整数类型。 C11:6.5 表达式(p4): Some operators
假设我有一个二进制数。 1010 是十进制的 10。 我理解左移1位本质上是数字乘以2。 教科书中有一句话让我感到困惑。 salq %cl, %rdx %rdx 是一个数字,%salq 是一个左移。我
假设我有一个二进制数。 1010 是十进制的 10。 我理解左移1位本质上是数字乘以2。 教科书中有一句话让我感到困惑。 salq %cl, %rdx %rdx 是一个数字,%salq 是一个左移。我
在这个等式中 #define mod 1000000007 int n; int num = ((1<
我必须编写一个函数来接收 像10001这样的二进制数, 和 一个十进制数,表示我应该轮类多少次。 问题是,如果我使用 C++ 运算符 << ,从后面推零,但不会丢弃第一个数字......例如 shif
标题总结如下:左移 uint64_t 不会输出预期值,我想知道为什么。我得到的是预期结果,其 4 个最高有效字节被清零。我在 Debian Jessie 64 位上使用 x86_64 CPU(Inte
System.out.println((-1<<31)); 为什么输出 -2147483648 我知道 -1<<31 会给出 10000000000000000000000000000000,所以它应
谁能解释为什么下面的代码不能编译? byte b = 255 << 1 错误: Constant value '510' cannot be converted to a 'byte' 我期待以下二进
考虑: int a = 0; a |= 1 << a; System.out.println(a); 它打印“1”。为什么?我认为向左位移 0 任意次数仍然是 0。它从哪里拉出 1?
下面是否未定义,为什么? int i = 0xFF; unsigned int r = i << 24; 最佳答案 除非int,否则该行为在技术上是未定义的类型超过 32 位。 来自 C++11,5.
我的应用由全屏 UIWebView 提供支持。它运行良好,除非调出键盘时 View 移动了大约 10 个像素,留下一个白色间隙(请参见下面的屏幕截图)。 有谁知道造成这种情况的原因以及是否有任何解决方
有人可以解释一下 Golang 中的左移/右移行为吗?请在此处引用示例代码:https://play.golang.org/p/7vjwCbOEkw package main import (
如何让 Emacs 使用 ShiftTab 将所选文本向左移动 4 个空格? 最佳答案 为此,我使用命令indent-rigidly,绑定(bind)到C-x TAB。为其指定参数 -4,将所选区域向
这个问题已经有答案了: Remove First 16 Bytes? (4 个回答) 已关闭 8 年前。 我有一个 3 字节的字节数组:byte[] VG = new Byte[3]; 这是数组的值:
假设我有一个类,我想为其重载一个基于枚举类型的运算符: #include enum class option : char { normal, do_something_stupid }; clas
我正在尝试执行以下操作。但是我不确定我可能哪里出错了 uint64_t x = (1 = width of type [-Wshift-count-overflow] 我得到输出 0。我期待像这样的二
我正在摆弄一个 Flappy Bird 的克隆,我无法弄清楚以下代码的含义 let birdCategory: UInt32 = 1 << 0 let worldCategory: UInt32 =
我是一名优秀的程序员,十分优秀!