Ftrace介绍
荣涛 2021年10月19日

文档修改日志

日期 修改内容 修改人 备注
2021年10月19日 创建 荣涛

1. debugfs

默认情况下,debugfs挂载在:

/sys/kernel/debug

当然,你可以重新挂在:

mkdir /debug
sudo mount -t debugfs nodev /debug

2. tracing

2.1. /sys/kernel/debug/

# ls /sys/kernel/debug/
acpi             clk               error_injection     intel_powerclamp  pkg_temp_thermal  sleep_time        usb
asoc             device_component  extfrag             iwlwifi           pmc_core          soundwire         wakeup_sources
bdi              devices_deferred  fault_around_bytes  kprobes           pm_genpd          split_huge_pages  x86
block            dma_buf           frontswap           kvm               pwm               sunrpc            zsmalloc
bluetooth        dmaengine         gpio                mce               ras               suspend_stats     zswap
cec              dma_pools         hid                 mei0              regmap            swiotlb
cleancache       dri               ieee80211           mmc0              sched_debug       thunderbolt
clear_warn_once  dynamic_debug     intel_lpss          pinctrl           sched_features    tracing

2.2. available_tracers

# cat /sys/kernel/debug/tracing/available_tracers
hwlat blk function_graph wakeup_dl wakeup_rt wakeup function nop

2.2.1. function|function_graph

开启函数追踪

echo function > /sys/kernel/debug/tracing/current_tracer
cat /sys/kernel/debug/tracing/trace

关闭函数追踪

echo nop > /sys/kernel/debug/tracing/current_tracer

2.2.2. irqsoff

echo irqsoff > /sys/kernel/debug/tracing/current_tracer
cat /sys/kernel/debug/tracing/trace

我的环境不支持

2.3. tracing_on

关闭函数追踪

echo 0 > /sys/kernel/debug/tracing/tracing_on

2.4. set_ftrace_filter

cat set_ftrace_filter
#### all functions enabled ####
echo schedule > /sys/kernel/debug/tracing/set_ftrace_filter
echo function > /sys/kernel/debug/tracing/current_tracer
cat /sys/kernel/debug/tracing/trace
echo "" > /sys/kernel/debug/tracing/set_ftrace_filter
echo nop > /sys/kernel/debug/tracing/current_tracer

追加

echo schedule_tail >> /sys/kernel/debug/tracing/set_ftrace_filter
cat /sys/kernel/debug/tracing/set_ftrace_filter

可以使用正则表达式:

echo 'sched*' > /sys/kernel/debug/tracing/set_ftrace_filter
cat /sys/kernel/debug/tracing/set_ftrace_filter

2.5. set_ftrace_notrace

清空:

echo > /sys/kernel/debug/tracing/set_ftrace_filter
cat /sys/kernel/debug/tracing/set_ftrace_notrace
#### no functions disabled ####

剔除:

echo '*lock*' > /sys/kernel/debug/tracing/set_ftrace_notrace

3. events

# ls /sys/kernel/debug/tracing/events
alarmtimer        devlink     hda             iomap        mdio     oom             regmap   sunrpc    wbt
asoc              dma_fence   hda_controller  iommu        mei      page_isolation  resctrl  swiotlb   workqueue
block             drm         hda_intel       irq          migrate  pagemap         rpm      syscalls  writeback
bpf_test_run      enable      header_event    irq_matrix   mmc      page_pool       rseq     task      x86_fpu
bpf_trace         exceptions  header_page     irq_vectors  module   percpu          rtc      tcp       xdp
bridge            fib         huge_memory     kmem         msr      power           sched    thermal   xen
cfg80211          fib6        hyperv          kvm          napi     printk          scsi     timer     xfs
cgroup            filelock    i2c             kvmmmu       neigh    qdisc           signal   tlb       xhci-hcd
clk               filemap     i915            kyber        net      random          skb      ucsi
compaction        fs_dax      initcall        libata       netlink  ras             smbus    udp
context_tracking  ftrace      intel_iommu     mac80211     nmi      raw_syscalls    sock     vmscan
cpuhp             gvt         intel-sst       mce          nvme     rcu             spi      vsyscall

events/sched

