请教,一个AT91SAM9260的实地址虚地址映射问题

wangshujun   2009-7-29 09:59 楼主
请教大家
两个与 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 的电平,就不用去修改驱动了。 可以这样吗???

谢谢了先。。

回复评论 (5)

把你的程序做成 基地址+偏移的形式,遇到这种情况就好办了~~~~只要改基地址就OK
点赞  2009-7-29 11:08
ARM处理器在用户模式并不限制访问IO,但地址可以没有映射,所以可能无法访问IO.只要在你的进程中映射了IO地址,就可以访问了....
点赞  2009-7-29 11:10
感谢回复。
但还是不太明白呢, 继续请教。。。
点赞  2009-7-29 12:43
提示: 作者被禁止或删除 内容自动屏蔽
点赞  2009-7-30 12:43
继续请教,顶顶
点赞  2009-7-31 12:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复