在无BTF的内核中使用fd寻找关联的socket结构

上一篇文章讲了eBPF Tracepoint和Kprobe,这一篇文章我们来看一下如何应对无BTF的老版本内核,以及如何只使用fd寻找关联的socket结构。 这篇文章的大背景,是需要关联fd、socket结构体指针,以便能够在hook系统调用时,通过fd找到对应的五元组信息。但是问题就在于,尝试了众多方法来关联上述的数据,甚至hook了十几个内核函数,希望包围socket的全生命周期,但是最终都出现了意料之外的结果,非常棘手。 ...

2023-08-22

使用eBPF Tracepoint和Kprobe跟踪内核活动

简介 eBPF老生常谈了,这里就不多介绍了,我们直接来看看Tracepoint和Kprobe。 Kprobe是Linux内核中的一个功能,可以实现无感知、动态切入任何内核活动中,并且收集调试和性能信息,一个很典型的使用案例就是切入内核的某个函数中并且获取传入参数和返回值。Kprobe共有两个类型,一个是Kprobe,一个是Kretprobe,他们都被统称为probes,前者用于切入内核函数并且获取传入参数,后者用于切入内核函数并且获取返回值。早期的Kprobe是以内核模块的形式开发,错误的操作会直接导致模块panic,并且可能会影响内核运行的稳定性,而如今,这些代码可以简化成eBPF代码,经过内核的检查才会装入BPF虚拟机中运行,也会限制能够访问的内存、内核函数,这虽然造成了一定的使用不便,但是大幅提高了安全性,也降低了使用难度。 ...

2023-08-21

看看Linux Kernel——基于Macvtap互通问题追溯根源

Linux上遇到一个问题——macvtap的虚拟接口无法和parent互通,这个问题让我不禁感到奇怪。以往都是同一个parent上的macvtap间互访,还真没有留意过访问parent是什么样一个情况。libvirt的wiki告诉我它确实是不能互通的,这或多或少激起了我对macvtap与bridge区别的一个好奇,Google未果,只能沿着Linux的内核代码走一遍了。 ...

2022-03-23

贴贴地气——解决Go语言没有原生RCU一致性原语的问题

众所周知,Go语言里没有原生的RCU一致性原语,这在一些特定场景下,会造成蛮大的性能问题。为了解决这个问题,我们来贴贴地气,在符合适用场景需要的条件下,使用简单粗暴的手段解决问题。 前言 之所以需要RCU,其实是来自于Bridge中FDB(Forwarding Database)场景的一个需要。 ...

2021-12-12

初探DPDK——环境准备与编写第一个简易的NAT程序

博主早期使用Golang+TAP/TUN实现了对数据包L2/L3级别的操作,但是很显然这么做也会有很大的问题——用户程序的数据包发出到TAP/TUN,还要再复制到用户态程序处理,然后通过用户态程序的套接字再从主网卡发出,这样一来既延长了数据路径,又带来了多次的用户态内核态间的数据拷贝,整体上造成的指令数不容小觑。DPDK则可以完全解决这个问题,本篇文章则为对DPDK的一个开端,在完成开发环境准备的同时,博主我稍微修改了l2fwd例程,使得其能够实现一个简易的NAT操作(不能用的那种),感受一下DPDK的魅力~ ...

2021-08-25

libgcc和protobuf编译过程中的问题

libgcc 这阵子在做IceBox的系统时意外遇到一个bug,工具链在交叉编译GCC 5.4.0时报错如下问题 In file included from ../.././libgcc/unwind-dw2.c:401:0: ./md-unwind-support.h: In function 'x86_64_fallback_frame_state': ./md-unwind-support.h:65:47: error: dereferencing pointer to incomplete type 'struct ucontext' sc = (struct sigcontext *) (void *) &uc_->uc_mcontext; ^~ ../.././libgcc/shared-object.mk:14: recipe for target 'unwind-dw2.o' failed make[6]: *** [unwind-dw2.o] Error 1 make[6]: Leaving directory '/home/xuegao/data/openwrt/18061/build_dir/target-x86_64_glibc/gcc-5.4.0/x86_64-openwrt-linux-gnu/libgcc' 百度查了查没有找到什么有用的东西,倒是Google上找到了glibc的wiki上有人开过issue应该,官方在wiki上留下了解决方案 ...

2019-02-16

C语言链表实现图书管理系统

使用链表实现一个小的图书管理系统,要求有基础的增改删查功能 代码存放地址 代码放在了这里1 开发环境及说明 环境 Ubuntu 18 Desktop x64 + GCC 7.3.0 + Code Blocks 说明 源码仅仅为main.c,图书列表为book.txt ,确保两个文件在同一目录下,不然执行会出错(没有写判断是否成功读取) 代码已经经过测试目前没有发现问题,如有发现问题可以给我开issue或者PR blog只阐述core功能方便后期回顾,代码可能会更新,请关注我的GitHub 可能会存在Compiler版本不同出一些奇怪的问题,使用TDM-GCC和低版本GCC编译的话建议升级使用版本号7.0+的MinGW64或者GCC book.txt文件只能按照此处提供的格式修改,否则可能会出错 由于Windows和Linux系统对文字的编码方式不同以及换行符不同,此处的book.txt因为在Linux下所以使用的UTF8编码,直接在Windows中打开可能会中文乱码,具体可以使用Windows下的NotePad++转换成GBK编码 此代码仅供学习参考,不做任何保证 C语言基础 Heap 和 Stack 之区别 以下内容引用自这里2 ...

2018-10-11