Recent Posts
-
2019-12-07
Dive into eBPF (4): map-用户空间与内核空间沟通的桥梁
本文是来回答 Dive into eBPF(2)中提到的第3个问题,即: Q3:用户空间和内核空间的程序是如何通过 map 进行通信的 ?为什么用户空间要和内核空间程序通信呢?答案是:我们将内核程序灌入内核并运行,很多时候还需要从内核提取信息出来,而 map 则是 eBPF 提供的一套通信机制。如下图所示,map 是一个驻留在内核空间的K-V数据库,内核程序将运行的结果存入数据库,而用户程序则通过系统调用将结果读回。接下来依然通过 sockex1 这个例程来看看 map 是如何工作的?m...
-
2019-12-02
Dive into eBPF (3): 虚拟机程序执行的时机
在 Dive into eBPF(2)中,我们通过例子了解了 eBPF 程序是如何被 load 到内核的,而本文将回答上一篇文章中的第 2 个问题,即: Q2: 内核指令何时执行,执行的上下文是什么?先给出答案:eBPF 程序指令都是在内核的特定 Hook 点执行,不同类型的程序有不同的钩子,有不同的上下文将指令 load 到内核时,内核会创建 bpf_prog 存储指令,但只是第一步,成功运行这些指令还需要完成以下两个步骤: 将 bpf_prog 与内核中的特定 Hook 点关联起来...
-
2019-12-01
Dive into eBPF (2): 将虚拟机程序载入内核
在 Dive into eBPF (1) 中,介绍了 BPF 的来源。在本文中,我们将开始 eBPF 的旅程。extended BPFeBPF (extended BPF),是 Linux 内核对 BPF 的扩展。为了与传统的 BPF 更好地区别,传统的 BPF 现在被命名为 cBPF (classical BPF)。eBPF 与 cBPF 相比,有以下两个重要的改进: 首先, eBPF 的功能更加丰富。除了具有 cBPF 传统的报文过滤功能外,eBPF 大范围扩展了使用场景,比如性能测...
-
2019-11-30
Dive into eBPF (1): 从 BPF 说起
近来将 eBPF 研究了一通,遂记录笔记于此文。BPF borneBPF 是 extended BPF 的简称,而 BPF 的全称是 Berkeley Packet Filter, 即伯克利报文过滤器,它的设计思想来源于 1992 年的一篇论文PDF。最初,BPF 是在 BSD 内核实现的,后来,由于其出色的设计思想,其他操作系统也将其引入, 包括 Linux , 有意思的是,Linux 最初将它的实现命名为 LSF (Linux Socket Filter),看上去是想将它与 Berke...
-
2019-11-14
什么是透明代理
引多年前还在学校读本科时,为了节省网费,常去内网论坛用虚拟货币”买代理”,然后就可以用它外网了!对于一个穷学生,真是莫大的福音!多年之后,在工作岗位上,我竟然再次与代理产生了联系。那就索性总结一下吧。不过本文依旧是科普性质,与工作内容无关:)什么是代理本文的题目是透明代理( Transparent Proxy ), 所以我们必须首先搞清楚什么是代理。假设 A 与 B 要通信,如果它们之间有一个中间人 C 当传话筒,那么 C 就是代理。我们常常还会听到两个词叫前向代理( Forward Pr...