背景
Rust作为一种内存安全的语言,一直以来都备受广大程序员的推崇,广受欢迎,语言热度在StackOverflow上也一直是top级别。当然也可能是因为太难的原因,导致问问题的人太多,造成了虚假繁荣的假象。😂
系统开发
由于其内存安全的特性,也受到操作系统开发领域的青睐,Linux内核已经引入了Rust,而微软的Surface团队在2023年9月份也发布了相关的Windows-driver-rs项目,以支持使用Rust语言进行Windows驱动开发。
项目地址:https://github.com/microsoft/windows-drivers-rs
当然,并不是在微软的这个项目发布之前就不能用Rust开发Windows驱动,至少网上已有的使用Rust进行Windows驱动开发的教程几年前就有了,也不是微软发布的这个项目能使用Rust风格去开发驱动,至少从目前的使用体验上来看,只是简单的调用已有的内核接口,且代码中存在大量的unsafe使用,项目也建议用户不要在生产环境使用,只能说是一个实验性的项目。
优点
虽然使用Rust进行Windows驱动开发还不完善,但是还是很有意思的一件事。
语言支持
C语言能进行很多领域的开发,应用层、嵌入式、内核。其中一个很重要的原因是语言灵活度大,比如内存管理,完全由程序员手动控制,而在不同环境申请内存方式可能不一样,比如Windows和Linux都是不同的系统调用,虽然C语言封装了malloc但是也是可以手动调用系统函数申请内存的,所以可以支持不同领域不同平台的内存管理。
而Rust作为内存安全的语言,它通过生命周期管理的方式使得程序员也不用管理内存申请,哪它如何支持不同领域不同平台的内存管理呢?答案是将内存管理作为一个可被替换组件,通过#[global_allocator]指定GLOBAL_ALLOCATOR设置默认的内存管理,不得不说是很有意思的设计。组件化的设计,能灵活的用于不同的场景。
❝
🤔这个特点不得不提一嘴,我觉得这个特性可以被更多的语言采纳和拓展。因为一般语言官方都提供有标准库,而标准库一般不让修改,除非你进行源码编译。如果说标准库满足不了你的需求,你想要在标准库中添加修改一些功能,那么你有以下做法:1、自己实现一个第三方的; 2、去官方提issue; 3、源码上添加修改,重新编译;
这些都不是很好和很容易的做法。如果说能提供一种类似的方式进行替换并且全局生效,不得不说是很酷的一件事。❞
内存安全
在目前非原生开发的情况下表现不明显,代码中有大量unsafe代码和原始指针的使用。但是使用Rust开发,你就不得不刻意的去注意对象的生命周期管理,而不是和C语言开发一样容易被忽视。这将很大程度减少在内存管理上的问题。
语法易用
Rust我一直认为它是现有的优秀编程范式的集大成者,即它在语法的易用性上表现很好,例如Option处理空值、Result处理返回值、match语法,将其它语言后期增加的特性原生集成在语言语法中,不得不说这是后面出来的编程语言的优势,将原有编程语言后期添加的优秀特性作为自己的原生特性。
现代化的包管理
语言的包管理等周边生态对语言的发展很重要,新出的语言官方都会做包管理工具,例如golang、rust、flutter等,你如果用过这些语言的包管理和C语言的MakeFile就知道易用性上存在多大的差距。当然C语言的库是遥遥领先,基本上新语言很多常用库都是C移植,例如网络协议、加密等。
现代化的包管理将吸引更多开发者入驻,积累语言资产,增加易用性,进而吸引更多人,是一个良性循环。
缺点
内存分配器
虽然Rust的#[global_allocator]指定全局内存分配器很好用,但是在Windows内核开发时还是存在一些问题,比如内核开发时有分页内存和非分页内存之分,而全局的内存分配器只能指定一种内存,要么申请分页内存要么申请非分页内存。即还是需要自己管理另外一种内存的申请和释放。
SEH支持
SEH结构化异常处理是MSVC编译器支持的特性,属于Windows平台专用,MSVC编译器专用。LLVM貌似是有SEH的支持?不过Rust并没有相关的语法。
总结
结论Rust做Windows驱动开发有好有坏,总的来说还是挺有意思的。未来微软应该会为其带来更多的支持。未来可期 😮💨
本文使用 markdown.com.cn 排版