时间很快,如今已经是2021年伊始了。虽然已经很久没有写过文章,但是,面对2020年,我总还纠结着要说些什么。
2020最大的主题就是变化。不仅有意料之中的变化,更多是意料之外的变化。
疫情
说到变化,总也绕不过的就是疫情。
我的2020年是以一次滑雪作为开始,在那场滑雪之后,我还在畅想在结束毕业论文写作之后,毕业前的时间我应该怎样度过,是要趁着有闲逛上大半个中国,还是省一些钱躲在实验室里啃啃买来一直没读的大黑书。
在上一篇博客使用Qemu和GDB对Linux内核进行调试中已经介绍了使用Qemu和GDB对Linux内核进行调试的方法,但是GDB调试对于用惯了GUI工具的人(比如我)来说并不是很直观,所以就希望尝试使用比较熟悉的GUI编辑器,如VSCode,对内核进行调试。
由于VSCode的调试方式同样基于GDB,所以需要先在GDB中测试没有问题。
需要在VSCode的插件市场中安装微软官方的C/C++插件,该插件可用于IntellSence和GDB调试。
为了使VSCode支持内核的调试,需要配置launch.json,特备注意需要配置setupCommands
属性,以便在GDB启动后对其进行设置,大致的配置文件如下:
使用Qemu对Linux内核进行调试是一种较为便捷的方式,近日进行了一番实践,并将大致步骤与其中一些小坑记录了下来。
由于放长假赋闲在家,所以手头只有一台装有MacOS的MBP可用,而Linux内核的开发与调试使用Linux环境下会比较方便,所以就使用VMware Fusion创建了一台安装有Ubuntu 18.04系统的虚拟机。由于编译Linux内核及相关软件需要的资源较多,所以为虚拟机配置了双核CPU、2GB内存和20GB磁盘空间(笔记本本身资源有限),但实际使用(特别是物理内存和硬盘)捉襟见肘,于是又在系统中添加了3GB的SWAP内存并扩容了20GB的磁盘空间(其实还是不太够)才解决问题。
首先,尝试对内核进行编译,在编译前需要使用通过KConfig启动内核的调试配置。
由于Linux内核代码量非常大,且由于国内网络大家都懂的原因,所以的下载内核源码是一项较为复杂的体力活动。
最近在项目中遇到需要在 NodeJS 中调用 C++代码的问题,在此略作总结。
在 NodeJS 中,和其他语言编写的代码通信主要有两种方案:
在对这两种方式进行比较后,发现这两种方式各有优劣。
首先,AddOn 技术比较通用,它可以使用 C++代码来拓展 Node 的行为,很多库都是使用这种方式来完成一些比较底层操作(比如和操作系统的一些通信)的。但是它写起来比较麻烦,要编写一个 C++项目,还要按照 NodeJS 的规范 export 相应的函数,而且每次安装的时候都需要进行编译(以适应本地 Node 的版本)。如果只是调用一个 DLL,那就还需要在项目里重新包装一遍 DLL 的接口。
如果使用 FFI 技术,限制就会比较多,首先,它只能调用其他动态库,如果你想使用 C/C++完成更多功能的话,还需要再封装一层 DLL,另外,它只支持_cdecl
调用约定(也就是 DLL 在导出的时候一定要标记用_cdecl
编译命令),不支持_stdcall
或者_fastcall
调用。但是调用起来就会很方便,可以直接在 JS 代码中声明 DLL 的接口就可以了。
综上比较,如果只调用第三方 DLL(而且恰好是_cdecl
导出),使用 FFI 就再合适不过了(虽然性能可能会有一定的损失,而且调试起来会有困难)。
其实,从理论上来讲,FFI 也是基于 AddOn 技术的,只是它可以帮你把在 JS 中定义的接口直接转换成 C 语言的接口,并利用 NodeJS 的 Buffer 内存,将其同载入的 DLL 共享。当然由于 FFI 的这种通用性,也导致了一定的性能损失。
下面就以在 Windows 平台上使用 FFI 为例,简单聊一下如何使用 NodeJS 和 C++编译而成的 DLL 通信吧。
引用是C++相对于C而引入的一个重要特性,它使得许多地方的语法变得更加简洁,但是它们的底层究竟是怎么实现的呢?
在Wikipedia中,对指针有如下介绍:
In computer science, a pointer is a programming language object that stores the memory address of another value located in computer memory. A pointer references a location in memory, and obtaining the value stored at that location is known as dereferencing the pointer.
从定义可以看出,指针从本质上来讲就是一个变量,其中所存储的就是其他变量的地址。 而C语言中的指针非常灵活,它可以任意指向某一个地址,不论这个地址究竟是否存在,或它究竟存储的是否为指针所代表类型的数据。
那么也不难想到,指针在实现的时候也是内存里的一个变量,它存有其他变量的地址。
在Wikipedia中,对引用有如下介绍:
In computer science, a reference is a value that enables a program to indirectly access a particular datum, such as a variable’s value or a record, in the computer’s memory or in some other storage device. The reference is said to refer to the datum, and accessing the datum is called dereferencing the reference.
In the C++ programming language, a reference is a simple reference datatype that is less powerful but safer than the pointer type inherited from C. The name C++ reference may cause confusion, as in computer science a reference is a general concept datatype, with pointers and C++ references being specific reference datatype implementations. The definition of a reference in C++ is such that it does not need to exist. It can be implemented as a new name for an existing object (similar to rename keyword in Ada).
从上面的定义可以看出,在C++中,引用可以狭义地认为是某一个变量的别名,它本身是并不存在的。
倏忽之间,又过去了一年。是时候向 2018 说一声再见了。
今年,我只在写 年关随笔 时立了一个 Flag,要练习深度写作,至少每个月输出一篇文章。可惜因为暑假时候偷懒,这个 Flag 也并没有达成。不过,我还是要在 2019 重新立起这样一个 Flag —— 2019 年每个月至少输出一篇文章,可以是技术,可以是随笔,也可以是观点。希望明年这个时候再回来看,不要像今年一样打脸。
再说回 2018。这一年相比前些年,在我的努力下,节奏逐渐慢了下来,让我有了许多时间静下心来思考、做事,也有时间和爱人相处、与朋友侃大山(至少在十一月之前是这样的)。同时,这一年又并不像以往那么顺遂,让我明白了人力有限,世间有太多力所不能及之事。
在大自然面前,没有什么是能够永恒的。人不能够,事不能够,城也不能够,甚至文明也不能够。
现在,Docker 已经成为了一个非常主流的虚拟化技术,它集合了 Linux 中的许多虚拟化技术,如 Namespace、cgroup 和 AUFS 等等,所以我们可以使用 Docker 搭建一个开箱即用的虚拟化容器。但是,Docker 网路在很多时候依旧不能满足应用场景中的需求,这就需要我们对 Docker 中的网络进行自定义了。
这篇博客就是关于位于不同虚拟机中的两个容器实现 vxlan 通信的实验。
首先讲一下实验拓扑吧,它大概长下面这个样子。
一共两台虚拟机,在两台虚拟机之间使用交换机连接。在虚拟机内部各有一个容器,容器和主机通过 bridge 连接,而这两个虚拟机之间需要通过 vxlan 进行连接。
上学期同Thesharing以及 Stone 去北大旁听了将近一学期的《科技创新与创业》(课程网站:http://net.pku.edu.cn/dlib/pkuxstart/)。 这个课程由百度七剑客之一的雷鸣主持,邀请了很多行业内有名的企业家来讲课,几乎都是北大校友(感慨一下北大校友文化真的很棒)。 我想在这篇文章中总结一下他们所讲的一些能引起我思考的观点和内容,以及经过我提炼加工所得到的结论。
这里的三角关系并不是指恋爱中的那种复杂关系,而是指一个行业中相互制约的几个要素之间的复杂关系。其中一种要素发生大的变化(一般是非连续性的),这个产业整体以及几个要素之间的相互关系也会随之发生变化,这往往预示着新机会的到来。
微博 CEO 来去之间举了一个例子——移动互联网中存在的三角关系:运营商、手机制造商和互联网公司。 这个三角关系中某个要素发生变革就会导致移动互联网行业的巨变,会有一波新的公司起来。比如运营商 4G 网络的普及,使得网速变得越来越快,流量变得越来越便宜,这就催生了短视频行业的兴起,这也催生了一系列的公司和产品,比如快手和抖音。