相关疑难解决方法(0)

x86 指令是否需要它们自己的编码以及它们的所有参数同时存在于内存中?

我试图弄清楚是否有可能运行一个 Linux VM,其 RAM 仅由单个物理页面支持。

为了模拟这一点,我修改了 KVM 中的嵌套页错误处理程序,以从所有嵌套页表 (NPT) 条目中删除当前位,但与当前处理的页错误对应的条目除外。

在尝试启动 Linux 客户机时,我观察到使用内存操作数的汇编指令,例如

add [rbp+0x820DDA], ebp
Run Code Online (Sandbox Code Playgroud)

导致页面错误循环,直到我恢复包含指令的页面以及操作数中引用的页面的当前位(在本例中[rbp+0x820DDA])。

我想知道为什么会这样。CPU不应该按顺序访问内存页,即先读取指令,然后访问内存操作数吗?还是 x86 要求指令页和所有操作数页可以同时访问?

我正在 AMD Zen 1 上进行测试。

virtualization paging x86 assembly kvm

68
推荐指数
1
解决办法
1467
查看次数

为什么在x86上对自然对齐的变量进行整数赋值?

我一直在读这篇关于原子操作的文章,它提到了32位整数赋值在x86上是原子的,只要该变量是自然对齐的.

为什么自然对齐确保原子性?

c c++ concurrency x86 atomic

28
推荐指数
2
解决办法
5386
查看次数

当发生中断时,管道中的指令会发生什么?

假设一个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]

现在,如果发生硬件中断,这些指令会发生什么.只有在执行流水线中的所有指令后才能处理中断吗?是否会以不同的方式处理软件中断和异常?

computer-architecture

22
推荐指数
1
解决办法
1万
查看次数

是x86 CMPXCHG原子,如果是这样,为什么需要LOCK?

Intel的文档

该指令可以与LOCK前缀一起使用,以允许指令以原子方式执行.

我的问题是

  1. 可以CMPXCHG用内存地址操作吗?从文档看来似乎没有,但任何人都可以确认只能在寄存器中使用实际的VALUE,而不是内存地址吗?

  2. 如果CMPXCHG不是原子级和高级语言级CAS必须通过LOCK CMPXCHG(带LOCK前缀)来实现,那么引入这样一条指令的目的是什么?

concurrency x86 compare-and-swap

10
推荐指数
2
解决办法
8761
查看次数

正在运行时中断汇编指令

当中断到达 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

4
推荐指数
2
解决办法
1081
查看次数

REP INSB 可以中断吗?

REP INSB假设我在普通优先级线程中从用户模式长时间读取 PCI 设备寄存器。在执行期间,以下哪些情况可以发生,哪些情况不能发生:

  1. 中断(其他内核)
  2. 中断(同一核心)
  3. PCI 访问(其他内核)
  4. PCI 访问(相同核心 - 中断和/或不同线程)
  5. 同一核心上的上下文切换

如果答案取决于它,则假设有一个相当现代的处理器。感兴趣的是 Atom 和 Core i3。

x86 assembly interrupt ioports

4
推荐指数
1
解决办法
194
查看次数

获取信号量必须是原子的。Pintos 的 sema_down 安全吗?

这段代码来自 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 保证对齐的内存操作(对于字/双字/四字 - 它取决于)是原子的。但是,在这里,我不相信为什么它是原子的。

x86 multithreading interrupt atomicity pintos

2
推荐指数
1
解决办法
950
查看次数