从linux内核访问物理内存

raj*_*raj 10 c linux kernel memory-management linux-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;
}
Run Code Online (Sandbox Code Playgroud)

和一个虚拟的exit_module ..问题是当我做lsmod时计算机挂起..会发生什么?我应该获得访问mem位置的某种许可吗?

请解释..我是初学者!

flo*_*olo 12

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

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


hoc*_*chl 6

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

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

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


Mar*_*rkR 5

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

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

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

您是在加载了 GUI 的桌面 Linux 系统上执行此操作的吗?如果您想修改内核,我建议您使用简单(即快速重新启动)的基于文本的发行版设置 Linux VM(Vmware、virtualbox 等)。你会让它崩溃一点,并且你希望它尽快重新启动。此外,通过使用基于文本的发行版,可以更容易地看到内核崩溃消息(哎呀或恐慌)