【比特熊故事汇】6月MVP英雄故事|技术实践碰撞境界思维

微软中国MSDN 2022-06-24 10:00

大家好!我是爱吃、爱玩、更爱学习技术,IT届的新晋网红,开发者的好朋友——比特熊!


比特熊:夏天不能少的一项活动就是追《怪奇物语》了,这季可太好看了,搓搓手等季终结局了。



比特熊:大家看到本期直播的Banner颜色是不是能猜到这次的嘉宾和Visual Studio以及C++有关?没错!这次比特熊请到了我们的微软MVP毛利老师以及英特尔特邀来的专家张银奎老师!



比特熊故事汇】作为比特熊直播间的重要栏目,定期请来技术大牛和行业先锋做客。这里不仅讲最“热”的技术,还有更多待解锁的个人故事和趣味话题!请持续关注,更鼓励大家推荐你想认识的“英雄”。欢迎大家来到直播间,跟比特熊一起,与专家们零距离畅聊。

欢迎大家访问MSLearn学习平台

与比特熊一起规划学习路径,加速进阶


毛利

致力于编写使用最少的语法特性和第三方库的紧凑实现


▪微软MVP - Windows

Development

▪C++开发工程师

▪擅长C++Windows应用开发


个人网站:http://mouri.moe


张银奎

正心诚意,格物致知


▪格蠹科技创始人

▪前英特尔亚太研发中心高级架构师

▪擅长系统软件、调试工具


《软件调试》《格蠹汇编》作者


比特熊:在技术分享和MVP英雄故事前,想问问两位老师在电影或电视剧里有没有崇拜或者憧憬的人物?IT圈子里大家都比较熟悉的灵魂人物也行。


张银奎:可能和年龄有关,我喜欢的比较偏重中国传统文化,比如周润发演的孔子,还有中国历史上另一位著名思想家——朱熹,可惜朱熹还没被拍成电影,至少没有太有名的。


毛利我个人的偶像是Windows现代内核即Windows NT之父大卫·卡特勒,我非常佩服他,他今年80了,依然在一线岗位进行高强度项目开发。我希望自己也成为这样的人,能一辈子写代码,把代码写到人生的最后一刻其实也是非常不错的一件事情,把自己之前开的坑都负责任地填完,算是我的人生理想之一。


比特熊:毛利老师“终身写代码”的决心令人敬佩,毛利老师也是我们的微软MVP,下面有请毛利老师开始技术分析。


毛利我今天主要讲的是如何使用现代Visual Studio C++ 工具链改善实际项目开发中的体验,今天主要从XAML入手,然后谈到UEFI,虽然这两个名词跨度有点儿大,但我相信通过接下来的讲解可以让大家非常平顺地转换概念。


去年九月份我创建了一个文件归档工具NanaZip,做这个东西的原因是去年6月份的时候Windows 11发布了第一个预览版,然而过了两个月,我却还没看到第三方的适配Windows 11文件资源管理器新式上下文菜单的文件归档工具。我自认为是一个专业的Windows桌面应用开发者,肯定要跟进最新的Windows,但如果我升级到新的平台,却在右键菜单里没法用压缩工具的话,生产力会大幅降低。



于是我8月31号创建了NanaZip这个项目,通过一个月的开发火速上线,在这种情况下帮到了一些人。NanaZip是7-Zip的衍生版,7-Zip本身是一个非常传统的Windows桌面应用,所以这是一个非常好的例子,讲述如何把一个传统的应用,逐步进行现代化的时候遇到的一些问题以及解决方案。比如我们创建一个Windows应用程序打包项目,试图去打包的时候大概率会出现找不到你写的动态链接库。



主要原因在于Windows应用程序打包项目默认情况下会把你的每一个项目生成的文件单独存放在每一个文件夹里面,这个问题的解决方案比较简单,在应用程序打包项目配置文件中上方添加下面的内容即可解决问题。



当我们要对一个传统桌面应用进行现代化的时候,必然会使用Windows Runtime接口去武装自己的传统应用,我们一般推荐使用NuGet 版本。Visual Studio C++项目里面,NuGet版本用起来挺不方便的。当然,如果你用.NET,就会发现.NET项目里面是支持Package Reference特性的……如果你希望在使用XAML的情况下,还能使用Visual Studio设计器来时来修改界面的话,为了编译能够成功,我们还需要加入以下内容:



详细信息可以阅读NanaZip实战案例这里自用的MSBuild的配置里面的实现。



