对于很长的问题,我深表歉意,但我需要为我的问题提供一些背景信息。
因此,我正在Linux内核中编写记录器,以提取内存特征,例如虚拟地址,页面的物理地址等。
为了进行健全性测试,我执行malloc()
来分配一定数量的页面,然后提取它们的虚拟地址和逻辑地址,以查看分配的总和。我根据该进程的pid进行提取,然后在内核中调用do_brk()
发生之后。
对于较少的页面分配(〜128),它工作得很好并且准确,并且分配的页面数接近我实际分配的数量(+ 2-> 3)。但是,当我分配更多的页面数时(〜256或更多)。然后,它不会记录任何内容。在查看原始日志时,该pid不会显示所做的分配。重复运行后,它确实记录了日志。页数是准确的。
我的理解是,虚拟内存可能在这里发挥了作用,并将其委托给另一个进程(可能是内核)来执行mmap(do_mmap)并将其分配到那里。那么,有人在确定执行此操作的实际过程上有想法吗?
或者另一种可能是printk()
可能无法跟上生成日志的速度。在这种情况下,这可以解释为什么原木吐出几次而其他时候却没有吐出。