【问题标题】:accessing physical memory from linux kernel从linux内核访问物理内存
【发布时间】:2011-12-15 04:50:24
【问题描述】:

我们可以通过一些内核代码访问任何物理内存吗?因为,我写了一个只有 init_module 和 exit_module 的设备驱动程序。代码如下。

int init_module(void) {
    unsigned char *p = (unsigned char*)(0x10);
    printk( KERN_INFO  "I got %u \n", *p);
    return 0;
}

还有一个虚拟的 exit_module.. 问题是当我执行 lsmod 时计算机会挂起.. 发生什么了?我应该获得访问内存位置的某种许可吗?

请解释一下..我是初学者!

【问题讨论】:

  • 这是一个非常复杂的编程领域,你不可能在如此有限的空间里得到你需要的答案。您是否阅读过这方面的任何文档?
  • 是的,我知道基础知识.. 问题是我知道我可以访问物理内存作为设备驱动程序。但是为什么我的电脑会死机……毕竟我只是在看书;不写。 ?
  • 地址 0x10 很可能是一个特殊的寄存器,你不能只读。你在这里踏入危险的水域。任意内存访问可能会危害您的健康。
  • 即使内核也无法按照您的想法直接访问物理内存。基本上,您似乎想象的那种内存(具有平面寻址的线性内存)是由内核(从物理内存库)构造并导出的,它不“存在”。要了解这些事情以及如何访问内核可以处理的不同类型的地址,您真的必须更深入地查看内核文档。 (同样,一个不能被 4 整除的值肯定是一个错误的选择,期望得到 unsigned)。
  • 此代码未尝试访问物理内存。它试图访问虚拟内存中的无效(未映射)地址。这是相当糟糕的。 :-)

标签: c linux memory-management linux-kernel kernel


【解决方案1】:

要访问真实的物理内存,您应该使用 phys_to_virt 函数。如果是 io 内存(例如 PCI 内存),您应该仔细查看 ioremap。

整个主题非常复杂,如果您是初学者,我建议您阅读一些内核/驱动程序开发书籍/文档。

【讨论】:

    【解决方案2】:

    我建议阅读本书中关于记忆的章节:

    http://lwn.net/Kernel/LDD3/

    它可以免费在线获得。好东西!

    【讨论】:

      【解决方案3】:

      在内核内部,内存仍然是虚拟映射的,只是方式与用户空间不同。

      很有可能 0x10 位于保护页或其他东西中,以捕获空指针,因此当您触摸它时,它会在内核中生成未处理的页面错误。

      通常这会导致 OOPS 而不是挂起(但可以配置为导致恐慌)。 OOPS 是一种意外的内核状况,在某些情况下可以从中恢复,但不一定会导致整个系统瘫痪。通常它会终止任务(在本例中为 insmod)

      您是否在加载了 GUI 的桌面 Linux 系统上执行此操作?如果您想破解内核,我建议您使用基于文本的简单(即快速重启)发行版设置 Linux VM(Vmware、virtualbox 等)。你会让它崩溃一点,你希望它尽快重启。此外,通过使用基于文本的分发,可以更轻松地查看内核崩溃消息(糟糕或恐慌)

      【讨论】:

        猜你喜欢
        • 2014-04-27
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        • 2020-07-07
        • 2011-05-30
        • 2017-04-26
        • 2015-10-05
        • 2012-05-17
        相关资源
        最近更新 更多