2

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

谢谢。

4

1 回答 1

2

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

来自Alessandro Rubini 的内核系统调用

与使用用户提供的指针向/从用户空间传输数据的任何其他函数一样,系统调用检查提供的缓冲区是否是有效地址。在正常操作期间,位于用户地址范围(标准内核配置为 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宏将限制返回到之前的配置。

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

于 2013-05-09T14:15:49.820 回答