# ls /sys/kernel/debug/tracing/events/sched/
enable                  sched_pi_setprio    sched_process_wait  sched_stick_numa             sched_wakeup_new
filter                  sched_process_exec  sched_stat_blocked  sched_swap_numa              sched_waking
sched_kthread_stop      sched_process_exit  sched_stat_iowait   sched_switch
sched_kthread_stop_ret  sched_process_fork  sched_stat_runtime  sched_wait_task
sched_migrate_task      sched_process_free  sched_stat_sleep    sched_wake_idle_without_ipi
sched_move_numa         sched_process_hang  sched_stat_wait     sched_wakeup

events/sched/sched_wakeup

# ls /sys/kernel/debug/tracing/events/sched/sched_wakeup
enable  filter  format  hist  id  trigger

3.1. 使能sched_wakeup event

echo nop > /sys/kernel/debug/tracing/current_tracer
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
cat trace

3.2. 使能全部sched events

echo 1 > /sys/kernel/debug/tracing/events/sched/enable

3.3. 使能全部events

echo 1 > /sys/kernel/debug/tracing/events/enable

4. 参考

  • Slice: Ftrace: Latency Tracing, Steven Rostedt
Copyright (C) CESTC Com.

Ftrace原理
荣涛 2021年10月19日

文档修改日志

日期 修改内容 修改人 备注
2021年10月19日 新建 荣涛

1. ftrace原理

asmlinkage __visible void __sched schedule(void)
{struct task_struct *tsk = current;sched_submit_work(tsk);__schedule();
}

反汇编:

<schedule>:55                     push %rbp48 8b 04 25 80 c0 0e   mov 0xffffffff810ec080,%rax8148 89 e5               mov %rsp,%rbp48 8b 00               mov (%rax),%rax5d                     pop %rbpe9 db fa ff ff         jmpq ffffffff810bb100 <__schedule>66 66 2e 0f 1f 84 00   data16 nopw %cs:0x0(%rax,%rax,1)00 00 00 00

添加-pg选项的反汇编

<schedule>:55                     push %rbp48 89 e5               mov %rsp,%rbpe8 37 2e 00 00         callq ffffffff810f7430 <mcount>5d                     pop %rbp48 8b 04 25 80 d0 15   mov 0xffffffff8115d080,%rax8148 8b 00               mov (%rax),%raxe9 96 fa ff ff         jmpq ffffffff810f40a0 <__schedule>66 0f 1f 44 00 00      nopw 0x0(%rax,%rax,1)

简化schedule函数

<schedule>:push %rbpmov %rsp,%rbpcallq <mcount>pop %rbp

调用mcount

<mcount>:retq

1.1. 内核中mcount实现

以内核为例,内核里有源码和脚本scripts/recordmcount。整体步骤如下:

  1. 查找所有调用mcount的位置
  2. 创建table
  3. 链接table到目标文件
  4. 新的section为__mcount_loc
<schedule>:push %rbpmov %rsp,%rbpcallq <mcount>pop %rbp[…]
<preempt_schedule_irq>:push %rbpmov %rsp,%rbppush %rbxcallq <mcount>pop %rbp[…]
<_cond_resched>:push %rbpmov %rsp,%rbppush %rbxcallq <mcount>pop %rbp[…]
<yield>:push %rbpmov %rsp,%rbppush %rbxcallq <mcount>pop %rbp[…]

__mcount_loc表:

<__mcount_loc>:&schedule + 0x4&preempt_schedule_irq + 0x4&_cond_resched + 0x4&yield + 0x4

并把__mcount_loc表加入到对应的目标文件中:

kernel/sched/core.o

<__mcount_loc>:&schedule + 0x4&preempt_schedule_irq + 0x4&_cond_resched + 0x4&yield + 0x4

mm/swap.o:

<__mcount_loc>:&put_page + 0x4&__get_page_tail + 0x4&put_pages_list + 0x4&get_kernel_pages + 0x4

fs/read_write.o

<__mcount_loc>:&new_sync_read + 0x4&vfs_setpos + 0x4&fixed_size_llseek + 0x4&default_llseek + 0x4

在编译vmlinux过程,如下:

然后将所有__mcount_loc表加入vmLinux中:

<__start_mcount_loc>:&schedule + 0x4&preempt_schedule_irq + 0x4&_cond_resched + 0x4&yield + 0x4&put_page + 0x4&__get_page_tail + 0x4&put_pages_list + 0x4&get_kernel_pages + 0x4&new_sync_read + 0x4&vfs_setpos + 0x4&fixed_size_llseek + 0x4&default_llseek + 0x4[...]
<___end_mcount_loc>:

