从linux内核访问物理内存

时间:2011-10-25 18:38:13

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

我们可以通过一些内核代码访问任何物理内存吗?因为,我写了一个只有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时计算机挂起.. 怎么了?我应该获得访问mem位置的某种许可吗?

请解释..我是初学者!

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:6)

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

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

可在线免费获取。好东西!

答案 2 :(得分:4)

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

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

通常这会导致OOPS不挂起(但可以配置为导致恐慌)。 OOPS是一种意想不到的内核条件,在某些情况下可以恢复,并不一定会导致整个系统崩溃。通常它会杀死任务(在本例中为insmod)

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