请教大家
两个与 LINUX 地址映射有关的问题,
问题 1:
我们所用的 AT91SAM9260 的寄存器的实际地址是 0xFFF7 8000 .. 0xFFFF FFFF(实地址,Datasheet中), 我看 Linux 的程序中把这个地址映射到 0xFEF7 8000 .. 0xFF00 0000(虚拟地址)。
这样的话 Datasheet上的寄存器地址和程序中使用的地址(虚拟地址)就有个差值,我操作寄存器的时候,得自己去换算一下。
这里, 就有个问题呢,我想的是,要是直接把实地址的 0xFFF7 8000 也映射到 虚地址的 0xFFF7 8000 ,两个值都一样的话,这样我程序里操作寄存器就不用去换算了,就可以直接使用 Datasheet 上所写的地址了。
那他们为什么要映射到 0xFEF7 8000 呢??有什么特殊的原因吗??
程序中的寄存器映射: 我的想法:
实地址 虚地址 实地址 虚地址
差值 0x0100 0000 差值 0x 0
/ \ / \
/ \ / \
/ \ / \
0xFFF7 8000 __ __ 0xFEF7 8000 0xFFF7 8000 __ __ 0xFFF7 8000
. | | . | |
. |=> | . |=> |
. | | . | |
0xFFFF FFFF __| |__ 0xFF00,0000 0xFFFF FFFF __| |__ 0xFFFF FFFF
刚刚想到一个原因,好像在哪里看到过,最顶部的一部分地址 0x xxxx xxxx ... 0xFFFF FFFF linux 内核要使用,是这个原因吗??
问题 2:
另一个问题是,我现在所知道的一个说法是,在内核中才能操作寄存器地址。 在应用程序中不能直接读取寄存器的值(如某个IO口的电平)。
我的理解是,这个权限的控制,无非是在 MMU 初始化时,对这些寄存器的地址的权限做了限制,那如果在 MMU 初始话时,对这些寄存器地址的权限做适当的修改,比如不限制权限的话,那我在应用程序中就可以直接操作这些寄存器,这样不是会很方便吗?? 比如我想读一个 IO 的电平,就不用去修改驱动了。 可以这样吗???
谢谢了先。。
把你的程序做成 基地址+偏移的形式,遇到这种情况就好办了~~~~只要改基地址就OK
ARM处理器在用户模式并不限制访问IO,但地址可以没有映射,所以可能无法访问IO.只要在你的进程中映射了IO地址,就可以访问了....