Linux kernel 如何确定虚拟内核地址是否有效?

Linux kernel 如何确定虚拟内核地址是否有效?,linux-kernel,Linux Kernel,驱动程序是否有任何方法可以检查给定的虚拟地址是否已映射并可以取消引用 谢谢。我想您在执行某些需要用户空间地址的系统调用时遇到了问题。在这种情况下,我们真的不需要检查地址是否有效——事实上,我们需要做相反的事情:防止失效机制发生作用 从 与使用 用户提供的指针,系统调用检查是否提供了 缓冲区是否为有效地址。在正常操作过程中,一个地址 这在用户地址范围内(标准内核为0-3GB) 配置)被认为是有效的,并且是位于内核中的地址 地址空间(3GB-4GB)不可用 您可以同时使用宏get_ds、get_fs

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


谢谢。

我想您在执行某些需要用户空间地址的系统调用时遇到了问题。在这种情况下,我们真的不需要检查地址是否有效——事实上,我们需要做相反的事情:防止失效机制发生作用

与使用 用户提供的指针,系统调用检查是否提供了 缓冲区是否为有效地址。在正常操作过程中,一个地址 这在用户地址范围内(标准内核为0-3GB) 配置)被认为是有效的,并且是位于内核中的地址 地址空间(3GB-4GB)不可用

您可以同时使用宏
get_ds
get_fs
set_fs
来定义被认为有效的最高虚拟地址,从而允许您将内核空间地址传递给系统调用

mm_segment_t fs=get_fs();/*保存以前的值*/
set_fs(get_ds());/*使用内核限制*/
/*可以调用系统调用*/
集合_fs(fs);/*在返回到用户空间之前恢复*/
  • 首先,我们使用
    get\u fs
    宏保存当前配置
  • 接下来,我们使用
    set_fs
    宏设置一个新的上限。
    • get_ds
      宏为内核提供最大可能的虚拟地址
  • 所有内核地址现在都有效。
    • 此配置持续到下一次
      设置\u fs
    • 根据您的需要调用任意多个系统调用,而无需担心常规用户空间地址检查失败
  • 最后,我们使用
    set_fs
    宏将限制返回到以前的配置

  • 重要:确保将限制返回到以前的配置(其中只有用户空间地址有效);否则,从用户空间传递的无效指针可能会对驱动程序造成严重破坏

    谢谢你的回答。我发现函数uu virt_addr_有效,它告诉我地址所在的页面是否已映射。