项目的处理器架构与参考的处理器架构不匹配
我已经在项目背景周围徘徊了一段时间,我被告知我不必担心.但是,现在我还有其他问题现在可能是询问它的最佳时间. (最好的时间可能是我第一次发生的时候,但是现在为时已晚.) 正在构建的" MSIL"项目的处理器体系结构与参考的处理器体系结构之间存在不匹配," C:\ Users \ users \ benjamin \ documents \ visual Studio \ Visual Studio 2010 \ project \ dcim \ dcim \ dcim \ dcim \ bin \ bin \ bin \ debug \ debug \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ dcim.exe"," x86".此不匹配可能会导致运行时故障.请考虑通过配置管理器更改项目的目标处理器体系结构,以使您的项目和参考之间的处理器体系结构保持一致,或使用与项目的目标处理器体系结构相匹配的处理器体系结
0 2023-11-27
编程技术问答社区
同时对多个地址进行监控/等待指令?
我在监视单个地址时已经验证了显示器/MWAIT指令的使用情况.但是我想知道它是否可以同时监视多个地址.可以同时监视多少个地址? 例如,我尝试使用以下代码监视变量A和变量B,并且我发现当A或B更改时,处理器可以醒来.是否有有关如何使用Monitor/Mwait监视多个地址的任何官方指示. monitor(&a, 0, 0); monitor(&b, 0, 0); mwait(0, 0); 解决方案 一次只能监视一个地址.执行监视器指令替换了先前监视的地址. 不过,它不会监视一个字节地址;这是一个范围.可以使用CPUID发现范围的大小. 通常是64个字节(单个缓存线).这就解释了为什么您观察到它在A和B. 上触发的原因
0 2023-11-26
编程技术问答社区
C易失性变量和缓存内存
缓存由缓存硬件透明地控制到处理器,因此,如果我们在C程序中使用挥发性变量,如何保证我的程序每次从指定的实际存储地址中读取数据,而不是缓存. 我的理解是, 挥发性关键字告诉编译器,不应优化变量引用,应在代码中按编程读取. 缓存由缓存硬件透明地控制,因此,当处理器发出地址时,它不知道数据是来自缓存还是内存. 因此,如果我需要每次需要读取内存地址,那么我如何确保它不是从缓存而是从所需地址引用的? 一些方法,这两个概念并不能很好地融合在一起.请澄清一下它的完成方式. (想象我们在缓存中有写下策略(如果需要分析问题)) 谢谢, 微核:) 解决方案 固件开发人员在这里.这是嵌入式编程中的标准问题,并且会遇到许多(甚至非常有经验)的开发人员. 我的假设是您正在尝试访问硬件寄存器,并且该寄存器值可以随时间变化(无论是中断状态,计时器,GPIO指示等). volatile关键字只是解决方案的一部分,在许多情况下,可能不需要.这会导致每次使用时从
0 2023-11-25
编程技术问答社区
Interlocked.CompareExchange也应该是一个挥发性的变量吗?
The following example comes from the msdn . public class ThreadSafe { // Field totalValue contains a running total that can be updated // by multiple threads. It must be protected from unsynchronized // access. private float totalValue = 0.0F; // The Total property returns the running total. public float Total { get { return totalValue; }} // AddToTotal safely adds a value to the running total. public float A
2 2023-11-25
编程技术问答社区
我必须做什么来修复我的项目的 "处理器架构之间的不匹配"?
我已经构建了一个我想提交给Windows商店的Winforms .NET Core应用程序. 与这个目标一致,我能够从答案在这里. 现在,我想将我的应用程序带到应用商店.之后的步骤在这里告诉我,如果我"通过使用Visual Studio创建软件包",我应该将包装项目设置为启动项目,然后按F5启动您的应用程序." 所以我做到了,但是得到了这个错误的消息: 错误MSB3270处理器体系结构之间存在不匹配 正在构建" MSIL"的项目和处理器架构 参考资料 " c:\ users \ bclay \ source \ repos \ f4f_core \ f4f_core \ bin \ bin \ repares \ netcoreapp3.1 \ f4f_core.dll", " x86".此不匹配可能会导致运行时故障.请考虑 通过更改项目的目标处理器体系结构 配置管理器以使处理器体系结构对齐 在您的项目和参考之间,或依赖 与目标匹配的处理器体系结构的参考 您项目的
我应该把我的项目的目标处理器架构改成什么?
我创建了一个.NET Core Winforms应用程序(使用C#),我想提交给Windows App Store.按照说在这里,我在我的解决方案中添加了一个Windows应用程序包装项目: 我尝试创建软件包,但由于此ERR MSG失败: 严重性代码描述项目文件行抑制状态 错误的处理器体系结构之间存在不匹配 项目正在构建" MSIL"和处理器架构 参考 " c:\ users \ bclay \ source \ repos \ f4f_core \ f4f_core \ bin \ bin \ x86 \ repares \ netcoreapp3.1 \ win-x86 \ f4f_core.dll", " x86".此不匹配可能会导致运行时故障.请考虑 通过更改项目的目标处理器体系结构 配置管理器以使处理器体系结构对齐 在您的项目和参考之间,或依赖 与目标匹配的处理器体系结构的参考 您项目的处理器架构. wapprojtemplate1 c:\ program 文件(x
0 2023-11-24
编程技术问答社区
如何使用cmake从visual studio构建为ia32解决方案
我使用cmake具有以下配置的模块项目: cmake_minimum_required(VERSION 3.13) project(app) set(CMAKE_CXX_STANDARD 11) add_library(app MODULE src/library.cpp src/library.h) 一旦使用cmake .. -G "Visual Studio 15 2017 Win64" -DCMAKE_BUILD_TYPE=Release生成的解决方案,我就可以找到app.sln解决方案. 我用Visual Studio 2019打开它,然后单击按钮Local Windows Debugger.我还可以看到一个下拉菜单,其中包含值x64和一个项目Configuration Manager. 为什么默认情况下没有ia32或x86选项?我只是无法创建新的配置,因为该配置完全非用户友好. 有人有想法编译目标32 bits程序的库吗? 编辑 我现
2 2023-11-20
编程技术问答社区
Visual Studio中的 "首选32位 "设置的目的是什么,它实际上是如何工作的?
我尚不清楚编译器在需要时如何自动知道64位的编译.它怎么知道何时可以确保目标32位? 我主要对编译器在编译时如何知道要定位的架构感到好奇.它会根据发现的内容分析代码并做出决定吗? 解决方案 Microsoft有一个博客条目 anycpu的真正含义.net 4.5和Visual Studio 11 : 在.NET 4.5和Visual Studio 11中,奶酪已经移动.这 大多数.NET项目的默认值再次是Anycpu,但不仅仅是 现在对AnyCPU的含义之一.还有一个额外的子类型, "任何CPU 32位首选",这是新的默认值(总的来说,那里 现在是/平台C#编译器开关的五个选项:x86, iTanium,x64,anycpu和anycpu32bitPreferred).当使用"优先32位"时 Anycpu的风味,语义如下: 如果该过程在32位Windows系统上运行,则它以32位进程运行. IL被编译为X86机器代码. 如果该过程在64位Windows系统上运
2 2023-11-20
编程技术问答社区
MSVC 2017是否支持自动CPU调度?
我在使用SSE2体系结构并检测AVX支持运行时的几个网站上阅读了MSVC实际上可以发出的AVX说明.是真的吗? 我测试了各种循环,这些循环肯定会从AVX/AVX2支持中受益,但是当在调试器中运行时,我真的找不到任何AVX说明. 当使用/拱门:AVX时,它会发出AVX指令,但是它当然会在不支持它的CPU上崩溃(测试),因此也没有运行时检测.我可以使用AVX内在信息,它将成功地从中创建AVX指令.有什么想法吗? 解决方案 我已经联系了VC ++团队,答案是"否".在问题下的注释中链接的错误报告仅显示普通错误,而不是自动示意图代码生成器中的错误. 因此,如果指定了/拱门:SSE2(默认情况下),VC ++只能自动dispatch至SSE4.这是当前支持的唯一自动划分的形式.换句话说,VC ++不能自动dispatch至avx/avx2.
虚拟化页表如何工作
阅读有关虚拟化页表概念的读物,其中一部分页面表放在虚拟内存中. wikipedia 您不将整个页面表放入虚拟内存中的原因是它可以导致圆形页面故障.但是在我看来,有一个更基本的问题 - 您首先如何找到页面表?看来您一定需要某些记录物理内存中的位置来开始翻译过程. . 更多地澄清了我的问题,我的困惑不是"为什么所有页面表都在内存中".相反,给出的 基本原理是"防止圆形页面故障".理由似乎应该更根本地说,"处理器必须具有一些物理地址作为起点",而无论您称之为什么,这都是物理页面表.这与"圆形页面故障"有什么关系?似乎更为基础. 解决方案 re:您的更新:这是说明相同要求的两种不同的方式. 是A 降低advuctio ad assurdum 参数:考虑一个CPU,页面表指针都是虚拟地址:TLB失误或页面错误处理程序需要处理另一个页面故障或TLB MISS因为它没有物理地址可以直接使用. 这是您遇到的"循环"问题,为什么必须在某处有一个物理地址,否则它是catch-22
0 2023-11-20
编程技术问答社区
走页是否利用了共享表的优势?
假设两个地址空间共享一个大量的非连续内存. 系统可能希望在它们之间共享物理页面表. 这些表不会使用 global 位(即使受到支持),如果支持的话,它们都会将它们绑在 asid 的情况下. 有直接的好处,因为数据缓存的污染要比副本少,固定的RAM等 . 页面步行是否在任何已知的体系结构中显式优势? 如果是这样,这是否暗示 mmu 是基于物理标签明确缓存和共享内部页面节点? 抱歉多个问题;确实是一个分解的.我正在尝试确定是否值得为此设计测量测试. 解决方案 在现代X86 CPU上(如Sandybridge-family),Page在缓存层次结构(l1d/l2/l3)中走动,所以是的,是的,对于不同的页面目录指向同一子树有明显的好处对于虚拟地址空间的共享区域.或对于某些AMD,通过L2获取,跳过L1D. l2 tlb Miss Miss后会发生什么?有更多详细信息关于第page-walk肯定通过缓存获取的事实,例如存在Broadwell Perf计数器以测量
0 2023-11-20
编程技术问答社区
为什么64位cpu不存在高内存?
当我试图了解32位CPU和Linux的高内存问题时,为什么没有尤其是,虚拟内存分为内核空间和用户空间的划分是如何变化的,以使高内存的要求不存在64位CPU? 谢谢. 解决方案 32位系统只能解决4GB的内存.在Linux中,这将分为3GB的用户空间和1GB的内核空间.该1GB有时还不够,因此内核可能需要绘制和拆除记忆区域,从而造成相当重大的性能罚款.内核空间是"高" 1GB,因此名称为"高内存问题". 64位系统可以解决巨大内存数量-16 EB-因此,此问题不会发生. 其他解决方案 使用32位地址,您只能地址2^32字节(4GB).因此,如果您有更多的内容,则需要以某种特殊的方式解决它.使用64位地址,您无需特殊努力就可以地址2^64字节,并且该数字比地球上存在的所有内存大. 其他解决方案 该位数是指处理器的单词大小.除其他外,单词大小是计算机上的内存地址的大小.内存地址的大小会影响可以唯一引用多少个字节.因此,进行一些简单的数学,我们发现在32位系统
0 2023-11-20
编程技术问答社区
为什么页故障通常由操作系统处理,而不是硬件?
我发现在TLB缺少过程中,某些体系结构使用硬件在某些操作系统时处理它.但是,当涉及到页面故障时,其中大多数使用操作系统而不是硬件. 我试图找到答案,但没有找到任何文章解释原因. 有人可以帮忙吗? 谢谢. 解决方案 如果硬件可以自己处理,则不需要错误. 重点是,该操作系统尚未将页面连接到硬件页面表中,例如因为它实际上根本不在内存中,或者因为操作系统需要捕获尝试编写的尝试,以便操作系统可以实现复印件. 页面故障分为三类: 有效(从逻辑上讲,该过程的内存映射,但是操作系统懒惰或玩具): Hard:需要从磁盘中分配该页面,无论是交换空间还是磁盘文件(例如,内存映射的文件,例如可执行文件或共享库的页面). 通常,OS在等待I/O. 时会安排另一个任务 软:无需磁盘访问,例如分配 +零一个新的物理页面以备份用户空间刚刚尝试编写的虚拟页面.或多个进程已映射的可写页的复印件,但另一个变化不应可见一个(例如mmap(map_private)).这将共享页面变成一个
0 2023-11-20
编程技术问答社区
如何计算集合关联型缓存和TLB中的标签、索引和偏移量的缓存位宽
以下是一个问题: 我们的内存系统具有64位和物理 48位的地址. L1 TLB与64个条目完全关联. 虚拟内存中的页面大小为16KB. L1缓存为32KB和2路 SET关联,L2 CACHE为2MB和4向套件关联.堵塞 L1和L2缓存的大小为64B. L1缓存实际上正在使用 索引物理标记(vipt)方案. 我们必须计算标签,指数和偏移.这是我到目前为止已经制定的解决方案: page offset = log base 2(页面大小)= 14bits 块偏移= log base 2(块大小)= 6位 虚拟页码=虚拟地址 - pageoffset = 64-14 = 50位 L1缓存索引=页面偏移-Block Offset = 8位 l1 tag =物理地址l1索引块偏移= 50位 tlb index = log base 2(64/64)= 0位{因为它是完全关联的,并且可以将整个缓存视为一组.} tlbtag =虚拟页码 - 索引= 50位 l2缓存索引=
0 2023-11-20
编程技术问答社区
实际上解决了缓存问题
缓存大小和页面大小之间的关系 关联性和页面大小如何限制虚拟解决的高速缓存体系结构中的缓存大小? 特别是我正在寻找以下语句的示例: 如果c≤(page_size x关联),缓存索引位仅出现 从页面偏移量(在虚拟地址和物理地址中相同). 解决方案 Intel CPU已使用了多年的8道关联32KIB L1D,其恰恰是为了这个原因.页面为4K,因此页面偏移量为12位,与构成索引和偏移量的位相同. 请参阅" L1还使用较大的速度技巧"有关如何让缓存避免混音问题(例如pipt缓存)的更多详细信息,但仍然像vipt缓存一样快. 这个想法是页面偏移下方的虚拟地址位已经是物理地址位.因此,以这种方式工作的VIPT缓存更像是一个PIPT缓存,并免费翻译索引位.
2 2023-11-20
编程技术问答社区
操作系统是如何防止程序访问内存的?
我目前的理解是 我可以在C 中编写一个操作系统 我可以在C 中为该操作系统编写程序 当我编写操作系统时,我可以看到所有内存 当我编写程序时,操作系统将隐藏我的其他程序中的内存. 每当一个程序在操作系统内部运行时,就会在程序中看起来像是分配的内存,就是计算机具有 的所有内存 CPU/OS如何实现这一目标?这纯粹是在软件级别上实现的吗?还是还需要硬件实现? 解决方案 它不仅纯粹是在软件级别上.对于几个句子中的英特尔体系结构: 隔离每个过程的地址空间;每个过程都有相同的虚拟地址空间(让我们简化:0x00000000至0xffffffff),它映射到不同的物理位置. 地址空间表示内存页面的收集.仅在需要时对页面进行物理映射.从物理记忆中删除了很长一段时间(有特殊算法)的页面;如果它们包含动态修改的东西,则将它们存储在硬盘驱动器上的"交换"文件中. 每个页面都属于特定过程(某些系统页面除外),已分配虚拟地址和访问标志:读/写/
2 2023-11-20
编程技术问答社区
x86页表是如何工作的?
我熟悉具有软件管理的TLB的MIPS架构.因此,您(操作系统)想要存储页面表和页面表条目完全取决于您.例如,我使用一个倒置的页面表进行了一个项目;我看到其他人使用2级页面表. 但是x86的故事是什么?据我所知,TLB是由硬件管理的. X86是否基本上告诉您:"嘿,这是您当前使用的页面表条目[物理地址范围]?"但是,等等,我一直认为X86使用多级页面表,那么它会告诉您将第一级或其他内容放在哪里...?我很困惑. 感谢您的任何帮助. 解决方案 进入受保护模式时,CR3寄存器指向"页面目录"(您可以在输入保护模式之前将其放置在任何地方),这是内存的页面(请记住,"小"页面是4 KIB,一个"大"页面是4 MIB),带有1024页目录条目(PDES),指向"页面表".每个条目都是指针的前10位(页面表的地址),以及构成指针底部的一堆标志(现在,许可,肮脏等). (1024仅来自一个页面为4096字节,指针为4个字节.) 每个"页面表"本身为1024"页表条目"(p
0 2023-11-20
编程技术问答社区
PIPT L1缓存也是VIPT的最小关联性,访问一个集合而不需要将索引转换为物理的。
这个问题是在本科计算机体系结构课程中的虚拟内存部分的背景下出现的.教学助理和教授都无法充分回答它,在线资源都受到限制. 问题: 假设具有以下规格的处理器: 8KB页面 32位虚拟地址 28位物理地址 一个两级页面表,第一级带有1KB页面,以及8KB页面表 第二级 4个字节页表条目 16进入8向套件的关联TLB 除了物理框架(页面)编号外,页表条目还包括一个有效的位,一个 可读的位,可写的位,可执行的位和一个仅内核的位. 现在假设该处理器具有32KB L1缓存,其标签是根据物理地址计算的.在计算与虚拟地址相对应的物理地址之前,缓存必须允许访问适当的缓存的最小关联性是什么? ? 直觉: 我的直觉是,如果缓存中的索引数量和虚拟页面的数量(又称页面表条目)彼此均匀分开,那么我们可以从高速页中直接从CACHE中收集包含的字节,而无需从Cache中获取字节曾经计算该物理页面,从而提供了较小的加速.但是,我不确定这是否是正确的直觉,绝对不知道该如何遵循
0 2023-11-20
编程技术问答社区
为什么Linux(x86)的页面大小是4KB,这是如何计算的?
x86体系结构上Linux内核的默认存储页面大小为4 kb,我想知道如何计算,为什么? 解决方案 默认页面大小由CPU的MMU(内存管理单元)固定.在32位保护模式中x86支持两种页面: 普通的,4 kib 巨大的,4个MIB 并非所有X86处理器都支持大页面.一个人需要具有具有页面尺寸扩展名(PSE)功能的CPU.这不包括前处理器.几乎所有电流生成X86 CPU都会实现它. 4 KIB在其他体系结构中也广泛地是Popuplar页面粒度.有人可能会争辩说,这种大小来自在页面目录/表中的两个10位索引分为两个10位索引,其余12位给出了4 kib页面大小. 其他解决方案 简介 支持分页虚拟内存技术的第一个英特尔处理器是 Intel 80386 .处理器支持单页大小为4 kb.自1985年发布以来,我们必须回到那段时间以了解为什么英特尔选择了特定的页面大小. atlas 是一台支持页面大小的计算机它对虚拟记忆和相关研究的设计产生了深远的影响.该
0 2023-11-20
编程技术问答社区
虚拟索引的物理标签缓存 同义词
我无法完全掌握VIPT缓存中同义词或混叠的概念. 将地址拆分视为: - 在这里,假设我们有2页,其中有不同的VA映射到相同的物理地址(或帧号). VA 的 Pageno部分(位于13-39)的部分被翻译成Pa 的 pfn(位12-35),并且PFN保持不变. VA被映射到同一物理框架时. 现在 pageoffset 两种VA的部分(位0-13)与他们想从特定框架访问的数据相同. pageOffset的部分是VA相同的,位(5-13)也将是相同的,因此索引或设置no是相同的,因此在那里应该是没有混叠,因为只有单个或索引否映射到物理框架号. 按照图中所示的位12,负责混叠?我无法理解. 如果有人可以在地址的帮助下举一个例子. 注意:此图的次要错误不会影响问题:36-12 = 36位物理地址的24位标签,而不是28.mips64r4x00 cpus实际上确实具有40位虚拟,36根据手册. 此图来自 http://www.cse.unsw.e
0 2023-11-20
编程技术问答社区