微软用 18 万行 Rust 重写了 Windows 内核

微软正在使用 Rust 编程语言重写其核心 Windows 库。 5 月 11 日——Azure 首席技术官 Mark Russinovich 表示,最新的 Windows 11 Insider Preview 版本是第一个包含内存安全编程语言 Rust 的版本。

“如果你参加了 Win11 Insider 环,你将在 Windows 内核中首次体验 Rust,”Russinovich 昨晚发推文说。

无论如何,这一次来得很快:微软直到 4 月中旬在以色列举行的 BlueHat IL 2023 安全会议上才公开了用 Rust 代码替换部分 Windows 内核的计划。

当时,Windows 操作系统安全总监 David “dwizzle” Weston 在一次演讲中宣布 Rust 将正式进入 Windows 内核。

“在接下来的几周或几个月里,人们将开始在内核中使用 Rust 来启动 Windows。这项工作的基本目标是将系统的一些 C++ 数据类型转换为 Rust 形式。”

Rust 已进入 Windows 内核

微软的重点是“消除错误类”,并希望采取更积极的方法来确保更安全的代码。他们希望通过内存安全语言、CPU 架构变化以及更安全的语言子集来实现这一目标。

David Weston 这次演讲的重点是内存安全语言。在Windows内核中,主要语言是C。由于MFC和COM的存在,内核之外的大部分代码都是C++,甚至MSVC libc实际上也是用C++编写的,带有extern“C”声明。然而,从 Windows Vista 开始,内核开始允许 C++ 代码(VC++ 获得了 /kernel 标志)。

目前微软已经重写了两个主要项目,DWriteCore和Win32 GDI,其中包含一些非常旧的代码。Win32 GDI 编写于 80 年代末和 90 年代初,专为 286/386 设计。

微软首先将 Rust 引入 DWriteCore,它是 Windows DWrite 引擎的 Windows App SDK 实现的一部分,用于文本分析、布局和渲染。

这项工作于 2020 年开始,DWriteCore 目前包含约 152,000 行 Rust 代码和 96,000 行 C++ 代码。

DWriteCore私有API使用类似COM的接口,公共API都是COM,其中C++和Rust可以轻松集成。

据介绍,两名开发人员总共花了六个月的时间才完成这项工作,包括编写代码和做相应的测试。所有这些改进现在都向软件开发人员开放。

David Weston 表示,这是一个非常值得的项目,因为该领域以其安全漏洞而闻名,而重写带来的性能提升是惊人的!除了预期的安全性改进之外,据说使用 OTLS(OpenType 库服务)可以将 Shaping(替换)字形的性能提高 5% 到 15%。

此外,微软的Windows图形设备接口(Win32 GDI)也正在移植到Rust,现在有36,000行Rust代码。weston 强调,Rust 不仅比 C++ 更容易编写,而且更容易理解。最新版本的 Windows 11 从这个版本的 Rust 开始,但尽管它已经通过了所有 GDI 测试,Rust 界面仍然被一个功能标志禁用。

Weston 说:“今天的 Windows 内核中实际上有一个 SysCall,它是用 Rust 实现的。”

但微软对 Rust 的支持并不是理所当然的,Weston 解释道,“恐怕我们不会很快用 Rust 完全重写 Windows,虽然我们都喜欢 Rust,但我们仍然需要有一个健全的策略放在第一位,包括保护我们更多的本机代码。”

但重要的是要承认,微软的认可、支持和代码贡献正在使 Rust 变得更强大,这对于整个开源社区来说是一件好事。

Rust 已经进入 Windows 内核

微软几年前开始对 Rust 表现出兴趣,认为这是在产品正式发布之前捕获和消除内存安全漏洞的好方法。自2006年以来,Windows开发团队修复了大量CVE列出的安全漏洞,其中约70%与内存安全相关。

Rust 工具链致力于防止开发人员构建和发布存在安全缺陷的代码,从而降低恶意黑客攻击软件弱点的可能性。简而言之,Rust 对内存安全和相关保护的关注有效地减少了代码中包含的严重错误的数量。

谷歌等行业巨头也公开拥抱 Rust 语言。

