0%

在上一篇博客使用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的磁盘空间(其实还是不太够)才解决问题。

编译Linux内核

首先,尝试对内核进行编译,在编译前需要使用通过KConfig启动内核的调试配置。

下载内核源码

由于Linux内核代码量非常大,且由于国内网络大家都懂的原因,所以的下载内核源码是一项较为复杂的体力活动。

阅读全文 »

最近在项目中遇到需要在 NodeJS 中调用 C++代码的问题,在此略作总结。

主要方案

在 NodeJS 中,和其他语言编写的代码通信主要有两种方案:

  • 使用 AddOn 技术,使用 C++为 NodeJS 编写一个拓展,然后在代码中调用其他语言所编写的源码 or 动态库
  • 使用 FFI(Foreign Function Interface)技术,直接在 Node 中引入其他语言所编写的动态链接库

在对这两种方式进行比较后,发现这两种方式各有优劣。

首先,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++中,引用可以狭义地认为是某一个变量的别名,它本身是并不存在的。

阅读全文 »

自昨天下午看完《流浪地球》以后,内心久久难以平静。闭上眼睛后,大脑中出现的是流浪地球的主题曲《带着地球去流浪》和地球飞临木星时候大气交汇时那种磅礴而又难以用语言形容的场景。


(如果不能播放可以点击这里跳入网易云音乐播放)

这首歌里,一面是曹操的《观沧海》,描述了人类面对这个世界所发出的赞叹,描述出了大好河山的雄伟壮丽。而另一方面,又进行了古今对比,更体现出这场星际旅行的悲凉与无奈。伴着这首歌,我就知道必须要写些什么了。

回忆

不知不觉,我进入了一段回忆,我可能是在想我是如何与科幻结缘,我又是对《流浪地球》有着怎样的期盼。

阅读全文 »

Intro

倏忽之间,又过去了一年。是时候向 2018 说一声再见了。

今年,我只在写 年关随笔 时立了一个 Flag,要练习深度写作,至少每个月输出一篇文章。可惜因为暑假时候偷懒,这个 Flag 也并没有达成。不过,我还是要在 2019 重新立起这样一个 Flag —— 2019 年每个月至少输出一篇文章,可以是技术,可以是随笔,也可以是观点。希望明年这个时候再回来看,不要像今年一样打脸。

再说回 2018。这一年相比前些年,在我的努力下,节奏逐渐慢了下来,让我有了许多时间静下心来思考、做事,也有时间和爱人相处、与朋友侃大山(至少在十一月之前是这样的)。同时,这一年又并不像以往那么顺遂,让我明白了人力有限,世间有太多力所不能及之事。

时光·记忆

在大自然面前,没有什么是能够永恒的。人不能够,事不能够,城也不能够,甚至文明也不能够。

阅读全文 »

问题 1 键盘弹起后会遮挡键盘上方的内容

在微信浏览器中,如果需要模拟一个类似微信聊天的窗口,那么一般情况下需要将输入框使用 fixed 定位放置在页面最下方。就像这样:

但是,在 IOS 中的虚拟键盘和 Android 里是不同的。在 IOS 中,虚拟键盘弹出以后,键盘上面的输入提示会比键盘弹出慢半拍,所以就会导致输入法的提示框将正常页面挡住的情况。

阅读全文 »

现在,Docker 已经成为了一个非常主流的虚拟化技术,它集合了 Linux 中的许多虚拟化技术,如 Namespace、cgroup 和 AUFS 等等,所以我们可以使用 Docker 搭建一个开箱即用的虚拟化容器。但是,Docker 网路在很多时候依旧不能满足应用场景中的需求,这就需要我们对 Docker 中的网络进行自定义了。

这篇博客就是关于位于不同虚拟机中的两个容器实现 vxlan 通信的实验。

拓扑和环境

首先讲一下实验拓扑吧,它大概长下面这个样子。

一共两台虚拟机,在两台虚拟机之间使用交换机连接。在虚拟机内部各有一个容器,容器和主机通过 bridge 连接,而这两个虚拟机之间需要通过 vxlan 进行连接。

阅读全文 »

intro

上学期同Thesharing以及 Stone 去北大旁听了将近一学期的《科技创新与创业》(课程网站:http://net.pku.edu.cn/dlib/pkuxstart/)。 这个课程由百度七剑客之一的雷鸣主持,邀请了很多行业内有名的企业家来讲课,几乎都是北大校友(感慨一下北大校友文化真的很棒)。 我想在这篇文章中总结一下他们所讲的一些能引起我思考的观点和内容,以及经过我提炼加工所得到的结论。

三角关系

这里的三角关系并不是指恋爱中的那种复杂关系,而是指一个行业中相互制约的几个要素之间的复杂关系。其中一种要素发生大的变化(一般是非连续性的),这个产业整体以及几个要素之间的相互关系也会随之发生变化,这往往预示着新机会的到来。

微博 CEO 来去之间举了一个例子——移动互联网中存在的三角关系:运营商、手机制造商和互联网公司。 这个三角关系中某个要素发生变革就会导致移动互联网行业的巨变,会有一波新的公司起来。比如运营商 4G 网络的普及,使得网速变得越来越快,流量变得越来越便宜,这就催生了短视频行业的兴起,这也催生了一系列的公司和产品,比如快手和抖音。

阅读全文 »

最近得知《青年马克思》上映,觉得有必要一看。于是上网搜了一下院线的排片,不出所料,排片量几乎是最近热映的《复联 3》的五分之一,甚至周末都少有商业影院有排期。于是只能等到周一约上阿文,去附近的影院一睹青年时期马克思的“芳容”。

刚入座,还在和朋友聊最近的中兴联想发生的一系列事件,电影就毫无防备地开始了。此时一个大概容纳五六十人的小影厅里只稀疏地坐着六七个人,多数还是学生(祖国未来还是很有希望的嘛)。

电影里的场景暂且不表,先来说说我对电影整体的感受吧。 首先,作为一部传记电影,而且讲述的是一位思想家的成长历程,如果没有一些对马克思生平以及思想的了解,可能就会在电影院呼呼大睡了。这可能会是观影的一个门槛。

其次,电影内容很丰富。短短不到两个小时,电影讲述了马克思从莱茵报编辑,到论战蒲鲁东,最后是完成《共产党宣言》这三个时期,同时又穿插了马克思与燕妮之间深沉的爱,马克思同恩格斯之间深切的友谊以及恩格斯同玛丽之间跨越阶级的感情。

阅读全文 »