已经是 2022-01-03T22:37:00+08:00 了,明天又要开始上班了,这篇文章一定要写了。

本来打算 12 月 31 号做这件事的,但当天在我原以为没人陪我跨年,而只能回家对猫发呆,并且写下这文章的档口,却找到了伙伴;于是吃了火锅,到家也就直接躺下了。

现实生活终究比屏幕里的字节层次丰富许多,因此,这些天也没有把写文章这件事特别提上 TODO 列表的很高位置。然而与此形成反差的是,我的生活、我的兴趣、我的激情,却几乎主要是围绕着这些字节展开的;也许新的一年,一方面要努力活得更“具体”一些;另一方面,作为我这一生永恒的激情所在,把字节的事情做好、讲好,也是我理所应当要做的。

由于众所周知的原因,许多人的 2020 和 2021 都在不知不觉中飞速流逝了,这当然也包括我。 当我与朋友在火锅店为菜点多了而少许抓狂的片刻,2022 就悄然降临了; 而我意识深处的 RTC 仿佛还停留在 2019 年的秋冬之际,又好像觉着 2021 年初发的朋友圈时间也显示“5 分钟前”。 有些在 TODO 列表上 linger 的事情终究是没有做,比如这个博客的前端主题终究是没有变化,有的坑终究也是失去了任何的心情去填。

事情的变化是很快的。

计划赶不上变化

2021 发生了很多预期外的事情。

LoongArch 逆向的故事

从 2020 年 8 月众所周知的 LoongArch 架构披露开始,我早就知道龙芯把东西放出来只是时间问题。但春节前后龙芯明明都把工具链给到厂商,厂商都编出来整个系统了,也没有开源工具链、开放手册的意思,这让我产生警惕。 多亏群友给我发了一串神秘链接(其实就是 Kylin 的软件源),我拿到了许多开源软件的 LoongArch 二进制代码,这让我可以逆向出 LoongArch 的大多数基础指令。这样一来,即便龙芯决定做那个“坏人”,学着以前的申威那样不把工具链、指令集手册放出来,社区也能独立地开展工作了。那时候也在本博客和贴吧开启了 LoongArch 指令逆向的同步连载。

在得到系统调用指令之后,由于理论上已经可以制作出(软浮点的)完整 userland 和 QEMU linux-user 模拟了,我决定将这些资料整理出来公布,这样可以尽早让更多人参与进来。这时是 3 月 11 号。 没曾想,在文档发布之后,群里的龙芯员工纷纷拐弯抹角地表示,我以一己之力扭转了战局:龙芯本来决定在 6 月的 3A5000 发布会上同步公开 LoongArch 手册,但我的逆向文档传遍了龙芯公司,于是一些人决定提前发布手册了。

这可好,“官方”都把东西放出了,那我还有什么必要去连载呢?!

从外界公开信息回头看,LoongArch 手册在 3 月 31 号发布了,而 3A5000 的发布会一拖再拖,最后似乎是低调处理,不开了;这似乎和群里的模糊信息可以对上一些。

而根据真正的手册对比逆向结果,确实,还是有很多地方弄错了;LoongArch 比起 RISC-V 果然还是更接近 MIPS,并且有一两条指令直接弄错了(sbs 是完全错掉了,另外应该还有一条,忘记了)。不过整数寄存器的用法部分全部蒙对了,r21 我压根就没见到过因此写了“不确定”,实际上真是个保留寄存器!这使我十分欣慰(哈哈哈哈)。

逆向文档中,32/64 位宽的指令都是按照 RISC-V “操作整个原生宽度/仅操作 32 位”这一维度区分的;但实际实现的仍然是多数传统架构的“仅操作 32 位/仅操作 64 位”维度区分。这对 64 位代码没有影响,但对 32 位的指令集子集有影响:以 addi 为例,MIPS 等传统指令集的 32 位实现只有 addi,64 位多出来一个 daddi;而 RISC-V 的 addi 在 RV32 上操作 32 位,在 RV64 上操作 64 位,相应地,RV64 多出来一条指令 addiw 即便是 64 位或更宽的原生宽度也只操作 32 位,RV32 不存在 addiw。如果按照我的逆向文档实现 LA32 核,这个核只会留下真的 addi.d 指令而不会有 addi.w,就跟现实世界不符了。

在此只是希望 LoongArch 逆向系列连载的读者们原谅这个被官方截胡而太监的家伙。

LoongArch 规范制定的故事

在逆向工作告一段落之后,龙芯也陆陆续续扭扭捏捏放出了 LoongArch 工具链和内核等基础组件的移植源码。

