我正在使用MIPS架构进行一些研究,并想知道如何使用mips提供的有限指令和内存保护来实现操作系统.我特别想知道操作系统如何阻止执行某些地址范围.例如,操作系统如何限制PC在特定范围内运行?换句话说,防止诸如从动态分配的内存执行的事情?
首先想到的是TLB,但TLB只提供内存写保护(而不是执行).
我也不太清楚操作系统是如何处理的,因为这意味着每条指令都会导致异常,然后只需要检查PC是否在一个合理的地址范围内,就会烧掉多个周期.
如果有人知道,通常如何做?是否在初始化期间由硬件以某种方式处理(例如,它给出了一个地址范围,如果超出范围则会触发异常?)
该代码以四种方式转换矩阵.第一个是顺序写入,非顺序读取.第二个是相反的.接下来的两个是相同的,但缓存跳过写入.似乎发生的是顺序写入更快,并且跳过缓存更快.我不明白的是,如果跳过缓存,为什么顺序写入仍然更快?
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) 如果这是错误的堆栈交换,我很抱歉; 它似乎是最接近一个可能对计算机体系结构有帮助的地方.对于计算机系统中的家庭作业问题,我被问到:
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意味着用于表示高速缓存中不同块的位数,而偏移量是可以选择的块内的特定字节.
我觉得我不明白什么是打击或错过.我认为有三种类型:强制,容量和冲突.如果我不知道缓存中已有什么,我怎么知道哪个是强制性的错过?在给定标签格式的情况下,如何判断缓存的容量?
感谢任何提示或提示.
我正在尝试用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) 是否可以在没有浮点单元的嵌入式处理器中执行浮点运算?
我刚刚开始学习体系结构,并且在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之间的主要区别?
我是计算机体系结构和处理器/内存级别发生的低级问题的新手。我先说。我对计算机所做的工作几乎始终处于高级编程级别。C ++,Java等
话虽这么说,我目前正在阅读一本开始深入研究低级编程内容,汇编,寄存器,指针等的书。我很难理解EIP寄存器的工作原理。
从书中所说,每个内存地址都有一个字节,每个字节都有一个内存地址。
从我读到的有关EIP寄存器的内容来看,它指向处理器要执行的下一组指令。在使用调试工具(GDB)进行本书学习时,如果要检查特定位置的内存,请说:
x / 8xb据说可以让您检查内存地址的前8个字节。但是,如果每个内存地址只有1个字节,我听不懂。有人可以帮我理解吗?我一直在寻找关于此寄存器如何工作和起作用的详尽解释,但我真的找不到任何东西
我开发了一个代码,可以输入一个大的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) 我对指令大小和可寻址空间感到困惑(我假设指令大小应该与地址位的大小相同.我在书中没有找到足够的解释)如果我是正确的,那么理论上如果我们有2 ^ 32 32位架构(RISC样式)内存的可寻址单元(字节)4字节大小的加载指令如何保存操作码以及地址?
cpu assembly operating-system instruction-set computer-architecture
我们知道在计算机上运行的所有内容都是由许多人合作的庞大程序.
因此,当计算机挂起而我们无法做任何事情时,会发生什么呢?此外,这个场景中的所有内容都冻结了程序中实现的内容吗?或者它是否像程序计数器卡住并且不能增加,因此处理器中存在一些问题?