diff --git a/README.md b/README.md index f82dbf1..d7a2944 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ changelog 12.1 一个编译问题,添加说明. 12.5 编译问题补充 12.21 跟进更新,重新部分内容 +12.27 测试工具更新 ``` ## 说明 @@ -246,7 +247,27 @@ usercase 文件夹下 - `userstack.c`: 测试用户态堆栈输出 - `hptest.c`: 测试 hugePage 挂载 -## 其他 +根目录 Dockerfile 文件对应 容器内用户堆栈输出测试. + +```shell +docker build -t userstack-image . +docker run --privileged --device=/d/variable_monitor -v /:/host -it userstack-image +``` + +## Test Tools + +用户空间命令行工具 `ucli` 提供了查看给定 pid / tgid 的 Task 信息的功能. + +```shell +# pid 获取结果为线程对应 Task 信息 +./build/ucli --pid=2048 +# tgid 获取结果为进程下所有线程对应 Task 信息 +./build/ucli --tgid=2048 +``` + +测试工具使用独立缓存区,不会影响 variant_monitor 的输出. + +## 源码说明 程序分为两部分: 字符设备 和 用户空间接口, 两者通过 ioctl 通信. @@ -257,7 +278,7 @@ usercase 文件夹下 定时器分组 - hrTimer 数据结构定义在全局数组 `kernel_wtimer_list`.分配定时器时,会检查遍历 `kernel_wtimer_list` 比较定时器间隔, -- 相同定时间隔的 watch 分配到同一组,对应同一个 hrTimer. +- 属于 **同一个线程** 且 **相同定时间隔** 的 watch 分配到同一组,对应同一个 hrTimer. - 若一个定时器监控变量数量超过 `TIMER_MAX_WATCH_NUM` (32),则会创建一个新的 hrTimer. - hrTimer 的总数量(`kernel_wtimer_list` 数组长度)限制是 `MAX_TIMER_NUM`(128). @@ -266,7 +287,7 @@ usercase 文件夹下 - 一个模块内全局链表 `watch_local_memory_list` 存储每一个成功挂载的变量对应的 page 和 kt,执行字符设备的 close 操作时,遍历并卸载. variable monitor 添加/删除 -- kernel_watch_arg 数据结构中有 pid 的成员变量,但添加变量监控时,不按照进程区分. +- kernel_watch_arg 数据结构中有 pid 的成员变量,但添加变量监控 按照传入的 pid 区分. - 删除时遍历全部监控变量,比较 pid. - 删除造成的缺位,将最后的变量移动到空位, sentinel--; hrTimer 同理. @@ -281,9 +302,4 @@ variable monitor 添加/删除 #define __task_contributes_to_load(task) \ ((READ_ONCE(task->__state) & TASK_UNINTERRUPTIBLE) != 0 && (task->flags & PF_FROZEN) == 0 && \ (READ_ONCE(task->__state) & TASK_NOLOAD) == 0) -``` - -``` -docker build -t userstack-image . -docker run --privileged --device=/d/variable_monitor -v /:/host -it userstack-image ``` \ No newline at end of file