而mcount中实际上都是地址:

<__start_mcount_loc>:0xffffffff810f45f40xffffffff810f46350xffffffff810f46840xffffffff810f47340xffffffff81087ad40xffffffff81087b140xffffffff81087bd50xffffffff81087c410xffffffff810a7aa00xffffffff810a7bd40xffffffff810a7d340xffffffff810a7d7d[...]
<___end_mcount_loc>:

最终的vmlinux为:

<schedule>:push %rbpmov %rsp,%rbpcallq <mcount>pop %rbp[…]
<preempt_schedule_irq>:push %rbpmov %rsp,%rbppush %rbxcallq <mcount>pop %rbp[…]
<_cond_resched>:push %rbpmov %rsp,%rbppush %rbxcallq <mcount>pop %rbp[…]
<yield>:push %rbpmov %rsp,%rbppush %rbxcallq <mcount>pop %rbp[…]
<__start_mcount_loc>:[...]
<___end_mcount_loc>:

1.2. tracing实现

  1. 需要一种方法,可以使能tracing
  2. 抛弃mcount section
  3. mcount section不够用
  4. tracing也需要保存状态

<ftrace_pages>如下

ip = 0xffffffff81087ad4
flags = 0
ip = 0xffffffff81087b14
flags = 0
ip = 0xffffffff81087bd5
flags = 0
ip = 0xffffffff81087c41
flags = 0
ip = 0xffffffff810a7aa0
flags = 0
ip = 0xffffffff810a7bd4
flags = 0
ip = 0xffffffff810a7d34
flags = 0
ip = 0xffffffff810a7d7d
flags = 0
ip = 0xffffffff810f45f4
flags = 0
ip = 0xffffffff810f4635
flags = 0
ip = 0xffffffff810f4684
flags = 0
ip = 0xffffffff810f4734
flags = 0
[…]

上面的选项对应:

# cat available_filter_functions
put_page
__get_page_tail
put_pages_list
get_kernel_pages
new_sync_read
vfs_setpos
fixed_size_llseek
default_llseek
schedule
preempt_schedule_irq
_cond_resched
yield

开启tracing 过滤filter

# echo yield > set_ftrace_filter
# echo schedule >> set_ftrace_filter
# cat set_ftrace_filter
schedule
yield

  • First 29 bits are for counter

    • Every registered callback increments +1
  • bit 29 (starts from zero) – ENABLED
  • bit 30 – REGS
  • bit 31 – REGS_EN

那么ftrace_pagesflags被修改为:

ip = 0xffffffff81087ad4
flags = 0
ip = 0xffffffff81087b14
flags = 0
ip = 0xffffffff81087bd5
flags = 0
ip = 0xffffffff81087c41
flags = 0
ip = 0xffffffff810a7aa0
flags = 0
ip = 0xffffffff810a7bd4
flags = 0
ip = 0xffffffff810a7d34
flags = 0
ip = 0xffffffff810a7d7d
flags = 0
ip = 0xffffffff810f45f4
flags = 0x20000001
ip = 0xffffffff810f4635
flags = 0
ip = 0xffffffff810f4684
flags = 0
ip = 0xffffffff810f4734
flags = 0xa0000001
[…]

那么,vmlinux被修改为:

<schedule>:push %rbpmov %rsp,%rbpcall ftrace_callerpop %rbp[…]
<preempt_schedule_irq>:push %rbpmov %rsp,%rbppush %rbxnoppop %rbp[…]
<_cond_resched>:push %rbpmov %rsp,%rbppush %rbxnoppop %rbp[…]
<yield>:push %rbpmov %rsp,%rbppush %rbxcall ftrace_regs_callerpop %rbp[…]

如下图:

2. 参考

  • Ftrace Kernel Hooks: More than just tracing, Steven Rostedt
Copyright (C) CESTC Com.

