linux - 检查虚拟内存地址的有效性

标签 linux linux-kernel linux-device-driver kernel

我正在遍历 VMALLOC_START 和 VMALLOC_END 之间的页面,并且我想要 检查我每次得到的地址是否有效。 我该如何处理这个问题?

我像这样迭代页面:

unsigned long *p;

    for(p = (unsigned long *) VMALLOC_START; p <= (unsigned long *) (VMALLOC_END - PAGE_SIZE); p += PAGE_SIZE)
    {
            //How to check if p is OK to access it?     

    }

谢谢!

最佳答案

最简单的方法是尝试将其红色,并捕获异常。

通过使用内联汇编在 __ex_table 部分中定义一个条目来捕获异常。
异常表条目包含指向存储器访问指令的指针和指向恢复地址的指针。如果该指令发生段错误,EIP 将被设置为恢复地址。

类似这样的东西(我没有测试这个,我可能遗漏了一些东西):

void *ptr=whatever;
int ok=1;
asm(
    "1: mov (%1),%1\n"    // Try to access
    "jmp 3f\n"            // Success - skip error handling
    "2: mov $0,%0\n"      // Error - set ok=0
    "3:\n"                // Jump here on success
    "\n.section __ex_table,\"a\""
    ".long 1b,2b\n"       // Use .quad for 64bit.
    ".prev\n"
    :"=r"(ok) : "r"(ptr)
);

关于linux - 检查虚拟内存地址的有效性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11134813/

相关文章:

linux - 如何更改Linux中特定应用程序的进程ID

linux-kernel - in_irq() 可靠吗?

linux-kernel - cdev 及其关联的文件操作如何工作?

linux - outb() 在 LDD3 示例短模块中不起作用

c - 'readline/readline.h' 文件未找到

linux - 带有 RT Linux(RT-PREEMPT 补丁)的 ZeroMQ 是实时的吗?

python - 单个可执行文件中的 Virtualenv

c - 无效指针类型转换为 pid_t 不正确

c - 如何重新设置 C 代码的样式以从 if 语句条件中排除赋值

Linux 字符类型设备驱动程序,何时进行刷新调用