我们可以通过一些内核代码访问任何物理内存吗?因为,我写了一个只有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的位置吗?
请解释一下..我是个初学者!
发布于 2011-10-26 06:38:36
要访问真实的物理内存,您应该使用phys_to_virt函数。如果是io内存(例如PCI内存),您应该仔细查看ioremap。
整个主题非常复杂,如果你是初学者,我建议你阅读一些内核/驱动程序开发书籍/文档。
发布于 2011-10-26 06:42:03
发布于 2011-10-26 14:19:01
在内核内部,内存仍然是虚拟映射的,只是方式与用户空间不同。
很有可能0x10在保护页或其他地方,以捕获空指针,因此当您接触它时,它会在内核中生成一个未处理的页错误。
通常,这会导致OOPS而不是挂起(但可以将其配置为导致死机)。OOPS是一种意外的内核情况,在某些情况下可以恢复,并不一定会导致整个系统崩溃。正常情况下,它会终止任务(在本例中为insmod)
您是在加载了GUI的桌面Linux系统上执行此操作的吗?如果你想解决内核问题,我建议你设置一个Linux虚拟机(Vmware,virtualbox等),使用一个简单的(即快速重启)基于文本的发行版。你会让它崩溃一点,你想让它尽快重启。此外,通过使用基于文本的发行版,更容易看到内核崩溃消息(Oops或panic)
https://stackoverflow.com/questions/7894160
复制相似问题