天气晴
搭建好的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 文档里面的用法。