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.
在内核内部,内存仍然是虚拟映射的,只是与用户空间中的方式不同。
0x10 很可能位于保护页或其他内容中,以捕获空指针,因此当您触摸它时,它会在内核中生成未处理的页面错误。
通常这会导致 OOPS 而不是挂起(但可以将其配置为导致恐慌)。OOPS 是一种意外的内核情况,在某些情况下可以恢复,但不一定会导致整个系统崩溃。通常它会终止任务(在本例中为 insmod)
您是在加载了 GUI 的桌面 Linux 系统上执行此操作的吗?如果您想修改内核,我建议您使用简单(即快速重新启动)的基于文本的发行版设置 Linux VM(Vmware、virtualbox 等)。你会让它崩溃一点,并且你希望它尽快重新启动。此外,通过使用基于文本的发行版,可以更容易地看到内核崩溃消息(哎呀或恐慌)