【发布时间】: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