Linux Ftrace介绍与原理相关推荐

  1. linux bonding 原理,Linux bonding 之balance-alb 原理介绍及其实现

    Linux bonding 之balance-alb 原理介绍及其实现 要求: 首先要安***onding driver 和 ifenslave.bonding driver 是实现网卡绑定的软件基础 ...

  2. linux tf命令,Linux系统命令介绍之vmstat命令详解

    今天小编要跟大家介绍的vmstat命令详解.熟悉Linux系统和使用Linux系统工作的小伙伴都知道Linux的命令有很多,而真正在工作中用到的命令应该不超过几十个,为了让大家更好的掌握这些命令,小编 ...

  3. Linux 原生异步 IO 原理与使用

    目录 什么是异步 IO? Linux 原生 AIO 原理 Linux 原生 AIO 使用 什么是异步 IO? 异步 IO:当应用程序发起一个 IO 操作后,调用者不能立刻得到结果,而是在内核完成 IO ...

  4. Linux 下 TC 命令原理及详解<一>

    文章目录 1 前言 2 相关概念 3 使用TC 4 创建HTB队列 5 为根队列创建相应的类别 6 为各个类别设置过滤器 7 复杂的实例 Linux 下 TC 命令原理及详解<一> Lin ...

  5. 11款国内外多厂家linux面板介绍(含视频对比)

    在linux服务器运维管理方面linux面板可是举足轻重的地位,因为它具有方便管理服务器的优势,尤其是界面化的操作,适合大部分高中低的用户体验. 这里要介绍的就是现在我用过的国内外的linux面板,介 ...

  6. CNI 网络分析 4.1 Calico 介绍与原理(一)

    文章目录 Calico 介绍与原理(一) 介绍 安装 Calico-node 初始化 Calico-node 服务 Felix confd allocate-tunnel-addrs monitor- ...

  7. Linux 文件系统的工作原理深度透析

    磁盘为系统提供了最基本的持久化存储. 文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构. 那么,磁盘和文件系统是怎么工作的呢?又有哪些指标可以衡量它们的性能呢? 索引节点和目录项 文件系统, ...

  8. linux从接通电源到操作系统启动,第4章-Linux引导过程及原理要点.ppt

    <第4章-Linux引导过程及原理要点.ppt>由会员分享,可在线阅读,更多相关<第4章-Linux引导过程及原理要点.ppt(98页珍藏版)>请在人人文库网上搜索. 1.Li ...

  9. LINUX指令集介绍

    本文是LINUX指令及应用.现在学习嵌入式LINUX的使用,首先我才知道我对指令集的不了解.还是要多补课的呀! 引自:http://jsjzx.cqit.edu.cn/neow/webs/zljj/1 ...

最新文章

  1. 同一服务器上多个版本的 sqlserver ,如何连接,改变某一实例的端口号
  2. Javascript知识——事件
  3. UOJ#244-[UER#7]短路【贪心】
  4. 数据可视化【六】Line Chart Area Chart
  5. 【HDU - 1025】Constructing Roads In JGShining's Kingdom(dp最长上升子序列模型 + 二分优化)
  6. stream of java_java8新特性之强大的Stream API
  7. 链表每k个反转 java_K 个一组翻转链表
  8. C#利用委托实现窗体间的值传递
  9. windows 10 64位安装Python3.6.4
  10. 在中心交换机前加入多wan口路由,华为中心交换机的学习
  11. github中文件夹名带数字,git下来为空文件夹
  12. Kaggle 大师访谈:我的 ML 竞赛之旅
  13. mysql 完整卸载教程_彻底卸载MySQL数据库教程
  14. dage手法之 头部和banner ad tpl_header
  15. php下一页的代码,php 下一页的代码
  16. 怎么用计算机给u盘加密文件,使用u盘给电脑加密如何操作
  17. FastQC软件下载
  18. 《星际争霸2》【技术分析】星际争霸2的一些技术特性
  19. 荣耀8X成为全球首款通过TUV莱茵低蓝光认证的手机
  20. 虚拟机的桥接模式和NAT模式

热门文章

  1. 大话Synchronized及锁升级
  2. Nginx+keepalived 实现高可用,防盗链及动静分离配置详解(值得收藏)
  3. 【2019.09.01】2019南京网络赛
  4. Spring Boot配置文件application.properties
  5. 网络编程基础知识(待更新补充)
  6. Redis 5种数据结构使用及注意事项
  7. centos6.5下的mysql5.6.30安装
  8. 4-3-串的块链存储结构-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版
  9. sqlserver2008安装报错 “Previous releases of Microsoft Visual Studio 2008″ failed.
  10. 飞书上点链接怎么指定跳转浏览器_东半球最接地气的短链接系统设计