第一版的这些代码惨不忍睹,几乎就是 MIPS 代码复制粘贴之后批量替换字符串。由于“MIPS”是个缩略词,每个字母都大写,而在 C 语言等一些地方也有预处理器符号全大写的习惯,这就造成作为标识符的 MIPS 和作为自然语言单词的 MIPS 混淆的问题(相反,例如 AARCH64AArch64 就长得不一样)。茫茫多的自然语言中出现 LOONGARCH 的情况使人感到绝望,这种质量的代码不可能被上游接受,还可能在上游留下不好的印象;更令人担忧的是,MIPS 作为一个历史悠久的架构,背负的技术债之多,世所罕见,而宣传上“摆脱 MIPS 技术债”的 LoongArch 却因为拉胯的实现而一出生就背上相同的技术债,但凡 LoongArch 能活超过 5 年,我们都将成为历史的罪人。

因此 2021 年我接下来的大部分业余时间都在与这坨代码作斗争,有时战火甚至延烧到问题代码背后的思想、背后的人身上(如果我有因为 code review、提出反对意见等行为而冒犯到任何龙芯员工,我为我的不当言辞而道歉,但我不会撤回我对客观现实的观点)。在 binutils 纠正一些指令的误导性命名,给指令格式重新取名,重新整理汇编语法;在 Go 上游反对 GOARCH=loongarch64,反对基于 MIPS 代码形状写作新移植,甚至自己搞了一版 Go 汇编器移植;在 GitHub 围追堵截个别龙芯员工的 KPI 补丁,在各个完全不相干的上游苦口婆心解释这是个啥,为啥原作者的修改是不恰当(甚至错误)的,凡此种种,不一而足,说多了都是泪。

后来随着沟通的更加深入,也许也有意识到社区是“一块铁板”的因素,一些龙芯员工的行为也渐渐收敛,情况有所改观。在他们地盘的文档库,一些规范文本开始公开透明地起草了。这也是我下半年的主要(业余)工作场合。我推进了 v0/v1 寄存器别名的弃用、ABI 的命名、ld.so 路径的整理等等工作;规范行文的措辞调整和英语 fixes 更是不计其数。希望我的工作能让未来给 LoongArch 编写软件,以及在 LoongArch 硬件上工作的开发者们过得更舒心一些!

对业务失去兴趣的故事

众所周知,持续使用相同脑区会造成疲劳。一直以来,由于我的兴趣和工作都是编程,于是我显然必须在工作和生活中写作不同的代码,如果我不想由于过度用脑而脑浆炸裂的话。而我对领域知识建模,也就是所谓“业务逻辑”的兴趣,却比我想像更快地丧失了。

在毕业之前,我的“工作”是学术,而我当时搞的学术不是 NLP 就是 Linux 容器网络,都是些抽象的玩意;相比之下,成品有具体形状的 Web 全栈开发就成了一件陶冶情操的美事。相应地,当时面试通过之后,HR 跟我说有个“商业运营”的部门,比我面试的容器云部门更急缺人,是写业务的全栈工作,问我要不要去;我一想,整天都可以写业务,而我确实自从读研以来很少写业务了,换换脑子也未尝不可,就接受了。

在入职之后,我的工作是业务;尽管数据库中的表、表中的记录并不是十分具体存在可以触摸的东西,但仍然无比具体;客户操作的管理控制台、员工操作的管理系统,更是真正的具体存在。每个业务流程背后都是对应的人,甚至每个经营决策、产品形态设计的背后也是具体的人,以至于“所有相关方都离职了,所以需求直接不用做了”;“项目砍了,项目组的人要么换组要么走”这种事情都是合理的。(从开源社区工作的角度,事情和人不总是强绑定的,尤其“因为这个人不活跃了所以围绕这个人的事情都重新评估”这是不可理解的——哪里有“人不在了所以他说的话都不重要了”的道理呢?)

在这种情况下,由于长期做抽象的工作,不熟悉具体的玩意,我的兴趣也是持续了几年时间。但显然的一点是,由于每天大部分时间都换思考具体事情了,相比之下,成品没有具体形状的 Linux 底层工作就成了一件陶冶情操的美事。这些年来,我解锁了 Linux、glibc、Go 等等一堆项目的贡献成就,学了不少编译器开发调试的技能;在当代 IT 基础设施大厦的地基工作,很是有一种做“守夜人”、无名英雄的成就感。