为了实现NanaZip从 2.0 开始使用XAML Islands进行现代化的承诺,我根据自己的实际情况出发,需要先做两个项目以探明XAML Islands的边界,其中一个界面比较简单的项目是个文件传输工具,即开源的 aria2 前端 NanaGet,我以NanaGet为例子讲解如何在 Visual Studio 下较舒适的使用XAML Islands进行开发……为了能够使用UWP的或者是XAML Islands的现代资源文件,我们需要引入PRI文件的生成……



因为现阶段Windows App SDK 中的Windows UI Library 3 并不支持和Win32 HWND进行互操作,如果要做的话需要用到非公开且经常变动的接口,但XAML Islands由于可以把 XAML 内容当作一个Win32 HWND 进行操作,于是就没有这个问题,这也是我目前不使用Windows App SDK而选择XAML Islands的原因,并且我觉得XAML Islands是一个比较好的一个方案。


张银奎:今天我想跟大家分享一下我对于软件调试技术的经验和想法。今天元宇宙这个词很热,我理解所谓的元宇宙其实就是比特的宇宙,是二进制的宇宙,比特熊直播间这个名字取得非常好,我们今天其实已经生活在一个比特的世界里了。这次为了直播呢,我画了一个很特别的架构图,模仿了宇宙天体关系图。宇宙是大的套小的,几乎无限对吧?软件世界差不多也是这样。最下面是硬件世界,比如基于英特尔的x86架构、386486奔腾之类,酷睿之后,英特尔喜欢用美国国家公园的名字来命名新的处理器微架构,比如这个Skylake, Ivy Lake, Tiger Lake, Alder Lake,比较新的第12代就是Alder Lake啊。我很喜欢这个命名方法,让我们可以展开想象的空间。



硬件世界上就是软件世界,有固件——刚才毛利老师提到的UEFI,再往上有虚拟化、云,Hypervisor (VMM)。那Hypervisor内部又包含虚拟机内部的Supervisor,就是我们传统说的操作系统内核,操作系统上面也有环境子系统,比如我们今天的Windows其实也是可以跑Linux的。Windows操作系统里有传统的Windows程序,Windows程序里又细分成.NET和CLR的……今天又有很多容器技术,这个世界任何一个点,深挖起来都非常复杂,刚才毛利老师分享的Visual Studio的一些开发技巧,任何一个点都会让我们困扰,说搞不定卡在那里。今天我想给大家讲讲,如何理解这样一个纷繁复杂的世界。



我现在给大家展示的是英特尔十一代的Tiger Lake的移动版本,既包含CPU又包含GPU。中间蓝色这一块可以看做是CPU的核,右侧是GPU的核心,我在英特尔最后的五年,就在英特尔的GPU团队。无论是CPU还是GPU,都是个人力量无法对抗的复杂度。远远超出个人甚至一个小团队的控制力,所以需要大规模团队,大规模团队还要依赖一些外部条件,整个产业的充分协作,软硬件的协作。面对这样一个极其复杂的软硬世界,对于个人技术的工程师来说,应该怎么样看,引用我非常喜爱的朱熹的一句话就是“千头万绪,终归一理”。当我们深入看硬件和软件的时候,任何一个小的点,都很复杂,在有限的人生不可能完全理解,如何能快速掌握一些规律,才能快速地攻克它,所以要找到“一理”。长话短说,归纳成四个字——上调试器。


我们使用以调试器为核心的调试工具,来快速穿透到我们想理解的关键点。那怎么来深刻理解它呢?需要很多实践的体会,才能转换成我们自己的方法论,我2003年加入英特尔的时候,没想到会在英特尔做这么久,一做就是13年。英特尔有太多我舍不得离开的地方,非常宽松的工作环境让我有时间在英特尔工作的时候还能写一本书,《软件调试》第一版有1000多页, 100多万字,那几年在英特尔工作的时候,我晚上基本不加班,所有业余时间都投入到写书上来了,《格蠹汇编》也是在英特尔工作期间写的。



但是想学好调试技术也不容易,原理加实践,左一脚右一脚,才可能实现深刻认识软件的目标。我今年已经50岁,国内很多同行觉得这个年纪已经不适合做技术,但我仍然坚持做技术,大家看桌面就完全还是一个程序员的桌面。我这里打开一个虚拟机给大家演示一下……我推荐大家用调制器穿透到你最想理解的那一部分,比如说我现在把内核中断下来,可以快速理解最关键的一些概念,每次停下来大家最先看到的就是所谓的CPU的寄存器上下文,计算机系统遵循一个最基本的原理,就是图灵所开创的基本原理,它的状态是有限的。从CPU的角度来说它的有限状态就直接体现在寄存器上下文,对CPU来说最核心的就是寄存器,我们现在看到的x86经典架构,有一个非常好的优点就是易于学习。它的寄存器数量非常少,如果把同样的ARM断下来,你一下子看到30多个寄存器,但是我们经典x86只有8个通用寄存器,加上一个程序指针。

