原创 arm64 下內核 crash—— 非法地址

下面是在實際工作中遇到的一次內核(5.4.110)訪問非法內存地址(空指針)導致出錯的現場,在這裏記錄一下簡單的分析流程爲以後遇到類似的問題作爲參考。 [ 220.619861] Unable to handle kernel NULL

原创 bcc-tools工具之profile

profile是用於追蹤程序執行調用流程的工具,類似於perf中的-g指令 相比perf -g而言,profile功能化更加細分,可以根據需要選擇追蹤層面,例如-U(用戶要調用流程) -K (內核態調用流程) 下面具體介紹該工具的使用 採用

原创 linux tracepoint增加

引入tracepoint的背景 當需要獲取內核的debug信息時,通常你會通過以下printk的方式打印信息: void trace_func() { //…… printk("輸出信息"); //…… } 缺點:

原创 Kernel調試追蹤技術之 Kprobe on ARM64

kprobe是什麼? kprobe 是一種動態調試機制,用於debugging,動態跟蹤,性能分析,動態修改內核行爲等,2004年由IBM發佈,是名爲Dprobes工具集的底層實現機制[1][2],2005年合入Linux kernel。p

原创 BTF:實踐指南

BPF 是 Linux 內核中基於寄存器的虛擬機,可安全、高效和事件驅動的方式執行加載至內核的字節碼。與內核模塊不同,BPF 程序經過驗證以確保它們終止並且不包含任何可能鎖定內核的循環。BPF 程序允許調用的內核函數也受到限制,以確保最大的

原创 /proc/pids/io

rchar:代表自進程啓動以來所讀取的總字符數,包括通過緩存或直接讀取的字符。單位是字節(bytes)。 wchar:代表自進程啓動以來所寫入的總字符數,包括通過緩存或直接寫入的字符。單位是字節(bytes) syscr:代表自

原创 KSM的使用

使能KSM KSM只會處理通過madvise系統調用顯式指定的用戶進程地址空間,因此用戶程序想使用這個功能就必須在分配地址空間時顯式地調用madvise(addr,length,MADV_MERGEA BLE)。如果用戶想在KSM中取消某一

原创 android ion

1. 簡介 Android的ION子系統的目的主要是通過在硬件設備和用戶空間之間分配和共享內存,實現設備之間零拷貝共享內存。說來簡單,其實不易。在Soc硬件中,許多設備可以進行DMA,這些設備可能有不同的能力,以及不同的內存訪問機制。 IO

原创 ARMv8 寄存器

本文主要介紹 Armv8/v9 指令集架構中常用部分,詳細的還是要看 Arm architecture reference manual. ARMv8 架構 ARMv8 架構支持3種指令集: T32, A32, A64 ARMv8 架構有兩

原创 【ARMv8】異常級別的定義EL0、EL1、EL2、EL3

Exception levels ARMv8-A系列定義了一系列的異常等級,從EL0到EL3,下面具體說明其含義: ELn中,隨着n的增加,軟件的執行權限也相應的增加; EL0被稱爲無特權執行; EL2提供了對虛擬化的支持 EL3提供了安

原创 使用BPF之前和之後生成直方圖過程的對比

以bitehist爲例: 使用BPF之前: 1、在內核中:開啓磁盤IO事件的插樁觀測。 2、在內核中,針對每個事件:向perf緩衝區寫入一條記錄。如果使用了跟蹤點技術(推薦方式),記錄中會包含關於磁盤IO的幾個元數據字段。 3、在用戶空間

原创 BPF BTF 詳解

1. 介紹 BTF(BPF Type Format)是內嵌在BPF(Berkeley Packet Filter)程序中的數據結構描述信息。BPF原本是用於數據包過濾的編程語言,但隨着eBPF(extended BPF)的發展,它的用途已經

原创 內核頁表調試

一、配置內核 首先配置內核,使其支持導出內核頁表到debugfs下面: Kernel hacking ---> ---> [*] Export kernel pagetable layout to userspace via debugf

原创 ptmalloc、tcmalloc與jemalloc對比分析

背景介紹 在開發微信看一看期間,爲了進行耗時優化,基礎庫這層按照慣例使用tcmalloc替代glibc標配的ptmalloc做優化,CPU消耗和耗時確實有所降低。但在晚上高峯時期,在CPU剛剛超過50%之後卻出現了指數上升,服務在幾分鐘之內

原创 一篇文章徹底講懂malloc的實現(ptmalloc)

一、前言 C語言提供了動態內存管理功能, 在C語言中, 程序員可以使用 malloc() 和 free() 函數顯式的分配和釋放內存. 關於 malloc() 和free() 函數, C語言標準只是規定了它們需要實現的功能, 而沒有對實現方