标签: computer-architecture

MIPS内存执行预防

我正在使用MIPS架构进行一些研究,并想知道如何使用mips提供的有限指令和内存保护来实现操作系统.我特别想知道操作系统如何阻止执行某些地址范围.例如,操作系统如何限制PC在特定范围内运行?换句话说,防止诸如从动态分配的内存执行的事情?

首先想到的是TLB,但TLB只提供内存写保护(而不是执行).

我也不太清楚操作系统是如何处理的,因为这意味着每条指令都会导致异常,然后只需要检查PC是否在一个合理的地址范围内,就会烧掉多个周期.

如果有人知道,通常如何做?是否在初始化期间由硬件以某种方式处理(例如,它给出了一个地址范围,如果超出范围则会触发异常?)

memory operating-system mips computer-architecture tlb

5
推荐指数
1
解决办法
1915
查看次数

矩阵转置中的缓存利用率c

该代码以四种方式转换矩阵.第一个是顺序写入,非顺序读取.第二个是相反的.接下来的两个是相同的,但缓存跳过写入.似乎发生的是顺序写入更快,并且跳过缓存更快.我不明白的是,如果跳过缓存,为什么顺序写入仍然更快?

QueryPerformanceCounter(&before);
for (i = 0; i < N; ++i)
   for (j = 0; j < N; ++j)
      tmp[i][j] = mul2[j][i];
QueryPerformanceCounter(&after);
printf("Transpose 1:\t%ld\n", after.QuadPart - before.QuadPart);

QueryPerformanceCounter(&before);
for (j = 0; j < N; ++j)
   for (i = 0; i < N; ++i)
     tmp[i][j] = mul2[j][i];
QueryPerformanceCounter(&after);
printf("Transpose 2:\t%ld\n", after.QuadPart - before.QuadPart);

QueryPerformanceCounter(&before);
for (i = 0; i < N; ++i)
   for (j = 0; j < N; ++j)
      _mm_stream_si32(&tmp[i][j], mul2[j][i]);
QueryPerformanceCounter(&after);
printf("Transpose 3:\t%ld\n", after.QuadPart - before.QuadPart);

QueryPerformanceCounter(&before);
for …
Run Code Online (Sandbox Code Playgroud)

c caching computer-architecture

5
推荐指数
1
解决办法
853
查看次数

直接映射缓存命中/丢失

如果这是错误的堆栈交换,我很抱歉; 它似乎是最接近一个可能对计算机体系结构有帮助的地方.对于计算机系统中的家庭作业问题,我被问到:

Consider three direct mapped caches X, Y, and Z each interpreting an
8-bit address slightly differently according to the {tag:setIdx:byteOffset}
format speci?ed. For each address in the reference stream, indicate whether the
access will hit (H) or miss (M) in each cache.

                  C1       C2     C3
Address Formats: {2:2:4} {2:3:3} {2:4:2}

Address References in Binary: 00000010, 00000100...
Run Code Online (Sandbox Code Playgroud)

我应该说每个地址引用是否会导致命中或错过,但我不知道从哪里开始.

对于格式,我认为标签意味着高速缓存块中数据的标记,setIdx意味着用于表示高速缓存中不同块的位数,而偏移量是可以选择的块内的特定字节.

我觉得我不明白什么是打击或错过.我认为有三种类型:强制,容量和冲突.如果我不知道缓存中已有什么,我怎么知道哪个是强制性的错过?在给定标签格式的情况下,如何判断缓存的容量?

感谢任何提示或提示.

memory caching computer-architecture

5
推荐指数
1
解决办法
6735
查看次数

用VHDL编写寄存器文件

我正在尝试用VHDL编写寄存器文件.该文件包含16个64位寄存器.每个周期读取两个寄存器并写入一个寄存器(假设写入已启用).应该有一个数据旁路(转发),这样如果我们在一个周期内读取和写入同一个寄存器,那么刚写入的值就会直接转发到输出.

我的想法是在上升沿写入并在时钟的下降沿读取,以便在一个周期内完成此操作.但是,我的设计不起作用(不是我预期的,因为我不相信在检查上升沿的if块中检查下降沿将按预期工作).

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity register_file is   
    port
    (
    outA          : out std_logic_vector(63 downto 0);
    outB          : out std_logic_vector(63 downto 0);
    input         : in  std_logic_vector(63 downto 0);
    writeEnable   : in std_logic;
    regASel       : in std_logic_vector(5 downto 0);
    regBSel       : in std_logic_vector(5 downto 0);
    writeRegSel   : in std_logic_vector(5 downto 0);
    clk           : in std_logic
    );
end register_file;

architecture behavioral of register_file is
type registerFile is array(0 to 15) of std_logic_vector(63 downto 0);
signal registers : …
Run Code Online (Sandbox Code Playgroud)

vhdl hdl computer-architecture cpu-registers

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

没有FPU的处理器中的浮点计算

