驱动程序有什么方法可以检查给定的虚拟地址是否已映射并且可以取消引用?
谢谢。
我假设您在执行一些需要用户空间地址的系统调用时遇到问题。在这种情况下,我们真的不需要检查地址是否有效——事实上,我们需要做相反的事情:防止故障机制参与。
与使用用户提供的指针向/从用户空间传输数据的任何其他函数一样,系统调用检查提供的缓冲区是否是有效地址。在正常操作期间,位于用户地址范围(标准内核配置为 0-3GB)内的地址被认为是有效的,而位于内核地址空间(3GB-4GB)内的地址则无效。
您可以使用宏get_ds
、get_fs
和set_fs
一起定义被认为有效的最高虚拟地址,从而允许您将内核空间地址传递给系统调用。
mm_segment_t fs = get_fs(); /* save previous value */
set_fs (get_ds()); /* use kernel limit */
/* system calls can be invoked */
set_fs(fs); /* restore before returning to user space */
get_fs
首先,我们使用宏保存当前配置。set_fs
宏来设置一个新的上限。
get_ds
宏为内核提供了最大可能的虚拟地址。set_fs
.set_fs
宏将限制返回到之前的配置。重要:确保将限制返回到以前的配置(只有用户空间地址有效);否则,从用户空间传递的无效指针可能会对您的驱动程序造成严重破坏!