我们现在停的是什么位置,为什么在这个位置停下来呢?可以执行K命令看他的执行经过,这是内核里的一个著名的线程,idle进程。我说CPU一上电就要奔跑,要取指令,当没有指令执行的时候,因为我这个虚拟机比较空,CPU就会到idle进程里来打盹,进入一个低功耗状态。所以我给他一个break那它执行一个著名的int 3指令,中断调制器接受审查,就可以看到CPU现在很空,在执行idle循环。



现在给大家运行一个我写的软件,叫“I’m Buggy!”,专门模拟各种错误。调试器你可以认为它像一个幽灵,始终监视着我们的计算机系统,计算机系统的任何关键事件都会汇报给调制器,这是操作系统内核设计,CPU硬件或者设计整个软件世界所遵循的一个基本原理。我们今天所谓的计算机科学,其实称的上科学的东西是不多的,大多数都是细枝末节,各种code,那我们今天能称的上科学的东西就是图灵创建的有限状态机的思想。

我现在模拟一个错误,Load一个驱动,著名的空指针。一点空指针立刻断下来了,因为软件和硬件一起约定,有些空间是不可以访问的,比如说地址0,整个0号页都不可以访问,整个CPU是在保护模式下执行的,这个时候它有一些潜规则。我刚才故意触发空指针,内核立刻报警。我们发挥强大的调试器的威力,就可以看到它的来龙去脉,这里大体看到说是一个叫RealBug的内核模块触发了空指针。我们也可以u,r命令来看执行的指令的上下文,这是一条x86的mov指令,mov指令就是赋值,直接地址0写1,是故意的一个空指针。这个一执行CPU报警报给操作系统内核,操作系统内核报给调试器,因为我在调试,如果不带调试器就蓝屏蓝掉了。



刚才我是用虚拟机给大家做演示,我在实际工作中有大量的调试装备,这都是大大小小的x86系统,又分成不同的版本,有的是专门用来调试Hypervisor,有的是用来调Windows 10、Windows 11的。那稍微归纳一下,我对基础部分的一个分享,引用王国维的一句话就是“有境界自成高格”……文学作品是有境界的,电视剧也是有境界的,第一个镜头就给你境界,到底是硝烟弥漫,还是绿水青山。软件也有境界,就像我刚才一个断点停在那里,看现在是在内核模式还是用户模式,是在执行.NET还是在执行Java代码,立刻就区分现在CPU在做什么。所以我们一定要建立这样的境界思维……要抓住这个境界,进入场景才可以深刻思考。


比特熊:大家知道张老师做技术的时间很长,从业经历非常丰富,下面有请张老师分享一下自己的创业经历。



张银奎:我的创业故事从手边的一把扇子讲起,朱熹做了一个最大的贡献,就是把我们中国的文化提炼成了四本书,第一本叫《大学》(虽然不是朱熹写的),只有205个字,一个扇面就可以放下。这把扇子是我创业的团队做的,做了几百把,用安徽宣纸。第一句话是“大学之道,在明明德”,“明明德”就是我创业最发自内心的一个想法。我创业的主要做的一个平台,就是“盛格塾”,目标就是通过这个平台把互联网技术传播出去。



刚才毛利老师也提到,内核之父大卫·卡特勒。他的这张照片大约是两年前拍的,今年他已经80岁,我非常佩服。他是我现代的人生偶像,通过邮件我感受到过他内心的光明。比如我们看卡特勒这张照片,都有一种力量,80岁高龄的人坐在那里写代码,和一个80岁的人躺在病床上,给我们的感受是不一样的。我创业的所有产品都带着这样的思想,这是2020年第一批GDK7上面印的这个钟馗,因为钟馗专门抓鬼,祛除人间的邪恶,所以我的所有产品上面都是钟馗的Logo。



GDK7是基于英特尔的DCI技术,可以在没有软件调试器的情况下直接从硬件层面把系统中断下来,找一些流氓软件、病毒,这种方法非常彻底,任何软件调试器都可能被流氓软件所绑架,所以我们这款产品得到国内许多研究安全的同行,尤其是偏底层的同行的喜欢……我们最新在做的“挥码枪”,是一种更小巧的调试器,适合随身携带。

