1. TRACE32中实现类container_of功能
假设现在我只知道一个全局变量成员tv2的地址,类型是tvec_base。我想知道这个全局变量的地址怎么办?
struct tvec_base {
spinlock_t lock;
struct timer_list *running_timer;
unsigned long timer_jiffies;
unsigned long next_timer;
struct tvec_root tv1;
struct tvec tv2;
struct tvec tv3;
struct tvec tv4;
struct tvec tv5;
} ____cacheline_aligned;
1.1 计算tv2到结构体头的偏移量:&((struct tvec_base*)0x0)->tv2
可以得出tv2到结构体头的偏移量是0x080C
1.2 已知tv2的地址是0xC065C0CC,此地址减去偏移量就是tvec_bases的地址:(struct tvec_base *)(0xC065C0CC-0x080C)
如下就dump出了tvec_bases这个变量的内容。
2. 将内核变量导出到本地文件,如log_buf
2.1 首先找到Linux内核存放log的变量log_buf地址
2.2 执行data.SAVE.Binary D:\log.bin 0xC064B6AC++0x10000,dump从0xC064B6AC开始大小为0x10000一段内存到D:\log.bin中。
可以使用工具打开D:\log.bin文件。