我正在研究Linux设备驱动程序,因此我需要弄清楚在给定缓冲区的起始地址和大小的情况下DMA传输涉及多少页。在这种情况下,缓冲区将使用vmalloc()
分配,或者它来自用户空间。无论哪种情况,缓冲区实际上都是(但不是物理上)连续的。
给定缓冲区的起始地址和大小,我编写了一个辅助函数以返回页数。这是我到目前为止的内容:
size_t get_num_pages(uintptr_t start_addr, size_t count) {
uintptr_t start_page, end_page;
start_page = (start_addr & PAGE_MASK) >> PAGE_SHIFT;
end_page = ((start_addr + count - 1) & PAGE_MASK) >> PAGE_SHIFT;
return end_page - start_page + 1;
}
我试图研究内核源代码,但是没有找到一个很好的例子来说明如何执行此操作。有没有一种更简单的方法来计算缓冲区中使用的页面数?请注意,count
可能不是PAGE_SIZE
的偶数,并且start_addr
不一定在页面边界处开始。