随着业界对内存安全编程的日益关注,微软也表现出了探索 Rust 的热情。去年 9 月,微软向 Microsoft Azure 首席技术官 Mark Russinovich 发出非正式授权,要求其在新软件项目中使用 Rust,而不是 C/C++。

现在 Rust 已经进入 Windows 内核,Weston 表示 Microsoft Windows 将继续推进这项工作,Rust 很快就会广泛使用。

Python Flask 项目的领导者、Sentry 的安全工程师、开源软件开发人员 Armin Ronacher 在一次电子邮件采访中指出,微软的青睐对于 Rust 语言非常重要。

“具体来说,我希望微软能够重用现有的编译器来带来更好的PDB(程序数据库)支持。当前的 Windows 在开发工具支持方面无法跟上其他基于 DWARF(使用属性记录格式进行调试)的平台。”

Pydantic 创始人兼 Python/Rust 开发者 Samuel Colvin 也表示:“微软的这种前瞻性思维给我留下了深刻的印象,但这是有道理的。我相信微软是受到工程师的压力才接受 Rust 的。此时,如果目标是构建一个强调性能或更注重底线的应用程序,那么 Rust 无疑是一个明智的选择。”

Colvin 还提到,虽然市场上可能没有很多优秀的 Rust 工程师,但他仍然认为找到优秀的 Rust 工程师比找到优秀的 C/C++ 工程师更容易。

“拥有丰富 Rust 开发经验的人并不多,但很多工程师愿意尝试和学习。毕竟,编写安全代码本身就不是一件容易的事,而在 Rust 中至少相对来说不那么困难。”

Colvin 总结道:“对于我们这些依赖 Rust 的开发人员来说,微软使用和支持 Rust 的决定确实令人兴奋。”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/95591.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL官网下载安装包

MySQL官网: MySQL MySQL 8.0官网下载地址: MySQL :: Download MySQL Community Server 2023-07-18 MySQL 8.1.0 发布,这是 MySQL 变更发版模型后的第一个创新版本 (Innovation Release) 。 如果在官网中找不到下载位置,点击第二个…

Royal TSX 6 Mac多协议远程软件

Royal TSX是一款功能强大的远程桌面管理软件,适用于Mac操作系统。它允许用户通过一个集成的界面来管理和访问多个远程计算机和服务器。 Royal TSX支持多种远程协议,包括RDP、VNC、SSH、Telnet和FTP等,可以方便地连接到Windows、Linux、Mac和其…

python3对接godaddy API,实现自动更改域名解析(DDNS)

python3对接godaddy API,实现自动更改域名解析(DDNS) 文章开始前,先解释下如下问题: ①什么是域名解析? 域名解析一般是指通过一个域名指向IP地址(A解析),然后我们访问…

SOLIDWORKS中多实体文件到装配体的转换技巧

我们在做机械等工程设计中,有时为了节省时间,需要把多实体的“零件”,直接转换为装配体,不再另外装配,这样能大大简化设计的操作时间,复杂程度。 在这里,我们首先要了解,SOLIDWORKS文…

微信小程序 实时日志

目录 实时日志 背景 如何使用 如何查看日志 注意事项 实时日志 背景 为帮助小程序开发者快捷地排查小程序漏洞、定位问题,我们推出了实时日志功能。从基础库2.7.1开始,开发者可通过提供的接口打印日志,日志汇聚并实时上报到小程序后台…

数据库CPU飙高问题定位及解决

在业务服务提供能力的时候,常常会遇到CPU飙高的问题,遇到这类问题,大多不是数据库自身问题,都是因为使用不当导致,这里记录下业务服务如何定位数据库CPU飙高问题并给出常见的解决方案。 CPU 使用率飙升根因分析 在分…

Gin 框架入门实战系列(一)

GIN介绍 Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点 对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错 借助框架开发,不仅可以省去很多常用的封装带来的时间,…

网络安全研究和创新:探讨网络安全领域的最新研究成果、趋势和创新技术,以及如何参与其中。

第一章:引言 随着数字化时代的到来,网络安全变得比以往任何时候都更加重要。无论是个人、企业还是国家,都面临着日益复杂和隐蔽的网络威胁。为了确保我们的信息和资产的安全,网络安全研究变得至关重要。本文将深入探讨网络安全领…

