我如何判断虚拟内核地址是否有效?

时间:2013-05-09 06:30:28

标签: linux-kernel

驱动程序是否有任何方法可以检查给定的虚拟地址是否已映射并且可以取消引用?

感谢。

1 个答案:

答案 0 :(得分:2)

我假设您在执行一些期望用户空间地址的系统调用时遇到问题。在这种情况下,我们不需要检查地址是否有效 - 事实上,我们需要做相反的事情:防止故障机制参与。

来自Kernel System Calls by Alessandro Rubini

  

与使用a向用户空间传输数据的任何其他函数一样   用户提供的指针,系统调用检查是否提供   缓冲区是否是有效地址。在正常操作期间,一个地址   它位于用户地址范围内(标准内核为0-3GB)   配置)被认为是有效的,并且是一个位于内核中的地址   地址空间(3GB-4GB)不是。

您可以同时使用宏get_dsget_fsset_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 */
  1. 首先,我们使用get_fs宏保存当前配置。
  2. 接下来,我们使用set_fs宏来设置新的上限。
    • get_ds宏为内核提供了最大可能的虚拟地址。
  3. 所有内核地址现在都有效。
    • 此配置会持续到下一个set_fs
    • 调用尽可能多的系统调用,而不用担心通常的用户空间地址检查失败。
  4. 最后,我们使用set_fs宏将限制返回到先前的配置。
  5. 重要:确保将限制返回到先前的配置(只有用户空间地址有效);否则,从用户空间传递的无效指针可能会对您的驱动程序造成严重破坏!