0%

这篇文章是用来总结 C/C++ 开发校招面试的笔记汇总,内容主要会涉及操作系统,计算机网络,计算机组成原理,编程语言,Linux,Git,多线程,数据结构与算法等等。这篇文章会持续更新,用作复习阶段的知识点梳理,也用作面试前的快速回顾。

阅读全文 »

在 Linux 上打开一个字符设备文件会经历哪些过程?这是一道非常经典的面试题,面试官之所以爱问,是因为这个问题如果想要回答好,至少需要掌握 Linux 系统调用、文件系统、字符设备驱动程序等模块的实现原理。下面我们就沿着内核注册字符设备驱动程序,到用户层打开设备文件,再到调用到内核的驱动程序,最后返回到用户空间这一过程,试着回答下这个问题。

阅读全文 »

mmap 内存映射是一个用户空间很常用的系统调用,无论是分配内存、读写大文件、链接动态库文件,还是多进程间共享内存,都可以看到其身影。内存映射,简而言之就是将内核空间的一段内存区域映射到用户空间。映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,相反,内核空间对这段区域的修改也直接反映用户空间。这篇文章力图从 mmap 在用户空间的使用,到内核空间的实现,再到驱动程序的编写,彻底搞懂 mmap 能做的一切以及实现原理。

阅读全文 »

之前的文章介绍了在虚拟机内通过用户态程序访问 ivshmem 设备的共享内存。在虚拟机之间或者宿主机与虚拟机之间通过共享内存进行通信的情形下,共享内存的两端必须依赖轮询方式来实现通知机制。这种方式是 ivshmem 提供的 ivshmem-plain 的使用方式。除此之外, ivshmem 还提供了 ivshmem-doorbell 的使用方式,它提供了基于中断的通知机制。

阅读全文 »

传统上,外设向 CPU 发送中断请求时,会通过物理总线(PCB上的丝印)向中断控制器发送电信号,中断控制器再进一步将中断信号发送到 CPU,这也是通过物理上与 CPU 引脚连接实现的。这就带来了一个问题,CPU 或 中断控制器的物理引脚总是有限的,设备却是无限的,想要让每个设备都物理上连接到中断控制器是不现实的,所以必须通过中断线复用/共享的方式来实现上述要求。在中断共享的情况下,CPU 收到一个中断信号,需要尝试运行所有共享该中断号的 ISR,这必然带来了性能上的损耗。而 MSI (Message Signaled Interrupt)中断通过基于消息的方式传递中断,从而避免了上述问题。

阅读全文 »

ivshmem(Inter-VM shared memory device)是QEMU提供的一种宿主机与虚拟机之间或多个虚拟机之间共享内存的特殊设备。这种设备在虚拟机内部表现为PCI设备,共享的内存区域则以 PCI BAR 的形式存在。最近项目需要基于 ivshmem 实现一个虚拟机之间的通信,这里记录一下自己从零学习的过程。这篇文章我们先从上层角度看看在虚拟机内部如何识别和使用 ivshmem。

阅读全文 »

前面的文章已经完成了 mqtt 协议所规定的所有报文的发送与接收功能,但是为了适应较差的网络环境,mqtt 协议还规定了断开连接后的网络重连功能。此外,为了满足 QoS1 和 QoS2 的通信要求,mqtt 也对消息的超时重发进行了规定。这篇文章,我们的主题就是实现网络重连和消息超时重发功能,也是 mqtt 协议入门系列的最后一篇文章。

阅读全文 »

有了上一篇文章提出的消息接收与处理架构后,我们很容易就能在其基础上实现 QoS1 和 QoS2 级别消息的收发了。这篇文章首先会分析 QoS1 和 QoS2 级别的通信过程以及 PUBACK、PUBREC、PUBREL 以及 PUBCOMP 四种报文的结构。最后,还是和以前的文章一样,我们会继续完善之前的代码,实现 QoS1 和 QoS2 消息的收发代码,并进行实战。

阅读全文 »