Visual Studio 2015更新1:新的实验功能–MPX

介绍

这篇文章是关于英特尔的® 内存保护扩展(Intel)® MPX)支持Microsoft Visual Studio*2015;提供的内容 英特尔公司的高瑟姆·比拉卡、乔治·宽和胡安·罗德里格斯。

null

概述

更新1 Visual Studio 2015 于2015年11月30日发布。此更新包括对英特尔MPX的实验性编译器和调试器支持。  英特尔MPX 可以检查所有指针读写,以确保它们保持在声明的内存边界内。  这项技术可以检测 缓冲区溢出并在运行时停止程序执行,从而避免可能的系统危害。它使C/C++代码能够 利用 新的MPX指令集和寄存器在6 第二代英特尔® 核心™ 处理器(“支持MPX的平台”)。

微软Visual C++编译器和链接器现在可以自动生成检查,通过指定命令行选项来启用能力。

这个博客解释了如何使用自动MPX代码生成和调试支持MPX的二进制文件。  有关英特尔MPX的详细信息,请参阅 英特尔MPX技术网页 .

如何启用MPX代码自动生成

Visual Studio 2015 Update 1引入了一个新的编译器选项: /2英里/小时 .

/2英里/小时 目前支持:

  • 检查内存写入是否存在潜在的缓冲区溢出。 这为本地和全局指针和数组提供了保护。
  • 对调用约定的扩展,以自动传播与指针参数关联的边界。

要为项目启用MPX代码自动生成,请执行以下操作:

在visualstudio中,添加 /2英里/小时 “附加选项”框中的选项( Project属性C++配置属性c/c++命令行附加选项 ),图1。

图片[1]-Visual Studio 2015更新1:新的实验功能–MPX-yiteyi-C++库 图1。 添加 /2英里/小时 每个所需配置的编译器选项。

用法示例

下面的示例是一个包含说明性缓冲区溢出的程序

图片[2]-Visual Studio 2015更新1:新的实验功能–MPX-yiteyi-C++库 图2。 将使用检测到缓冲区溢出的代码 /2英里/小时。

在图2中,for循环中的语句会溢出 外面的 当它试图写入超过数组结尾时 外面的 小于字符串 str公司 . 就在程序执行out-of-bounds存储之前,MPX硬件将生成一个#BR(bound range exceeded)异常,该异常表现为结构化异常处理(SEH)异常“Array bounds exceeded”。数组边界超出异常缺少异常处理程序时的默认行为是立即终止程序。或者,可以添加一个异常处理程序,如示例代码中所示,以记录异常或执行一些上下文相关的恢复,例如在一直避免越界存储的情况下中断进程。

构建和运行示例的步骤:

  1. 检查情报® MPX运行时驱动程序已安装在您的Microsoft® 窗户® 2015年11月10日通过验证系统设备下的设备管理器中是否存在更新或更高版本的系统(图3)。  如果没有,请从 英特尔® 内存保护扩展启用指南 .

  2. 安装Visual Studio 2015 Update 1。注意,如果Visual Studio与电话模拟器一起安装,则必须禁用Hyper-V( bcdedit/将hypervisorlaunchtype设置为off 和重新启动),因为此版本的Windows不会向来宾公开MPX指令。

  3. 创建一个名为“MPXExample”的Win32控制台应用程序,并使用图2中的代码作为驱动程序代码。

  4. 如上所述,请再次检查 /2英里/小时 选项已为当前配置启用。

  5. 在visualstudio中为X64平台构建项目。这将生成一个MPXExample.exe二进制文件。

  6. 在支持MPX的Windows 10平台上执行二进制MPXExample.exe,该平台的操作系统支持MPX。

  7. 若要使Visual Studio调试器在超出数组边界的异常上中断,请在异常设置中启用“超出数组边界”选项( 调试| Windows |异常设置 )如图4所示。在调试器中执行MPXExample.exe现在应该会中断异常(图5)。在本例中,当MPX检测到我们将要写入超出out数组上限的内容时,抛出#BR异常(图6)。

图片[3]-Visual Studio 2015更新1:新的实验功能–MPX-yiteyi-C++库

