天气晴

搭建好的qemu system使用watch ncpus可以快速发现被优化,但这完全是我编译的时候忘记了修改 Makefile 里面的 -O0.
修改完成之后 watchpoint 正在消耗大量时间。

结束 watch 之后,传入 -O0 又有了新的报错。

[root@172 build]# ./gprofng/src/gp-collect-app echo 1
Creating experiment directory test.6.er (Process ID: 354740) ...
echo: symbol lookup error: /usr/local/lib/gprofng/libgp-collector.so: undefined symbol: GET_SP

找到了 GET_SP 的文件。
https://github.com/bminor/binutils-gdb/blob/master/gprofng/libcollector/unwind.c
明日继续研究。

#define _GNU_SOURCE
#include <stdio.h>
#include <sched.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <asm/hwprobe.h>

void main()
{
        int ncpus;
        int npages;
        int page_size;
        struct riscv_hwprobe res;
        res.key = RISCV_HWPROBE_KEY_MVENDORID;
        cpu_set_t cpu_set;
        int __riscv_hwprobe (struct riscv_hwprobe *pairs, long pair_count, long cpu_count, unsigned long *cpus, unsigned long flags)
        {
                return syscall(__NR_riscv_hwprobe, pairs, pair_count, cpu_count, cpus, flags);
        }
        CPU_ZERO(&cpu_set);
        CPU_SET(0, &cpu_set);
        long ret = __riscv_hwprobe(&res, 1, 1, &cpu_set, 0);
        ncpus = sysconf (_SC_NPROCESSORS_CONF);
        npages = sysconf (_SC_PHYS_PAGES);
        page_size = sysconf (_SC_PAGE_SIZE);
        printf("ncpus: %d,\nnpages: %d,\npage_size: %d\n", ncpus, npages, page_size);
        printf("riscv_hwprobe:%x\n", ret);
        printf("riscv_mvendorid:%x\n", res.value);
}

测试出了新内核可以读取 vendorid 和使用最新最热系统调用。
重要的是通过例子看懂了 kernel 文档里面的用法。