冰块的博客

日拱一卒 不期而至

dma & cma

dma misc knowledge points

没有IOMMU的arm64架构嵌入式设备上,跟了下代码执行流程,记录了一些DMA相关知识点。 有点流水账。 有三种方式分配CMA内存(dts/内核传参/系统默认),CMA预留用的memblock接口,时间点早于DMA初始化时间。 DMA首选从CMA分配,没有的话__get_free_pages动态获取。需要打开配置项CONFIG_DMA_CMA,DMA才可以利用CMA分配内存。 ...

kvm gpa to hva

内存虚拟化之地址转换

映射关系 GVA -> GPA 映射关系 保存在 Guest OS 页表中。 GPA -> HVA 映射关系 保存在 kvm memslot 数组中。 GPA -> HPA 映射关系 保存在 kvm ept 页表中(或者影子页表)。 HVA -> HPA 映射关系 保存在 Host OS 页表中。 相关代码 qemu 进程会准备好可用虚拟内存空间,类似于物理机的内存...

using ebpf in embeded env

嵌入式环境使用ebpf

不借助其它bpf调试工具,开发人员需要自行编写bpf 内核态类C代码和用户态C代码, 内核态代码用于生成字节码,用户态代码负责load并attach字节码到系统 1 借助开源库 libbpf-bootstrap 生成示例demo 先生成libbpf.so,再编译demo程序,最后把应用程序 (比如kprobe)打包进rootfs中 git clone --recursive http...

malloc trigger oom

malloc分配大块内存触发oom

问题描述 一般遇到的OOM,那就是OOM,确实可用内存剩余很少,申请不到触发的。 有一次的OOM,从应用角度看明明还有好几百M,但就是分配失败了触发系统OOM异常。 root:/$ free -m total used free shared buffers cached Mem: 19...

stack memory corruption trigger spinlock lockup

栈内存被写坏触发了系统死锁

死锁异常 产品反馈设备死锁,异常信息如下: [530.486893] BUG: spinlock lockup suspected on CPU#0, prd/22535 [530.557833] Unable to handle kernel paging request at virtual address d280003552829470 [530.652719] pgd = ffff...

async serial port recv data delayed

异步串口收包延迟问题

背景 路由器产品反馈应用程序epoll_wait等着读串口驱动数据出现30ms左右延迟。 业务场景 转报机–(串口码流)–> 路由器 –(UDP/TCP/XXX)–> 路由器 –(串口码流)-> 远端转报机 其实串口驱动收到的码流数据可以在内核态直接从网口转出去,没必要经tty交由上层再打个转。 询问产品,反馈说是历史设计原因,搞得有点复杂,因交付时间原因当下改不动。...

kvm protect guest memory

kvm保护虚拟机内存

简介 per-page memory attributes已经合入主线内核,但是最新qemu还没有利用起来。 heki这个项目没有合入主线内核,但是用到了per-page memory attributes。 刚好可以用来熟悉、了解和调试虚拟化内存页保护。 heki Hypervisor-Enforced Kernel Integrity 基于kvm强化内核完整性 heki 利用 per...

pagecache data corrupted

pagecache页面数据被写坏

简介 产品反馈虚拟机环境,内存配置为8G,升级版本时提示数据校验不过,然后升级失败。 4G内存配置无该问题。host是鲲鹏服务器,kunpeng-920处理器。 同样的虚拟机配置使用其它ubuntu或者centos的系统镜像,虚拟机都没有出现该问题。 定位过程 尝试在虚机设备上升级失败后计算版本文件的MD5值,每次都会变化。 drop_cache之后计算版本文件md5值是正确的,后续计...

spinlock lockup suspected on cpu

一次喂cpld狗触发的死锁

简介 产品反馈系统配置ptp时打印死锁异常,并且每次锁的持有者都不相同。其中一次异常栈如下 这里的锁是cpu 0 的 rq->lock 队列锁。 [ 2269.552599] BUG: spinlock lockup suspected on CPU#1, swapper/1/0 [ 2269.624511] lock: 0xffffffe0fff28500, .magic: dea...

slub calculate order

创建kmem cache时计算page order

简介 slub kmem cache创建过程中需要根据object_size计算分配的page的阶数order。 分配的阶数对性能和其他系统组件会有重要影响。 PAGE_ALLOC_COSTLY_ORDER 是内存分配场合的一个概念, 如果申请的内存 order > PAGE_ALLOC_COSTLY_ORDER时就认为本次分配是昂贵的, order <= PAGE_ALL...