但不清楚是何种原因(我至今也没有对这件事形成足够清晰的认识,可能 2022 也要花许多时间在这上面),从 2021 下半年开始,我对“业务”的兴趣急转直下:回顾近期开的所有坑,只要成品有界面的项目,无一例外,全部太监,一点都不想做;唯一有点人用的开源项目——企业微信 Go SDK,直接荒废掉了,使我一个“资深”开源参与者十分羞愧。

是因为今年搞 LoongArch 太多,导致一时间习惯了编译器、系统打包这种东西,而高级语言、前端那些知识在脑内都不活跃了呢?还是因为工作搞这种已经够多了,因为工作中遗留代码太多而痛心疾首,一心想着先把基础设施修缮好再弄业务,连带着业余的“业务”也不想做了呢?

虽然还没有思考得出确定的结论,但无论如何,业务这种事情是不能忘的。我们每天直接与之交互的产品、流程、人,全是业务,而基础设施,水电煤,也永远是为业务服务的,不存在为水电煤而水电煤的工程。可能自己不用经常去写,但我觉得对一个合格的基础设施人而言,始终还是要有一些业务的 sense,可以不写,不能完全不会,否则极大可能做出来的东西,那些“业务研发”用着是不爽的,是不想选型的,被逼着用了会背地里骂娘的。

搬家的故事

2021 年我被迫换了个地方住。房东的丈母娘在浦西的房子动迁了,没房子住了;小年轻跟父母住一起大抵是不适应的,于是显然结论是收回我住的房子给丈母娘一家自住,我只能再找了。

疫情以来,许多一直就做的事情都改换了一种形式再重新被实践,这当然也包括看房。疫情之前就有一股“VR 看房”、“AR 看房”的歪风邪气,就是在中介机构的手机 App 上可以像某某地图全景一样,360 度旋转看事先采集好的房源景象;有的据说还加入手机传感器支持,拿着手机上下左右转一圈就可以了,像星空地图一样。我个人对这种资本炒作行为一向非常反感,尤其对看房这件事更是如此,手机阅览能比得上实地感受吗?手机可传不来房间里的潮气、角落的灰尘与水渍、橱柜的内部,还有上下左右邻居的轰鸣。

于是我就花了一些时间看了四五套。我想着有一套是真好,但另一套也不错;中介一个劲跟我说“尽早定下来”,我就不急着回。我是知道的,这是销售套路:营造出一种“手慢无”的氛围,别管你看的货是不是真抢手,你一紧张起来就输了,就满足营销心理学一堆后续套路的前置条件了。后边过了大概 3 天的样子我问那一套还在吗,结果就是当天晚上就租出去了,那租客当时人甚至在武汉还没来上海,微信看了俩视频就付款了……

我大受震撼,现在年轻人对自己住的房子都这么漫不经心了吗?我完全无法理解。但身处这个傻叉的“内卷”之中,我也很无奈,我必须自己也变快否则再过两周我就要睡大街了——最后只好在一个精疲力竭的下午,加入了“微信看房”一族,就是中介自己到房源之后跟你开微信视频,你告诉他看哪,他就把摄像头指哪,选中了目前住的这一间。(当然,后续肯定到现场看过,才正式签约了。)

世博园是个好地方,当我有天晚上六七点路过耀华路地铁站,看到世博会中国馆的红色灯光照亮半个天幕,而快乐的大妈大爷们在这天幕下随着音乐起舞,一时整个思绪为社会主义浪漫所覆盖——我们全部的经济建设,“端到端”地,难道不应该就映射到建设者们的快乐吗?你创造了你时代的价值,你理应享受这快乐!

人的主观能动性(也可以理解为“精神力量”)之强大,超乎许多人的认知。这个世界上其实大多数东西,你觉得它不合理,你无视它,它还就真影响不到你了,正所谓“眼不见心为净”、“君子远庖厨”等等是也;但主观能动性的作用范围也有极限。例如多数人相信微信看房,就使得你不微信看房效率就低,就抢不到好房子住;这时候你再怎么内心否定微信看房这个天才发明,终究没有用了。

那些仍然拖延着的东西

2020 和 2021 都浑浑噩噩过去了,有许多事情一直想做,结果还是没动静。

以前一直嚷嚷着要上个 Gentoo dev 彰显一下技术实力以及方便做一些龙芯适配的工作,结果一直就是没时间。Overlay 里写了茫茫多的适配补丁,就是懒得往上游发。

打算把房间好好收拾一下,但经过被迫换房子这个事情之后发现前期收拾越干净(箱子越少),后期装箱就越蛋疼,结果搬家之后所有箱子基本还是原样堆放在房间各个角落。(猫猫倒是对此表示强烈支持,到处都是猫抓板,随时随地都可以抓了)

