【发布时间】:2021-06-04 04:40:40
【问题描述】:
我正在使用get_user_pages_fast,我在用户中分配一个内存缓冲区并在内核空间中创建一个页面。
我应该在使用此内存后释放 struct pages** 吗?还是调用特定的释放函数?
谢谢!
【问题讨论】:
标签: c linux linux-kernel linux-device-driver
我正在使用get_user_pages_fast,我在用户中分配一个内存缓冲区并在内核空间中创建一个页面。
我应该在使用此内存后释放 struct pages** 吗?还是调用特定的释放函数?
谢谢!
【问题讨论】:
标签: c linux linux-kernel linux-device-driver
来自get_user_pages() 上的文档(具有类似的功能,但参数更多,并且需要持有信号量):
返回的每个页面都必须在完成后通过 put_page 调用释放。 vmas 只会在 mmap_sem 被持有时保持有效。
作为一个侧节点,如果你要释放一些东西,它会传递一个struct pages *(释放一个struct pages),而不是struct pages **,因为指向struct pages *的指针被传递给用作返回值。
然而,你通常不应该假设你应该在不知道你应该这样做的情况下释放内核中的任意东西。一般来说,内核提供了创建和销毁您正在使用的任何对象的函数。
通常,当您得到指示时,幕后会发生更多事情。可能有信号量、引用计数等。这也可能是指向内核中“真实”使用对象的指针,而不仅仅是为您制作的某些结构,因此释放它可能会在其他代码段下撕掉地毯形式.
【讨论】:
put_page之前调用set_page_dirty_lock。