首页

说说x86架构的怪异之处

这事儿我得说说。 x86架构做了一些大多数现代处理器架构都没有做的奇怪事情,但是因为这一架构十分流行,广泛被使用在各行各业中,以至于人们觉得这些事情本来就是正常的,没什么好大惊小怪的。 那我想说的是:x86架构十分怪异。 x86架构只有8个通用计算寄存器,而其他的现代处理器所携带的寄存器都远远超过它。例如PPC,MIPS和Alpha处理器都自带有32个寄存器,而IA64架构则拥有128个。 x86...

Windows是如何利用超线程特性的

这个问题,取决于你所问的Windows是哪个版本?每个版本的Windows都不大一样。 请容我慢慢道来。 对于Windows 95,Windows 98和Windows ME,答案很简单:压根不会用到超线程。因为这些操作系统不是多处理器操作系统。 对于Windows NT和Windows 2000来说,答案是:连操作系统自己都不知道有超线程这回事儿。为什么?这两个操作系统是在超线程发明之前编写的。...

有些Bug直到某些特定的时间点才会出现

有这么一类Bug,它十分狡猾,一开始没有任何问题,到了关键时刻就会浮出水面。 我并没有亲自调试过这类Bug,但是我知道,一定有人碰到过。 在Windows XP开发时期,有一个Bug出现在了一款游戏中,而且这个Bug还挺有意思,它只会在你达到下一关后才会触发,并导致游戏崩溃。 经过漫长的分析调试,问题原因终于定位了。 话说这款游戏的开发者将视频数据计算工作在离屏缓冲区中进行,当计算过程完成后才会传...

VS2022 经过优化之后的空指针检测  

C++静态分析团队一直致力于提供各种工具来使开发者尽可能地编写安全的代码。感谢开发者的反馈和建议,我们添加了越来越多的代码安全检查规则并修复了一些对开发者影响比较大的Bug。 在本文中,我将简要介绍最新的一项实验性功能:空指针引用错误。我还会将这项新功能和现有的类似检查做一个对比,看看新功能到底”新”在哪里。 概述 从底层角度来看,我们实现了多个代码分析引擎。当然,这些底层...

为什么取消显示桌面不能总是恢复之前窗口顺序

有一位读者问过我这样一个问题:首先我在任务栏上下文菜单中选择”显示桌面”,这个时候,桌面上的所有窗口都最小化了,这个时候,我在选择”取消显示桌面”,所有的窗口又都恢复成之前的显示状态,但是,并不是所有的时候这些窗口都会保持它们之前的窗口顺序。为什么会这样? 我的回答是:确实会有这种情况发生,Windows这样设计的原因是:其他设计方案的效果会更糟糕。...

为什么在安腾平台上的页面大小是8KB

在x86架构的机器上,Windows选择将4KB作为页面的大小,因为当时设计操作系统时,处理器架构只能支持4KB的页面。(后来,CPU添加了对4MB的页面的支持,我记得好像是奔腾处理器吧,但是对于大多数人来说,这个4MB就显得太大了些) 在安腾平台(IA64)上,Windows选择了使用8KB作为页面的大小,而不是4KB。这是为啥? 这样设计主要是在两个竞争性目标之间做出某种平衡。大页面相对小页面...

如何将一个字节数组转换为System.String

因为某些原因,这个问题被问的特别频繁:我如何将一个字节数组(byte [])转换为一个System.String? (是的,你冒看错,我说的是和CLR相关的东西。如果你觉得有些意外了,抱歉了啊) 简而言之,请使用下面这个技法,直接传入一个字节数组,它会给你转换为一个string。 System.Text.UnicodeEncoding.GetString() 这个方法会将指定字节数组中的所有字节解...

注意:Shift按键会覆盖NumLock

也许这个事实有很多人还不知道,但是在那个箭头和数字共用同一个按键的那个年代,确实会发生如标题所描述的事情:Shift按键会覆盖NumLock按键。 如果NumLock按键打开(通常它就是处于打开的状态),然后按下一个数字按键的同时,按住Shift按键,这个时候NumLock虽然是打开的但是实际上它会被覆盖,也即:这个时候键盘输入的是一个箭头(或者其他方向导航按键),而不是你想要输出的数字。 同理,...

即使在计算机的世界,同时性也只是相对的

爱因斯坦告诉我们:同时性是相对的。也即:在不同的地点发生的两个事件,在一个惯性系里是同时的,但在另一个惯性系里看来却不是同时的。而在计算机的世界里,同时性也是相对的。容我慢慢道来。 有些开发者会问:”是否可以同时在一个线程里执行操作A而在另一个线程中执行操作B?”,下面是一些具体的例子: > X操作:关闭某个句柄,Y操作:使用这个句柄。 > X操作:在一个句柄上...

为什么BIOS里的时间是本地时间

尽管Windows NT内部使用的是UTC时间,但是BIOS里的时间还是本地时间,这是为啥? 原因有那么一些,其中一个原因就是为了保持向后兼容性。 在早期,人们经常在Windows NT和MS-DOS/Windows 3.1之间进行双启动。MS-DOS和Windows 3.1 在本地时间运行,因此 Windows NT也效仿,这样你就不必在每次启动不同的操作系统时,不断更改系统时间了。 当人们从W...