Assembly 计算单个IA32指令的内存访问(包括页表)

Assembly 计算单个IA32指令的内存访问(包括页表),assembly,x86,page-tables,Assembly,X86,Page Tables,我想了解执行指令数据传输所需的内存访问次数,如:xor(%eax),%eax 如果我们在一个有一页表的分页系统中,没有tlb缓存,并且没有页面错误。 我认为我们必须首先在页表中,然后在帧中转换eax中的地址,然后执行xor。所以我认为有2个内存访问,但我想确定一下 我还必须计算从指令内存中提取的数据 如果我有两个级别的页面表(页面目录和页面表)和一条类似于 add $10, 16(%eax) 我必须转到eax中偏移量16处的地址,求和10,并将该值存储在同一内存位置?所以我必须做一个访问页

我想了解执行指令数据传输所需的内存访问次数,如:xor(%eax),%eax
如果我们在一个有一页表的分页系统中,没有tlb缓存,并且没有页面错误。
我认为我们必须首先在页表中,然后在帧中转换eax中的地址,然后执行xor。所以我认为有2个内存访问,但我想确定一下

我还必须计算从指令内存中提取的数据

如果我有两个级别的页面表(页面目录和页面表)和一条类似于

add $10, 16(%eax)  
我必须转到eax中偏移量16处的地址,求和10,并将该值存储在同一内存位置?所以我必须做一个访问页面目录,一个访问页面表,一个访问框架来翻译地址

所以如果我有一个指令,比如:
mov4(%eax),(%ebx)


我必须对内存进行6次访问,因为一次访问页面目录,一次访问页面表,一次访问eax和ebx中两个地址的帧?

请注意,
mov 4(%eax),(%ebx)
不是有效的指令。x86使用多级页面表。即使是传统的32位非PAE也是2级的。因此,TLB未命中/缓存未命中内存源操作数至少需要3次加载,包括数据本身。或者在运行32位用户空间的普通64位内核下运行5。您可能只想计算数据访问次数,而不想计算指令获取次数。甚至8086也有一个预取缓冲区,并且指令长度可变,因此,如果没有指令缓存,您很难对“幼稚”的CPU进行建模。单独获取单个字节和未对齐的word/dword立即数/移位数都是不明智的。哦,我想你可能有传统的2级页表,但有4MiB的hugepages,因此页目录条目实际上是一个给出最终物理地址的hugepage条目。或者x86-64可以有2M或1G的hugepages,因此您可以有3或2个级别的表,而不是通常的4级。@loremipsum x86上的分页方式是精确定义的。您似乎想描述一台有点像x86但不完全相同的机器。这似乎把我们都弄糊涂了。也许离开与x86的关联,转而描述一个完全抽象的机器以避免任何错误的假设会更容易一些。@loremipsum似乎其他用户(包括我)不太清楚您的意思。所以请澄清你的问题。