驱动程序是否有任何方法可以检查给定的虚拟地址是否已映射并且可以取消引用?
感谢。
答案 0 :(得分:2)
我假设您在执行一些期望用户空间地址的系统调用时遇到问题。在这种情况下,我们不需要检查地址是否有效 - 事实上,我们需要做相反的事情:防止故障机制参与。
来自Kernel System Calls by Alessandro Rubini
与使用a向用户空间传输数据的任何其他函数一样 用户提供的指针,系统调用检查是否提供 缓冲区是否是有效地址。在正常操作期间,一个地址 它位于用户地址范围内(标准内核为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
宏将限制返回到先前的配置。重要:确保将限制返回到先前的配置(只有用户空间地址有效);否则,从用户空间传递的无效指针可能会对您的驱动程序造成严重破坏!