由于“时间管理”的技能不佳,业余搞龙芯的时间往往都超预期,也导致个人的身材管理十分糟糕,肚皮上出现了一圈不该出现的东西。事实证明 maimai 这个游戏虽然有氧运动,但只对一些部位奏效,对其他部位是没有用的。

因为这一年疫情一直反反复复,想去的许多城市终究是没有去,许多演唱会终究也不会发生。某种程度上也是辜负了目前租房区位选择的考量(“去哪都近”),真心希望 2022 这方面能改善许多。

至于一直想着重新开始自己做饭,这个倒释然了,从“拖延列表”上划去了——在我看来,“做饭”是中国文化最为珍贵的执着之一,它上面承载了太多太多;通过亲手制作一餐饭,主要适合表达的东西是对干饭人的爱与尊敬,对友情的讴歌,对自然的赞美;而我自己显然不配(笑)。说到底,买菜半小时,备菜半小时,制作 15 分钟,刷锅刷碗半小时,前前后后忙活将近 3 小时才对应吃 15 分钟;如果不是为重要的人制作,那我自己永远会点外卖。

那些实现了的东西

尽管我大盘上的 2021 是像上面一样,整体充满了挫败感的一年,但也不妨碍从这样的一年里精心挑选出几个亮眼时刻(再次笑)。今年(去年)还是做了不少事情的:

  • 向 QEMU 提交了 LoongArch 的 TCG 移植,成为了一名光荣的 QEMU 维护者!
  • 跟猫猫进一步搞好了关系!虽然还是会被抓挠,但历史性地,可以有限地摸猫肚皮了,猫猫有时也亮出肚皮睡觉了,这说明它开始信任我了!
  • 成功(一波三折)完成了工作站的升级,3990X 编译是真的快,使我的业余工作如虎添翼,这钱花得值!
  • 在意识到自己已经不可能进入民航行业成为一名飞行员(tl;dr: 又矮又老),但自身经济实力已经足以支撑模拟飞行的爱好之后,迅速行动起来,对 XP11 平台 C172 的飞行已经有所熟悉,中英文陆空通话也有了基本了解;
  • 对自身形象的重新思考与设计有成效,2020 年以来使用的发型给我的社交活动更添助力;
  • 工作上,在遗留系统的文档生成、迁移演进方式等方面都做了尝试,小范围原型都做出来了,预计 2022 将有决定性的突破。
  • maimai DX 国服分数上了 7300 分,会打最简单的 Lv.14 了!虽然还是本机厅进步最慢选手,但平心而论我也没在这游戏上花其他人那么多精力,何况认识的朋友是真得多!
  • 由于团建减少的原因,狼人杀打得不多,但当战犯的次数明显减少了,好像这个游戏又会玩了一样!

每件事情单拎出来,我都可以乐呵大半天,这样一想,好像心情的阴霾也一扫而空,就雨过天晴了一样。

于是乎,也就有心思去畅想一下 2022 了。

Flags for 2022

希望 2022 的我能成为合格的 A320 模拟飞行驾驶员,能有资格加入 VATSIM 的大家庭,认识更多的好朋友;

希望 2022 的我能正式成为一名光荣的 Gentoo developer,为这个陪伴了我 11 年的发行版做一些力所能及的事情;

希望 2022 的我能在 B 站拥有 10000 名粉丝,我的视频能冲破 10 万播放,让光荣的基础设施工作为更多人所知,用“合理性”与“常识”影响这个行业的更多人;

希望 2022 的我,要么能调整好对业务研发的心态,要么能转变工作职能而专职负责基础设施,甚至换组去做 QA 或者 GoPlus,重新在工作中找到热情;

希望 2022 的我,maimai DX 能上 7400 分,希望能至少 S 一首 Lv.14+ 的歌曲;

希望 2022 的我,能飞向我们国家的 10 座城市,吃 10 种美食,踏 10 个巷子;

希望 2022 的我,能减少折腾龙芯的时间,而重新开始撸铁;

希望 2022 的我不会辜负这最后的 29 岁时光。

这熊熊燃烧的青春火焰啊,是自然的赞歌,是生命的绽放,好像这世上所有的原子,都设计为在此刻欢聚一样。

(希望不要有人发现“翻新本博客的页面主题”被我悄悄从 TODO 列表划掉了,笑)

– WANG “xen0n” Xuerui 于世博园周边地区

2022-01-04T01:08:10+08:00