计算Linux设备驱动程序中的页数

时间:2018-10-11 22:33:25

标签: c linux-kernel linux-device-driver

我正在研究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不一定在页面边界处开始。

0 个答案:

没有答案