我试图弄清楚是否有可能运行一个 Linux VM,其 RAM 仅由单个物理页面支持。
为了模拟这一点,我修改了 KVM 中的嵌套页错误处理程序,以从所有嵌套页表 (NPT) 条目中删除当前位,但与当前处理的页错误对应的条目除外。
在尝试启动 Linux 客户机时,我观察到使用内存操作数的汇编指令,例如
add [rbp+0x820DDA], ebp
Run Code Online (Sandbox Code Playgroud)
导致页面错误循环,直到我恢复包含指令的页面以及操作数中引用的页面的当前位(在本例中[rbp+0x820DDA]
)。
我想知道为什么会这样。CPU不应该按顺序访问内存页,即先读取指令,然后访问内存操作数吗?还是 x86 要求指令页和所有操作数页可以同时访问?
我正在 AMD Zen 1 上进行测试。
假设一个5级流水线架构(IF =指令获取,ID =指令解码,EX =执行,MEM =存储器访问,WB =寄存器写回).有4条指令必须执行.
(这些样本说明不准确,但我相信这一点会被理解)
在第五个时钟周期,这些指令将在管道中,如下所示.
添加a,b,c [IF ID EX MEM WB]
添加a,b,d [IF ID EX MEM]
添加a,b,e [IF ID EX]
添加a,b,f [IF ID]
现在,如果发生硬件中断,这些指令会发生什么.只有在执行流水线中的所有指令后才能处理中断吗?是否会以不同的方式处理软件中断和异常?
在Intel的文档称
该指令可以与
LOCK
前缀一起使用,以允许指令以原子方式执行.
我的问题是
可以CMPXCHG
用内存地址操作吗?从文档看来似乎没有,但任何人都可以确认只能在寄存器中使用实际的VALUE,而不是内存地址吗?
如果CMPXCHG
不是原子级和高级语言级CAS必须通过LOCK CMPXCHG
(带LOCK
前缀)来实现,那么引入这样一条指令的目的是什么?
当中断到达 CPU 时,如果它被确认,则通过在跳转到处理程序之前保存当前地址位置来处理它。否则将被忽略。
我想知道汇编指令调用是否被中断。
例如,
mvi a, 03h ; put 3 value into acc. in 8080 assembly
Run Code Online (Sandbox Code Playgroud)
一行指令可以中断吗?或者如果不是,它是原子的?
是否总能保证“一行汇编指令”总是原子的?
如果8080汇编中没有“lock”关键字呢,那么原子性是如何提供的呢?
例如,如果要操作64位和,但是“一行指令”没有办法做到,并且在对和进行操作时出现中断怎么办?如何在装配级别防止它?
对我来说,这个概念正在开始归结。
assembly interrupt cpu-architecture atomicity interrupted-exception
REP INSB
假设我在普通优先级线程中从用户模式长时间读取 PCI 设备寄存器。在执行期间,以下哪些情况可以发生,哪些情况不能发生:
如果答案取决于它,则假设有一个相当现代的处理器。感兴趣的是 Atom 和 Core i3。
这段代码来自 Pintos 源码:https : //www.cs.usfca.edu/~benson/cs326/pintos/pintos/src/threads/synch.c
void
sema_down (struct semaphore *sema)
{
enum intr_level old_level;
ASSERT (sema != NULL);
ASSERT (!intr_context ());
old_level = intr_disable ();
while (sema->value == 0)
{
list_push_back (&sema->waiters, &thread_current ()->elem);
thread_block ();
}
sema->value--;
intr_set_level (old_level);
}
Run Code Online (Sandbox Code Playgroud)
采取信号量的事实是sema->value--;
。如果它有效,它必须是一个原子操作。我们怎么知道它实际上是原子操作?我知道现代 CPU 保证对齐的内存操作(对于字/双字/四字 - 它取决于)是原子的。但是,在这里,我不相信为什么它是原子的。