图3.验证Intel MPX运行时驱动程序是否通过设备管理器安装。

图片[4]-Visual Studio 2015更新1:新的实验功能–MPX-yiteyi-C++库

图4.在ExceptionSettings窗口中启用break on the array bounds exceeded exception,以使VisualStudio调试器在异常上中断。

图片[5]-Visual Studio 2015更新1:新的实验功能–MPX-yiteyi-C++库

图5。 VisualStudio调试器中断了数组边界超出异常。

图片[6]-Visual Studio 2015更新1:新的实验功能–MPX-yiteyi-C++库

图6。 在检查反汇编窗口的这个快照中所示的上限时抛出异常。

Visual Studio 2015 Update 1支持在启用MPX的平台上运行时,通过寄存器(图7)和监视窗口(图8)显示和操作MPX寄存器。

图片[7]-Visual Studio 2015更新1:新的实验功能–MPX-yiteyi-C++库

图7。 要观察MPX边界寄存器的上下文,请在调试器寄存器窗口中启用MPX。

图片[8]-Visual Studio 2015更新1:新的实验功能–MPX-yiteyi-C++库

图8.向调试器监视窗口添加边界寄存器也很简单。监视窗口中的BND0.UB和BND0.LB指的是BND0中的上下限 分别注册。注意,边界寄存器的上界以2的补码形式显示。

如何判断二进制文件是否启用MPX

dumpbin/headers MPXExample.exe。 MPX调试目录条目应该类似于图9所示。

图片[9]-Visual Studio 2015更新1:新的实验功能–MPX-yiteyi-C++库

图9.要判断二进制文件是否启用了MPX,请检查二进制文件是否包含 mpx公司 使用调试目录 垃圾箱 . 这个 mpx公司 调试目录应列在 垃圾箱 输出。

我必须用MPX编译所有的东西吗?

您不必在启用MPX的情况下编译所有代码。  混合使用MPX和未启用MPX的代码将正确执行。 但是,没有MPX支持编译的代码将不会有任何MPX检查。

Windows的硬件和版本是什么 我需要什么?

为了获得MPX的好处,支持MPX的代码应该在运行支持MPX的Windows操作系统版本的支持MPX的平台上执行。 从今天起,MPX在以下方面受到支持:

图片[10]-Visual Studio 2015更新1:新的实验功能–MPX-yiteyi-C++库

如果我在平台或Windows版本上执行启用MPX的代码呢 不支持MPX?

启用MPX的代码将正确执行,但它不会从MPX中受益。 您需要在支持MPX的平台上执行代码,该平台具有MPX感知的操作系统。  MPX指令将被视为nop,因此在这些场景中您可能会遇到性能下降。

性能影响

MPX技术为防止缓冲区溢出提供了强有力的保障。为每次写入内存插入检查可能会导致一些执行时间和内存占用开销。  测试期间的开销是可以接受的。  但是,当为生产代码启用时,开发人员必须权衡改进的内存安全性是否超过了客户的性能需求。  我们计划根据反馈提高绩效。

已知问题

x86调试生成存在一个已知问题,其中调试插装会干扰MPX操作。

更多信息和反馈

有关“英特尔MPX”的工作原理、MPX内部函数、调用约定扩展和MPX运行时行为的详细信息,请参阅 英特尔® 内存保护扩展启用指南 .

请在Visual Studio 2015 Update 1中尝试自动生成MPX代码。我们非常希望了解您的体验,特别是在可用性、代码大小和运行时性能影响方面,以及您对如何改进此功能的建议。请在下面的评论框或 英特尔ISA扩展论坛® 显影剂区 .

英特尔 技术的特点和好处取决于系统配置,可能 需要启用的硬件、软件或服务激活。性能各不相同 取决于系统配置。 请咨询您的系统制造商或 零售商或了解更多信息 英特尔MPX技术网页 . Intel,Intel徽标,第6代Intel® 核心是 英特尔公司在美国和/或其他国家/地区的商标。 *其他名称和品牌可被称为 其他人。 © 2016英特尔公司

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享