我正在尝试在我的Kabe湖7600U上创建一个光谱线(cfr。Henry Wong),正在运行CentOS 7。
我的specpoline版本如下(cfr。spec.asm):
specpoline:
;Long dependancy chain
fld1
TIMES 4 f2xm1
fcos
TIMES 4 f2xm1
fcos
TIMES 4 f2xm1
%ifdef ARCH_STORE
mov DWORD [buffer], 241 ;Store in the first line
%endif
add rsp, 8
ret
Run Code Online (Sandbox Code Playgroud)
此版本与黄宏Henry的版本不同,流程被转移到建筑路径中。当原始版本使用固定地址时,我将目标传递到堆栈中。
这样,add rsp, 8将删除原始的寄信人地址并使用人工地址。
在函数的第一部分中,我使用一些旧的FPU指令创建了一个长延迟依赖关系链,然后创建了一个独立的链,试图欺骗CPU返回堆栈预测变量。
使用FLUSH + RELOAD 1将specpoline插入到配置文件上下文中,同一程序集文件还包含:
buffer
一个连续的缓冲区,它跨越256个不同的高速缓存行,每个高速缓存行之间用GAP-1行分隔开来,总共为256*64*GAP字节。
GAP用于防止硬件预取。
随后是图形描述(每个索引紧接另一个)。
timings
256个DWORD数组,每个条目保存访问F + R缓冲区中相应行所需的时间(以核心周期为单位)。
flush
一个小功能,可以触摸F + R缓冲区的每一页(带有存储,请确保COW在我们这一边)并逐出指定的行。
“个人资料”
标准配置文件功能 …
assembly x86-64 cpu-architecture speculative-execution branch-prediction
vTune文档将Memory Order Machine Clear性能事件描述为:
当来自另一个处理器的侦听请求与管道中数据操作的源匹配时,将发生内存排序(MO)机器清除。在这种情况下,在撤消正在进行的装载和存储之前,应清理管道。
但是我不明白为什么会这样。在不同逻辑处理器上的加载和存储之间没有同步顺序。
处理器可以假装在所有当前的机上数据操作都提交后进行监听。
此问题也在此处描述
每当CPU内核检测到“内存排序冲突”时,就会触发内存排序机清除。基本上,这意味着一些当前待处理的指令试图访问我们刚刚发现同时写入了其他CPU内核的内存。由于这些指令仍被标记为待处理,而“此存储器刚刚被写入”事件则表示其他某个内核已成功完成写入,因此,待处理指令以及取决于结果的所有内容都是错误的:当我们开始执行这些指令时在说明中,我们使用的内存内容版本已过时。因此,我们需要把所有工作都扔掉,然后再做完。这很清楚。
但这对我来说没有任何意义,CPU不需要重新执行Load-Queue中的装载,因为没有针对非锁定装载/存储的总订单。
我可以看到一个问题,即允许对负载进行重新排序:
;foo is 0
mov eax, [foo] ;inst 1
mov ebx, [foo] ;inst 2
mov ecx, [foo] ;inst 3
Run Code Online (Sandbox Code Playgroud)
如果执行顺序为1 3 2,则mov [foo], 13至2之间的存储会导致
eax = 0
ebx = 1
ecx = 0
Run Code Online (Sandbox Code Playgroud)
这确实违反了内存排序规则。
但是负载不能随负载重新排序,那么当来自另一个内核的监听请求与任何飞行负载的来源相匹配时,为什么英特尔的CPU会刷新管道?
此行为可以防止什么错误情况?
在我们的应用程序(具有65个项目的解决方案)中,将在运行时分析所有引用的程序集是否存在Ninject模块(也应用了一些过滤)。这些模块稍后会加载到Ninject内核中,并且每个模块都声明该内核的绑定。
我们采用了一种加载程序,该加载程序以“仅反射”模式将引用的程序集加载到单独的程序集中。与Ninject可以从目录中加载程序集的方式的不同之处在于,该目录可以包含带有不应加载的模块的程序集。而且从一开始,并不是所有引用的程序集都已加载。
问题在于,加载程序(贷给Sacha Barber)无法加载带有
System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information
Run Code Online (Sandbox Code Playgroud)
并LoaderExceptions带有一个条目:
Method 'BeforeLoad' in type 'Lekis.AppBase.Core.BLLBaseCore' from assembly 'AppBaseCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.
Run Code Online (Sandbox Code Playgroud)
以下是一些“有趣”的事实:
BeforeLoad是虚拟的,并且是接口方法的实现AppBaseCore是.NET 3.5,并且3个程序集无法加载AppBaseCore是.NET 4和5程序集加载失败当我使用ILSpy和ILDAsm检查程序集时,它们没有任何错误(很明显)。
在这一点上,我真的迷路了,不知道如何解决这个问题。
任何帮助表示赞赏。
谢谢
这一个错误让我疯了.
我在我的一个名为BaseServices的类库中安装了SendGrid NuGet包,它依赖于Newtonsoft.Json v7.0.1,所以它将它安装在我的packages文件夹中并引用它.
在类库中,我有这个绑定重定向:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
在ASP.NET MVC应用程序的web.config中,即使用我的类库的客户端应用程序,我有一个小于v6版本的程序集绑定重定向指向Newtonsoft.Json库的v6,如下所示:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" culture="neutral"
publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)
当我运行我的电子邮件发送BaseServices库中的代码时,我收到此错误:
线程0x1a4c已退出,代码为0(0x0).System.IO.FileLoadException:无法加载文件或程序集Newtonsoft.Json,版本= 7.0.0.0,文化=中性公钥= 30ad4fe6b2a6aeed'或它的一个依赖.定位的程序集的清单定义与程序集引用不匹配.(从HRESULT异常:0x80131040)文件名: 'Newtonsoft.Json,版本= 7.0.0.0,文化=中性公钥= 30ad4fe6b2a6aeed' 在SendGrid.Helpers.Mail.Mail.Get()在BaseServices.EmailService.SendAsync(EmailMessage消息)在MyFolder\BaseServices\EmailService.cs中:第39行
===预绑定状态信息===日志:DisplayName的= Newtonsoft.Json,版本= 7.0.0.0,文化=中性公钥= 30ad4fe6b2a6aeed(完全指定的)LOG:应用平台=文件:/// MyFolder文件/网络/日志:初始PrivatePath = MyFolder\Web\bin调用程序集:SendGrid,Version = 7.0.3.0,Culture = neutral,PublicKeyToken = 4f047e93159395ca.===日志:此绑定在默认加载上下文中启动.日志:使用应用程序配置文件:MyFolder\Web\web.config日志:使用主机配置文件:C:\ Users\computer\Documents\IISExpress\config\aspnet.config日志:使用C:\ Windows\Microsoft中的计算机配置文件.NET \框架\ v4.0.30319\CONFIG\machine.config中.日志:后政策参考:Newtonsoft.Json,版本= 7.0.0.0,文化=中性公钥= 30ad4fe6b2a6aeed LOG:尝试新的URL文件下载:/// C:/用户/计算机/应用程序数据/本地/温度/临时ASP.NET Files/root/ef9cacdf/e639667a/Newtonsoft.Json.DLL.日志:新的URL文件的尝试下载:/// C:/用户/计算机/应用程序数据/本地/温度/ ASP.NET临时文件/根/ ef9cacdf/e639667a/Newtonsoft.Json/Newtonsoft.Json.DLL.日志:尝试下载新的URL文件:///MyFolder/Web/bin/Newtonsoft.Json.DLL.警告:比较程序集名称导致不匹配:主要版本错误:无法完成程序集的设置(hr = 0x80131040).探测终止.
这可能是一个愚蠢的问题,但我无法找到关于教学生活的这两个阶段的明确解释.我最初的想法是他们是同义词但我不确定了.我开始这么想了
这是错的吗?有没有人有2个清除这些术语的定义?
干杯.
Andreas Abel 和 Jan Reineke在他们描述 uiCA 的论文中讨论了移动消除:
4.1.4移动消除。[...] 然而,这种消除动作并不总是成功的。[...]我们开发了微基准,使用这些计数器来分析移动消除何时成功。[...]
以下模型与我们的观察一致。处理器跟踪由多个架构寄存器使用的物理寄存器。我们说每个这样的物理寄存器占用一个消除槽。当相应的寄存器被覆盖后,消除槽被再次释放。* 一个周期内可以消除的移动指令数量既取决于可用消除槽的数量,也取决于前一个周期中成功消除的数量。
我对我不明白的部分进行了强调。
我认为给定的物理寄存器只能由单个体系结构寄存器从重命名到退出使用。我认为文本的含义暗示了其他情况,所以我正在努力理解移动消除槽是如何工作的(此时甚至寄存器重命名实际上是如何工作的)。
我在 NASM 中有以下代码:
;sleep.asm
[SECTION .text]
global _start
_start:
xor eax,eax
mov ebx, 0x00016630 ;address of Sleep
mov ax, 5000 ;pause for 5000ms
push eax
call ebx ;Sleep(ms);
Run Code Online (Sandbox Code Playgroud)
其中0x00016630是Sleep函数的地址(取自kernel32.dll的dumpbin)。
我想制作可执行文件以在 Win 10 中运行。我所做的是:
nasm -f win32 sleep.asm
Run Code Online (Sandbox Code Playgroud)
并得到sleep.obj结果。
所以现在我必须链接它。我选择 link.exe 不幸的是使用以下命令
link sleep.obj /entry:_start /subsystem:windows /nodefaultlib
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation. All rights reserved.
LINK : error LNK2001: unresolved external symbol __start
sleep.exe : fatal error LNK1120: 1 unresolved externals
Run Code Online (Sandbox Code Playgroud)
有人可以帮助如何解决这个问题吗?
由于我的主要操作系统是linux并且在visual studio上有项目,所以我决定使用在线编译器来实现它.我发现这是很多人提出的.所以这是我的代码:
#include <iostream>
using namespace std;
int main(void) {
float a = 1;
float b = 20.2;
float res = 0;
float res1 = 0;
_asm {
FLD a
FCOM b
JA midi
JMP modi
midi:
FST res
JMP OUT
modi:
FST res1
JMP OUT
}
OUT:
cout << "res = " << res << endl;
cout << "res1 = " << res1 << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的目标很简单,如果a是大于b不是把a在res,否则 …
在任何地方它都被解释为将寄存器与段绑定/关联的东西,但我想要理解什么是完全绑定的.
我正在研究Ingenico的EDC终端.以下代码存在于先前的实现中.在调试时,我遇到了这块代码,我面临着难以理解的问题.
short bankPEM = 0;
//bankPEM = 41; //Chip
bankPEM = 17; //Swipe
//bankPEM = 801; //Fallback
switch(bankPEM)
{
case 021: cout<<"021"; break; //Swipe
case 051: cout<<"051"; break; //Chip
case 801: cout<<"801"; break; //Fallback
default: cout<<"Default"; break;
}
Run Code Online (Sandbox Code Playgroud)
bankPEM是一个短变量.我发现下面的执行观察:
41,case 051执行.17,case 021执行.801,case 801执行.我期望代码执行default数字1和2的情况.在这种情况下,任何人都可以显示一些亮点.
我也将代码转换为汇编语言.调试汇编代码后,我将分享我的理解.
提前致谢.
英特尔开发文档第3卷第9节的摘录
在硬件复位后获取并执行的第一条指令位于物理地址FFFFFFF0H.
该地址比处理器的最高物理地址低16个字节.
包含软件初始化代码的EPROM必须位于此地址.
在实地址模式下,地址FFFFFFF0H超出处理器的1 MB可寻址范围.处理器初始化为该起始地址如下.
CS寄存器有两部分:可见段选择器部分和隐藏的基址部分.
在实地址模式中,基址通常是通过将16位段选择器值向左移位4位以产生20位基址来形成的.但是,在硬件复位期间,CS寄存器中的段选择器加载F000H,基址加载FFFF0000H.因此,通过将基址添加到EIP寄存器中的值(即,FFFF0000 + FFF0H = FFFFFFF0H)来形成起始地址.
我的问题是为什么它在这里使用单词字节时,似乎只对位有意义.假设CPU的物理极限是0xFFFFFFFF然后0xFFFFFFF0是16 bits从该限制,而不是字节远.现在如果英特尔闪存必须包含映射到顶部的每个地址的单字节值,那么我想我们可以调用16位,字节?