微信小程序左上角home图标的解决方法之一 层级混乱导致的home图标显示的问题 自定义左上角左侧图标的返回路径

这个项目的编辑页在tabbar上 导致跳到tabbar得使用wx.switchTab 保存后返回原来的页面就出现了左上角的home图标 本来想通过自定义home图标的跳转路径来解决这个问题 没想到居然找不到相关内容 有清楚的朋友麻烦给我留个言不胜感激 那我写一下我的骚操作 app.js globalData: {…

kafka消息系统实战

kafka是什么&#xff1f; 是一种高吞吐量的、分布式、发布、订阅、消息系统 1.导入maven坐标 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.4.1</version></dependency&…

Qt 打开文件列表选择文件,实现拖拽方式打开文件

1. 实现打开文件列表选择文件 1.1. 创建 Qt 工程&#xff0c;并添加几个简单控件 这里笔者选用的是 QMainWindow&#xff0c;创建好工程后在 ui 界面设计中添加 QLineEdit、QPushBtton至少这两个控件&#xff0c;如下图摆放。 1.2. 头文件中添加相关操作 在 mainwindow.h 中…

python+TensorFlow实现人脸识别智能小程序的项目(包含TensorFlow版本与Pytorch版本)(一)

pythonTensorFlow实现人脸识别智能小程序的项目&#xff08;包含TensorFlow版本与Pytorch版本&#xff09;&#xff08;一&#xff09; 一&#xff1a;TensorFlow基础知识内容部分&#xff08;简明扼要&#xff0c;快速适应&#xff09;1、下载Cifar10数据集&#xff0c;并进行…

【【萌新的STM32-22中断概念的简单补充】】

萌新的STM32学习22-中断概念的简单补充 我们需要注意的是这句话 从上面可以看出&#xff0c;STM32F1 供给 IO 口使用的中断线只有 16 个&#xff0c;但是 STM32F1 的 IO 口却远远不止 16 个&#xff0c;所以 STM32 把 GPIO 管脚 GPIOx.0~GPIOx.15(xA,B,C,D,E,F,G)分别对应中断…

C语言:指针类型的意义

1.指针的类型决定了解引用时访问几个字节 2.指针的类型决定了指针1、-1跳过几个字节 一、指针的类型决定指针解引用时访问几个字节 例如 int 型指针解引用时访问4个字节 char 型指针解引用时访问1个字节 详解代码如下&#xff1a; int b 0x11223344&#xff08;十六进制&…

【链表OJ】相交链表 环形链表1

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 一.leetcode 160. 相交链表 1.问题描述: 2.解题思路: 二.leetcode 141.环形链表 …

C++ 异常

一、异常概念 异常是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时就可以抛出异常&#xff0c;让函数的直接或间接 的调用者处理这个错误。 throw: 当问题出现时&#xff0c;程序会抛出一个异常。这是通过使用 throw 关键字来完成的。 catch: 在您想要…

h5分享页适配手机电脑

实现思路 通过media媒体查询结合rem继承html文字大小来实现。 快捷插件配置 这里使用了VSCode的px to rem插件。 先在插件市场搜索cssrem下载插件&#xff1b; 配置插件 页面编写流程及适配详情 配置meta h5常用配置信息:<meta name"viewport" content&quo…

Sentinel dashboard无法查询到应用的限流配置问题以及解决

一。问题引入 使用sentinle-dashboard控制台 项目整体升级后&#xff0c;发现控制台上无法看到流控规则了 之前的问题是无法注册上来 现在是注册上来了。结果看不到流控规则配置了。 关于注册不上来的问题&#xff0c;可以看另一篇文章 https://blog.csdn.net/a15835774652/…

PCIE WIFI与金手指转接设计

PCIE转接口设计&#xff1a; 金手指转接设计 类似的芯片的框图&#xff1a;

centos安装Nginx配置Nginx

1. 查看操作系统有没有安装Nginx which nginx 2. 使用epel的方式进行安装&#xff08;方法二&#xff09; 先安装epel sudo yum install yum-utils 安装完成后&#xff0c;查看安装的epel包即可 sudo yum install epel 3 开始安装nginx 上面的两个方法不管选择哪个&…