地址过滤窗口

地址过滤窗口

LS232IP为提升性能采用了推测执行技术,因此位于错误推测路径上的取指操作和取数操作都可能产生程序员不可控的处理器接口总线访问地址。另一方面,在一些系统中,存在一些设备包含有会引起系统死机的地址空洞。当错误推测路径引发的不可控地址恰好落在这些地址空洞的范围内,就会引起系统的死机。为解决该问题,LS232IP提供了地址过滤窗口机制。该机制保证落在地址过滤窗口内的地址访问永远不会出现在处理器接口总线上。

现介绍地址过滤窗口的具体工作机制。LS232IP可最多配置4个地址过滤窗口,依次称作0号、1号、2号、3号地址过滤窗口。每个地址过滤窗口包含3个域,第1个域为使能域,用于该地址过滤窗口过滤功能的开启或关闭;第2个域为窗口基址(base address),记录的是过滤窗口的起始地址,特别注意的是这里记录的地址是物理地址;第3个域为过滤掩码(mask),用于控制地址窗口的大小。 例如64K字节大小的窗口,其过滤掩码为32'hFFFF_0000。需要注意的是窗口的大小必须为2的n次方字节(n的取指范围从8到31,包括8和31),同时地址过滤窗口的起始地址仅从窗口边界开始计算。再以64K字节大小的窗口为例,如果软件将窗口基址设为32'h0001ABCD,处理器将视该窗口的范围为32'h00010000~32'h0001FFFF。

地址过滤窗口的使能通过CP0第22,select 7号寄存器的[3:0]位控制,第i位对应第i个过滤窗口的使能(i=0,1,2,3),为1表示开启,为0表示关闭。地址过滤窗口的其他域按照0号窗口的基址、0号窗口的掩码、1号窗口的基址、……、3号窗口的掩码的顺序组织成一个数组,即0号窗口的基址为数组的第0个元素,0号窗口的掩码为数组的第1个元素,……余下各项可依次类推。对地址过滤窗口非使能控制域的访问即通过对该数组各元素的读写完成。其中,读操作的执行顺序是,先向CP0第22,select 5号寄存器写入需访问元素的数组下标,再读取CP0第22,select 6号寄存器,取回内容即为指定数组项的内容。写操作的执行顺序类似,区别在于当数组下标写入CP0第22,select 5号寄存器后,需要将写入的内容写入到CP0第22,select 6号寄存器。下面给出一段设置第N个地址过滤�
 ��口的�
��考代码,代码中N、BASE和MASK均为常数,代表窗口号,窗口的基址,窗口的掩码。

li             a1, 2×N                #设置N号窗口的基址

mtc0        a1, $22, 5            #

li             t0, BASE               #

mtc0        t0, $22, 6             #

li             a1, 2×N+1           #设置N号窗口的掩码

mtc0        a1, $22, 5            #

li             t0, MASK              #

mtc0        t0, $22, 6             #

mfc0        t0, $22, 7

li             t1, 1                     #这里可以直接将第N位置为1

sll            t1, t1, N               #

or            t0, t0, t1              #

mtc0       t0, $22, 7             #使能N号过滤窗口

我们的芯片5,6,7改成5,4,7

cpu内部挡cache访问的窗口,只挡cache读,不影响其他操作,因此汪文祥建议用一个窗口将寄存器空间全盖住,代码如下:
下面代码是将0x10000000-0x1fffffff禁止取指代码。

asm("mtc0 %0,$22,5;mtc0 %1, $22, 4; mtc0 %2, $22, 5;mtc0 %3, $22, 4;mtc0 %4,$22,7"::"r"(0),"r"(0x10000000),"r"(1),"r"(0xf0000000),"r"(1));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。 【2】项目主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 【3】项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 【4】如果基础还行,或热爱钻研,可基于此项目进行二次开发,DIY其他不同功能,欢迎交流学习。 【注意】 项目下载解压后,项目名字和项目路径不要用中文,否则可能会出现解析不了的错误,建议解压重命名为英文名字后再运行!有问题私信沟通,祝顺利! 基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip基于C语言实现智能决策的人机跳棋对战系统源码+报告+详细说明.zip
setwindowdisplayaffinity函数可以用来实现抓屏窗口过滤,即只捕获指定窗口所在的显示器上的图像。 假设需要抓取指定窗口所在的显示器上的图像,可以按照以下步骤操作: 1. 获取指定窗口所在的显示器句柄,可以使用GetWindowRect函数获取窗口的位置和大小,然后使用MonitorFromRect函数获取指定窗口所在的显示器句柄。 ``` RECT rc; GetWindowRect(hWnd, &rc); HMONITOR hMonitor = MonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST); ``` 2. 将指定窗口所在的显示器设置为窗口的显示亲和性,可以使用setwindowdisplayaffinity函数将窗口的显示亲和性设置为指定的显示器,同时设置WDA_EXCLUDEFROMCAPTURE参数,表示窗口不会被屏幕截图捕获。 ``` SetWindowDisplayAffinity(hWnd, WDA_MONITOR | WDA_EXCLUDEFROMCAPTURE, hMonitor); ``` 3. 使用BitBlt函数抓取指定窗口所在的显示器上的图像,可以使用CreateDC函数创建一个设备上下文句柄,然后使用BitBlt函数将指定窗口所在的显示器上的图像复制到设备上下文中。 ``` HDC hdcScreen = GetDC(NULL); HDC hdcDest = CreateCompatibleDC(hdcScreen); HBITMAP hBitmap = CreateCompatibleBitmap(hdcScreen, rc.right - rc.left, rc.bottom - rc.top); SelectObject(hdcDest, hBitmap); BitBlt(hdcDest, 0, 0, rc.right - rc.left, rc.bottom - rc.top, hdcScreen, rc.left, rc.top, SRCCOPY); ``` 4. 释放资源,释放设备上下文、位图和显示器设备上下文。 ``` ReleaseDC(NULL, hdcScreen); ReleaseDC(NULL, hdcDest); DeleteObject(hBitmap); ``` 完成以上步骤后,就可以实现抓取指定窗口所在的显示器上的图像,并且不会受到其他窗口的干扰。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值