【open Harmony实战开发】TracePoint Demo实现机制

一、实现原理机制介绍

内核利用 TracePoint 机制实现内核和芯片特性功能解耦,根据 TracePoint 的代码实现来看,其主要原理是在内核代码中插入一个桩点,芯片厂家自己功能代码实现,然后注册到内核中即可,具体的流程可见下图:

1、在内核中定义一个桩点的宏,该宏的展开是产生三个函数:钩子执行函数、钩子注册函数和钩子注销函数

2、芯片厂家需要做的事是在功能实现代码函数中将需要完成的功能写进去,然后调用上一步的钩子注册函数将实现代码函数注册进去,最后将该模块加载到内核中

3、内核在特定的调用点加入插桩函数即步骤一中的钩子执行函数

4、测试用例:想办法调用内核接口函数,验证运行插桩函数是否执行了芯片厂家的功能实现代码的函数

在这里插入图片描述

二、宏定义

宏定义的展开过程

#define DECLARE_TRACE(name, proto, args) \
	__DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
		cpu_online(raw_smp_processor_id()), \
		PARAMS(void *__data, proto))
#define DECLARE_HOOK DECLARE_TRACE
#define PARAMS(args...) args
#define TP_PROTO(args...)   args
#define TP_ARGS(args...)    args

DECLARE_HOOK(vendor_tracepoint_demo,
    TP_PROTO(void *arg), 
    TP_ARGS(arg));
    |||||
    |||||
    |||||
    \|||/
     \|/
      |
__DECLARE_TRACE(vendor_tracepoint_demo, \
    PARAMS(void *arg), \
    PARAMS(arg), \
	cpu_online(raw_smp_processor_id()), \
	PARAMS(void *__data, void *arg))


进一步解析

#define raw_smp_processor_id() (current_thread_info()->cpu) // 获取运行当前线程的CPUID
#define cpu_online(cpu)     cpumask_test_cpu((cpu), cpu_online_mask) // 测试 CPU 掩码中的 CPU
​
#define __DECLARE_TRACE(name, proto, args, cond, data_proto)            \
    extern int __traceiter_##name(data_proto);                          \
    DECLARE_STATIC_CALL(tp_func_##name, __traceiter_##name);            \
    extern struct tracepoint __tracepoint_##name;                       \
    static inline void trace_##name(proto)                              \
    {                                                                   \
        if (static_key_false(&__tracepoint_##name.key))                 \
            __DO_TRACE(name,                                            \
                TP_ARGS(args),                                          \
                TP_CONDITION(cond), 0);                                 \
        if (IS_ENABLED(CONFIG_LOCKDEP) && (cond)) {                     \
            rcu_read_lock_sched_notrace();                              \
            rcu_dereference_sched(__tracepoint_##name.funcs);           \
            rcu_read_unlock_sched_notrace();                            \
        }                                                               \
    }                                                                   \
    __DECLARE_TRACE_RCU(name, PARAMS(proto), PARAMS(args),              \
                PARAMS(cond))                                           \
    static inline int                                                   \
    register_trace_##name(void (*probe)(data_proto), void *data)        \
    {                                                                   \
        return tracepoint_probe_register(&__tracepoint_##name,          \
                        (void *)probe, data);                           \
    }                                                                   \
    static inline int                                                   \
    register_trace_prio_##name(void (*probe)(data_proto), void *data,   \
                   int prio)                                            \
    {                                      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值