那创业是否赚钱呢?坦白说我真的不太在乎,所以我现在也没有用投资,投资人可能会给我压力,我现在随心所欲来做自己喜欢做的事情。


比特熊:我们在开篇介绍了毛利老师是一位新晋MVP,请问毛利老师为什么要加入MVP大家庭呢?


毛利原因非常简单,我最早接触计算机的时候,看的第一本关于Windows的启蒙书籍就是两位MVP写的,他们是彭爱华和刘晖,这本关于《Windows Vista 使用详解》的书我翻了不下50遍。我一直对他们非常憧憬,也希望有一天能成为MVP。后来我也了解到,如果某天不小心进入了微软,MVP就大概率拿不到了。所以对我来说,越早拿到MVP越好。即使我一不小心进了微软,至少也有做过MVP的经验,让我遗憾少一点,某种程度上是凑个大满贯的感觉。



张银奎:我也认识彭老师。盆盆!


比特熊:看起来彭老师很有名啊!希望以后也有机会可以请盆盆老师来我们直播间

比特熊:之前张老师提到自己喜欢看的电影,比如周润发的《孔子》,还有毛利老师,据我了解您跟张老师的电影“口味”也十分不同!

张银奎:我很喜欢周润发演的孔子,这个故事是从孔子人生最辉煌的时刻讲起,到他周游列国遇到各种艰难曲折。里面有一幕是孔子在讲课的时候,有人来捣乱,把大树砍倒了。还有很有趣的一个细节,孔子去见一位著名的美女南子,这场戏的矛盾冲突非常精彩。无论是人生还是软件,其实都充满了矛盾。


毛利我看电影少一些,一般看美剧或者纪录片。美剧的话强推《绝命毒师》,老白是一个不折不扣的大反派,但是我从他这边学到了一件事情。如果有机会去做自己喜欢的事情,那就要尽可能去做。我还想推荐一个纪录片系列,叫《巅峰拍档》(Top Gear),BBC讲汽车的节目。我从他们的表现中,看到了对汽车的热爱。我大学的时候,学的是汽车专业,但是我对汽车一点兴趣都没有。即使是这样的我,也喜欢看这个节目。如果一个人对自己的事业真的热爱的话,也能吸引其他原本对这件事情一点兴趣都没有的人。



比特熊:通过一个节目喜欢上了原本不太感兴趣的领域,如此有魅力的纪录片比特熊也要看看!



比特熊有话说

本期比特熊请来了从事Windows桌面开发的微软新晋MVP——毛利,还有擅长运用调试工具的英特尔特邀大来宾——张银奎!毛利长期应用C++做一些开发,所以他用实例分享了用 Visual Studio 开发 UEFI 应用程序和XAML Islands C++ 开发方面的一些使用技巧,也给我们大方地看了自己写的“家伙们”! 而张银奎老师有着多年行业经历和感悟,以特别“形象”的示意图讲解开场,应用很多有趣的举例,高饱和度畅谈了软件调试技术的多重价值。


两位嘉宾虽然在年龄和经历上都有一定“距离”,但是他们共同的偶像——NT 内核之父David Cutler,一直鼓励着他们追寻着自己“终身写代码”的梦想!比特熊还了解到毛利老师从2014年就投身开源(当时还是在校生),直到现在开源热情没有减,我们可以看到他做了很多事情,以他的话来说“填好坑”。在直播时还有很多毛利老师的“粉丝”和朋友持续支持,整场直播充满了积极沟通的氛围。张银奎老师推崇孔子、朱熹等文化名人,用其思想指导实践,在直播中引经据典,让比特熊在技术学习之余也享受了一场文化之旅。张银奎老师在工作之余种种田,而毛利老师喜欢骑着单车四处逛,观察他所生活的城市。即使两位经历和习惯如此不同,但谈到技术,两位对于自己喜欢的事业不惜力的付出和探索是高度一致的。比特熊也希望大家可以在自己喜欢的领域没有遗憾地追寻自己的梦想并享受这个过程!






比特熊与各位的消夏聚会告一段落啦!欢迎伙伴们把你想说的话告诉比特熊,可能会收到意想不到的惊喜回复哦!


Attention Pls!月末还有大事件!

满心欢喜,敬请期待!




扫描比特熊个熊微信二维码

加入【比特熊粉丝后援会】

与开发者一起嗨聊,期待成为你的好友~




点击「阅读原文」重温本次直播~

推荐阅读