一、实现原理机制介绍
内核利用 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) \
{

最低0.47元/天 解锁文章
11万+

被折叠的 条评论
为什么被折叠?