是否可以在没有浮点单元的嵌入式处理器中执行浮点运算?

c operating-system fpu computer-architecture

5
推荐指数
1
解决办法
1562
查看次数

MIPS和ARM的区别

我刚刚开始学习体系结构,并且在MIPS和ARM体系结构之间有些困惑。

我知道MIPS主要有两种指令格式:I和R(以及J)。我了解了这些表示格式,rs,rt,操作码和相关内容。我还浏览了Patterson的COA书(第IV版),该书重点介绍ARM ISA。该版本中的指令表示形式有所不同。这些差异是由于体系结构的变化引起的吗?与我与MIPS ISA一起使用的书中的ARM汇编代码略有不同。

例如。帕特森四世说

LDR r5,[r3,#32]
STR r1,[r4,#48]
Run Code Online (Sandbox Code Playgroud)

而我读过的另一个MIPS说

lw r5,[r3,#32]
sw r1,[r4,#48]
Run Code Online (Sandbox Code Playgroud)

差异是由于它们遵循的ISA还是同一ISA的两个不同版本?您能否解释一下MIPS和ARM之间的主要区别?

arm mips computer-architecture instructions

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

了解EIP(RIP)寄存器如何工作?

我是计算机体系结构和处理器/内存级别发生的低级问题的新手。我先说。我对计算机所做的工作几乎始终处于高级编程级别。C ++,Java等

话虽这么说,我目前正在阅读一本开始深入研究低级编程内容,汇编,寄存器,指针等的书。我很难理解EIP寄存器的工作原理。

从书中所说,每个内存地址都有一个字节,每个字节都有一个内存地址。

从我读到的有关EIP寄存器的内容来看,它指向处理器要执行的下一组指令。在使用调试工具(GDB)进行本书学习时,如果要检查特定位置的内存,请说:

x / 8xb据说可以让您检查内存地址的前8个字节。但是,如果每个内存地址只有1个字节,我听不懂。有人可以帮我理解吗?我一直在寻找关于此寄存器如何工作和起作用的详尽解释,但我真的找不到任何东西

x86 assembly gdb computer-architecture cpu-registers

5
推荐指数
1
解决办法
8148
查看次数

解释perf属性输出

我开发了一个代码,可以输入一个大的2-D图像(最高64MPixels)和:

  • 在每一行上应用过滤器
  • 转置图像(使用阻止以避免大量缓存未命中)
  • 在图像的列(现在行)上应用过滤器
  • 将过滤后的图像转换回来进行其他计算

虽然它没有改变某些东西,但为了完整性我的问题,过滤是应用离散小波变换,代码是用C语言编写的.

我的最终目标是尽可能快地运行.到目前为止,通过使用阻塞矩阵转置,矢量化,多线程,编译器友好的代码等,我的速度提高了10倍以上.

来到我的问题:我所使用的代码的最新分析统计数据让我perf stat -e感到困扰.

        76,321,873 cache-references                                            
     8,647,026,694 cycles                    #    0.000 GHz                    
     7,050,257,995 instructions              #    0.82  insns per cycle        
        49,739,417 cache-misses              #   65.171 % of all cache refs    

       0.910437338 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)

(缓存未命中数)/(#指令)低约0.7%.这里提到这个数字是检查内存效率的好事.

另一方面,高速缓存未命中高速缓存引用的百分比非常高(65%!),正如我所看到的那样,可以表明在高速缓存效率方面执行出现问题.

详细的统计数据perf stat -d是:

   2711.191150 task-clock                #    2.978 CPUs utilized          
         1,421 context-switches          #    0.524 K/sec                  
            50 cpu-migrations            #    0.018 K/sec                  
       362,533 page-faults               #    0.134 M/sec                  
 8,518,897,738 cycles                    #    3.142 GHz                     [40.13%]
 6,089,067,266 stalled-cycles-frontend   #   71.48% frontend …
Run Code Online (Sandbox Code Playgroud)

optimization performance caching computer-architecture perf

5
推荐指数
1
解决办法
3041
查看次数

32位IR保持加载指令如何?(RISC样式32位架构)

我对指令大小和可寻址空间感到困惑(我假设指令大小应该与地址位的大小相同.我在书中没有找到足够的解释)如果我是正确的,那么理论上如果我们有2 ^ 32 32位架构(RISC样式)内存的可寻址单元(字节)4字节大小的加载指令如何保存操作码以及地址?

cpu assembly operating-system instruction-set computer-architecture

5
推荐指数
1
解决办法
428
查看次数

当一个人说电脑"挂起"或冻结时会发生什么?

我们知道在计算机上运行的所有内容都是由许多人合作的庞大程序.
因此,当计算机挂起而我们无法做任何事情时,会发生什么呢?此外,这个场景中的所有内容都冻结了程序中实现的内容吗?或者它是否像程序计数器卡住并且不能增加,因此处理器中存在一些问题?

operating-system hang computer-architecture

5
推荐指数
1
解决办法
407
查看次数