首页 十大品牌文章正文

指针 vs 句柄:别问我是谁👺

十大品牌 2025年10月01日 06:51 1 admin

在开发Windows应用程序的时候,往往需要访问或者创建一些内核资源(例如:创建进程、线程),这时候我们往往会遇到句柄(Handle)这个抽象概念。句柄(Handle)是很多时候,是用来唯一标识一些重要的内核资源,例如:进程、线程的PCB/TCB信息。对于一些简单的RTOS系统,有时候没有Handle的概念,往往会直接向开发者返回PCB/TCB的指针(也就是PCB/TCB所在的内存地址),由于内存地址的唯一性,所以指针也可以唯一的标识进程或线程的PCB/TCB信息。

指针 vs 句柄:别问我是谁👺

那问题来了,既然指针已经可以很好的标识这些内核数据信息了,为什么还需要句柄呢?简单的回答是:Handle是基于安全性的考虑。因为一旦开发者或黑客知道了某些内核资源的内存地址,他就可以试图扫描这一区域的内存空间,从中获取一些敏感信息,例如:进程、线程的名称,运行时间,所处的运行状态等。

指针 vs 句柄:别问我是谁👺

当然,现代操作系统(例如:Linux、Windows)中像PCB/TCB都保存在内核态的内存空间中,与运行在用户态上的普通程序,即使知道了PCB/TCB的内核内存地址,也无法直接访问,似乎我们不用担心这些内核内存地址的泄露,但不要忘了,开发者和黑客还可以开发运行在内核态的驱动程序,通过驱动程序,就可以扫描泄露出来的内核内存地址了。

所以,为了安全的考虑,现代操作系统往往会对包换PCB/TCB的指针(内核地址),做一个一一对应的转换,这个转换值就是Handle。这样一方面给用户态的开发者,间接访问、控制内核资源的能力,同时又避免了内核态中,关键内存地址的泄露。

简单来说,句柄(handle)就是操作系统资源的“编号”或“门票”。你无法直接接触资源本体——例如窗口、文件或线程——但可以通过句柄间接地对它们进行操作。

指针 vs 句柄:别问我是谁👺

在 Windows 编程中,句柄并不能被指针替代。尽管在底层它们看起来都只是 32 位或 64 位的数值,但二者的含义和用途完全不同。

句柄本质上是一个“黑盒子”。你无法得知它内部究竟是什么——可能是一个索引、某种编码后的数据,甚至可能是一个指针——但这些实现细节完全属于 Windows 内部机制,程序员无法通过句柄直接窥探任何内核信息。

总结来说:出于安全性以及多方面的考虑,句柄是你与操作系统资源之间的“桥梁”。它不是资源本身,而是系统提供给你的唯一合法通行证。

最后,如果你想体验一下计算机底层知识的魅力,也可以看看阿布的《CPU眼里的C/C++》,深度感受 C/C++ 是如何撑起整个计算机系统的。⚙️

发表评论

长征号 Copyright © 2013-2024 长征号. All Rights Reserved.  sitemap